>像GPT-4这样的大多数大型语言模型(LLMS)经过广泛的,通常过时的数据集培训。尽管他们擅长回答一般问题,但他们在疑问最近的新闻,最新发展和特定领域的主题方面挣扎。在这种情况下,它们可能会幻觉或提供不准确的反应。
尽管出现了诸如Claude 3.5十四行诗之类的表现更好的模型,但我们仍然需要进行微调来生成自定义响应,或者使用检索结果(RAG)系统来为基本模型提供额外的背景。 在本教程中,我们将探索抹布和微调,这是两种不同的技术,用于改善LLM响应。我们将检查它们的差异,并通过评估结果将理论付诸实践。此外,我们还将深入研究混合技术,将微调模型与抹布系统相结合,以利用两全其美的世界。最后,我们将学习如何根据特定用例和要求在这三种方法之间进行选择。
抹布和微调概述
>检索增强生成(抹布)
要了解更多信息,请阅读我们的文章,什么是检索增强发电(RAG)?基础知识的指南,并了解RAG应用程序的内部工作和各种用例。
微调是使用特定域数据集对预训练模型进行调整的过程。预先训练的模型在从互联网上废弃的多个大型一般数据集上进行了培训。他们擅长回答一般问题,但是在回答特定领域的问题时,他们会挣扎甚至幻觉。
例如,预先训练的模型可能会精通一般的对话能力,但是当被问及复杂的医疗程序或法律先例时可能会产生错误的答案。
在医疗或法律数据集上对其进行微调,使该模型能够以更准确和相关性理解和回答这些领域的问题。>我们已经了解了每种方法来改善LLMS的响应生成。让我们检查一下以更好地理解它们的差异。
>微调涉及静态学习,该模型在训练阶段通过新数据集学习。尽管此方法允许该模型适应特定于域的响应生成,但如果不重新培训,它就无法在培训后整合新信息。
2。适应性
3。资源强度
rag是资源密集型的,因为它是在模型推断期间执行的。与没有抹布的简单LLM相比,RAG需要更多的内存和计算。
4。费用
> 在培训过程中,微调只能花费您一次,但是在那之后,您将为模型推理付费,这比RAG便宜。
如果考虑到一切,总体而言,总体而言,平均而言,微调成本比抹布高。
微调模型需要高技术专业知识。从准备数据集到设置调谐参数,再到监视模型性能,需要在自然语言处理领域的多年经验。
>让我们通过为微调模型,抹布应用和混合方法提供相同的提示来测试我们的理论,然后评估结果。混合方法将将微调模型与RAG应用程序相结合。在此示例中,我们将通过拥抱面孔使用Ruslanmv/Ai-Medical-Medical-Chatbot数据集,该数据集包含患者与医生之间有关各种健康状况的对话。
>使用Llama 3>您还可以学习使用LlamainDex构建抹布应用程序,然后遵循该代码,与llamaindex的检索增强生成。
1。安装所有必要的python软件包。
%%capture %pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
from langchain.document_loaders import HuggingFaceDatasetLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline from langchain_huggingface import HuggingFacePipeline from langchain.chains import RetrievalQA
from huggingface_hub import login from kaggle_secrets import UserSecretsClient user_secrets = UserSecretsClient() hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN") login(token = hf_token)
5。将我们的数据集限制为第一个1000行。减少数据集将有助于我们减少矢量数据库中的数据存储时间。
正如我们所看到的,“医生”列是页面内容,其余的被视为元数据。
# Specify the dataset name dataset_name = "ruslanmv/ai-medical-chatbot" # Create a loader instance using dataset columns loader_doctor = HuggingFaceDatasetLoader(dataset_name,"Doctor") # Load the data doctor_data = loader_doctor.load() # Select the first 1000 entries doctor_data = doctor_data[:1000] doctor_data[:2]
6。使用特定参数(例如启用GPU加速度)加载嵌入模型。
7。通过提供示例文本来测试嵌入模型。
# Define the path to the embedding model modelPath = "sentence-transformers/all-MiniLM-L12-v2" # GPU acceleration model_kwargs = {'device':'cuda'} # Create a dictionary with encoding options encode_kwargs = {'normalize_embeddings': False} # Initialize an instance of HuggingFaceEmbeddings with the specified parameters embeddings = HuggingFaceEmbeddings( model_name=modelPath, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs ) text = "Why are you a doctor?" query_result = embeddings.embed_query(text) query_result[:3]
[-0.059351932257413864, 0.08008933067321777, 0.040729623287916183]
9。将矢量数据库保存在本地目录中。
10。使用示例提示进行相似性搜索。
vector_db = FAISS.from_documents(doctor_data, embeddings) vector_db.save_local("/kaggle/working/faiss_doctor_index") question = "Hi Doctor, I have a headache, help me." searchDocs = vector_db.similarity_search(question) print(searchDocs[0].page_content)
11。将矢量数据库实例转换为回收器。这将有助于我们创建抹布链。
12。使用Llama 3 8B聊天型号加载令牌和模型。
retriever = vector_db.as_retriever()
13。使用它们来创建测试生成管道。
14。将管道转换为Langchain LLM客户端。
15。使用猎犬,用户查询,RAG提示和LLM创建一个问答链。
import torch base_model = "/kaggle/input/llama-3/transformers/8b-chat-hf/1" tokenizer = AutoTokenizer.from_pretrained(base_model) model = AutoModelForCausalLM.from_pretrained( base_model, return_dict=True, low_cpu_mem_usage=True, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True, ) pipe = pipeline( "text-generation", model=model, tokenizer=tokenizer, max_new_tokens=120 ) llm = HuggingFacePipeline(pipeline=pipe)
16。通过向医生提出问题来测试问答链。
from langchain import hub from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough rag_prompt = hub.pull("rlm/rag-prompt") qa_chain = ( {"context": retriever, "question": RunnablePassthrough()} | rag_prompt | llm | StrOutputParser() )
>它与数据集非常相似,但是它不会拾取样式。它已经理解了上下文,并用它以自己的风格编写响应。
question = "Hi Doctor, I have a headache, help me." result = qa_chain.invoke(question) print(result.split("Answer: ")[1])
>让我们再试一次问题。
%%capture %pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
这是一个非常直接的答案。也许我们需要微调模型,而不是为医生和患者聊天机器人使用抹布方法。
如果您遇到运行代码的困难,请咨询Kaggle笔记本:使用Llama 3构建RAG应用程序。
通过遵循如何改善抹布性能来改善诸如块,重读和查询转换等技术的技术:5个与示例的示例教程。
>医学数据的微调骆驼3>
如果您有兴趣使用OpenAI API微调GPT-4型号,则可以参考易于遵循的DataCamp教程Fine-Tuning OpenAI的GPT-4:逐步指南。
来源:kingabzpro/llama-3-8b-chat-doctor
1。使用变压器库加载令牌和模型。
2。确保使用正确的参数将模型加载到Kaggle GPU T4 X2环境中。
3。将聊天模板应用于消息。
from langchain.document_loaders import HuggingFaceDatasetLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline from langchain_huggingface import HuggingFacePipeline from langchain.chains import RetrievalQA
4。使用模型和代币器创建文本生成管道。
5。向管道对象提供提示并生成响应。
响应与数据集非常相似。样式是相同的,但没有给出直接答案,而是表明患者接受了进一步的测试。
from huggingface_hub import login from kaggle_secrets import UserSecretsClient user_secrets = UserSecretsClient() hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN") login(token = hf_token)
6。让我们问第二个问题。
样式是相同的,并且反应是同理心和解释性的。
# Specify the dataset name dataset_name = "ruslanmv/ai-medical-chatbot" # Create a loader instance using dataset columns loader_doctor = HuggingFaceDatasetLoader(dataset_name,"Doctor") # Load the data doctor_data = loader_doctor.load() # Select the first 1000 entries doctor_data = doctor_data[:1000] doctor_data[:2]
如果您遇到运行代码的困难,请咨询Kaggle笔记本:微调Llama 3 HF推断。
>现在,我们将为微调模型提供额外的上下文,以进一步调整响应并找到平衡。
>而不是再次编写所有代码,我们将使用问答链直接潜入响应生成。如果您想查看我们如何将微调型号与抹布Q&A链组合在一起的完整代码,请查看混合方法(抹布微调)Kaggle Notebook。
为链条提供了与我们提出的抹布和微调模型相同的问题。
%%capture %pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
答案非常准确,并且以医生的方式产生了反应。
让我们问第二个问题。
>from langchain.document_loaders import HuggingFaceDatasetLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline from langchain_huggingface import HuggingFacePipeline from langchain.chains import RetrievalQA
这很奇怪。我们从未提供有关痤疮是否充满脓液的其他背景。也许混合模型不适用于某些查询。
>
混合方法的官方术语是筏(检索增强的微调)。通过阅读什么是筏子,了解有关它的更多信息?将抹布和微调结合起来,以使LLM适应专用域博客。>如何在抹布与微调与筏
之间进行选择您是一家中级公司,想微调以提高响应准确性并在云上部署开源模型,则需要聘请数据科学家和机器学习操作工程师等专家。微调需要一流的GPU,大型内存,清洁的数据集和了解LLM的技术团队。
rag |
| 微调
| 木筏
|
>上下文理解,最小化幻觉,很容易适应新数据,成本效益。 |
特定于任务的专业知识,自定义,增强的精度,提高了鲁棒性。 |
结合了抹布和微调的优势,更深入的理解和背景。
|
|
缺点
| 数据源管理,复杂性。
| 数据偏见,资源密集,高计算成本,大量内存需求,时间和专业知识密集。
| 实施中的复杂性,需要平衡检索和微调过程。>
|
实现复杂度
| 高于及时工程。
| 高于抹布。需要高度技术专家。
| 这三个中最复杂的。
|
学习样式
| >动态
| >静态
| >动态静态
|
Adaptability
| 很容易适应新的数据并不断发展的事实。
>将输出自定义为特定的任务和域。 | >
适应实时数据和特定任务。 | >
|
|
中等 |
高 |
|
低。推理期间使用资源。 |
中等。在微调过程中使用资源。 |
高 |
| 结论
以上是抹布与微调:一个全面的教程,带有实际示例的详细内容。更多信息请关注PHP中文网其他相关文章!