首页 > 科技周边 > 人工智能 > 抹布与微调:一个全面的教程,带有实际示例

抹布与微调:一个全面的教程,带有实际示例

Joseph Gordon-Levitt
发布: 2025-03-05 11:31:10
原创
119 人浏览过

>像GPT-4这样的大多数大型语言模型(LLMS)经过广泛的,通常过时的数据集培训。尽管他们擅长回答一般问题,但他们在疑问最近的新闻,最新发展和特定领域的主题方面挣扎。在这种情况下,它们可能会幻觉或提供不准确的反应。 

尽管出现了诸如Claude 3.5十四行诗之类的表现更好的模型,但我们仍然需要进行微调来生成自定义响应,或者使用检索结果(RAG)系统来为基本模型提供额外的背景。 在本教程中,我们将探索抹布和微调,这是两种不同的技术,用于改善LLM响应。我们将检查它们的差异,并通过评估结果将理论付诸实践。 

此外,我们还将深入研究混合技术,将微调模型与抹布系统相结合,以利用两全其美的世界。最后,我们将学习如何根据特定用例和要求在这三种方法之间进行选择。

抹布和微调

概述 抹布和微调技术改善了域特异性查询的响应生成,但它们本质上是完全不同的技术。让我们了解它们。

>检索增强生成(抹布)

>检索增强的生成是一个使用外部数据源(例如GPT-4O)成为上下文感知的大型语言模型的过程。它是猎犬和发电机的组合。猎犬从Internet或Vector数据库中获取数据,并使用原始用户的查询将其提供给生成器。发电机使用其他上下文来生成高度准确且相关的响应。  

要了解更多信息,请阅读我们的文章,什么是检索增强发电(RAG)?基础知识的指南,并了解RAG应用程序的内部工作和各种用例。 

微调

微调是使用特定域数据集对预训练模型进行调整的过程。预先训练的模型在从互联网上废弃的多个大型一般数据集上进行了培训。他们擅长回答一般问题,但是在回答特定领域的问题时,他们会挣扎甚至幻觉。 

例如,

预先训练的模型可能会精通一般的对话能力,但是当被问及复杂的医疗程序或法律先例时可能会产生错误的答案。 

在医疗或法律数据集上对其进行微调,使该模型能够以更准确和相关性理解和回答这些领域的问题。

遵循微调LLMS教程的介绍性指南,以了解使用视觉指南自定义预训练的模型。 

rag vs.微调

>我们已经了解了每种方法来改善LLMS的响应生成。让我们检查一下以更好地理解它们的差异。 

1。学习样式

rag使用动态学习样式,允许语言模型访问和使用来自数据库,Internet甚至API的最新和最准确的数据。这种方法可确保生成的响应始终是最新和相关的。

>微调涉及静态学习,该模型在训练阶段通过新数据集学习。尽管此方法允许该模型适应特定于域的响应生成,但如果不重新培训,它就无法在培训后整合新信息。

2。适应性

抹布最适合概括。它使用检索过程从不同的数据源中获取信息。抹布不会改变模型的响应;它只是提供了指导模型的额外信息。 

微调可以自定义模型输出,并改善与培训数据集紧密相关的特殊域上的模型性能。它还改变了响应的风格,有时比抹布系统提供更多相关的答案。 

3。资源强度

rag是资源密集型的,因为它是在模型推断期间执行的。与没有抹布的简单LLM相比,RAG需要更多的内存和计算。 

>微调是计算密集型的,但一次执行一次。在培训过程中,它需要多个GPU和高内存,但是此后,与RAG系统相比,它非常适合资源友好。 

4。费用

抹布需要顶级的嵌入模型和LLM,以更好地生成响应。它还需要一个快速的向量数据库。 API和操作成本可能很快上升。

> 在培训过程中,微调只能花费您一次,但是在那之后,您将为模型推理付费,这比RAG便宜。   

如果考虑到一切,总体而言,总体而言,平均而言,微调成本比抹布高。 

5。实施复杂性

抹布系统可以由软件工程师构建,需要中等技术专长。您需要了解LLM设计,矢量数据库,嵌入,及时的工程师等,这确实需要时间,但在一个月内易于学习。 

微调模型需要高技术专业知识。从准备数据集到设置调谐参数,再到监视模型性能,需要在自然语言处理领域的多年经验。 

将理论与实际示例进行测试

>让我们通过为微调模型,抹布应用和混合方法提供相同的提示来测试我们的理论,然后评估结果。混合方法将将微调模型与RAG应用程序相结合。在此示例中,我们将通过拥抱面孔使用Ruslanmv/Ai-Medical-Medical-Chatbot数据集,该数据集包含患者与医生之间有关各种健康状况的对话。

>使用Llama 3

构建抹布应用程序

我们将使用Llama 3和Langchain生态系统构建RAG应用程序。 

>您还可以学习使用LlamainDex构建抹布应用程序,然后遵循该代码,与llamaindex的检索增强生成。

1。安装所有必要的python软件包。

%%capture
%pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate
登录后复制
登录后复制
登录后复制
2。从Langchain和Transformers库中加载必要的功能。

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
登录后复制
登录后复制
登录后复制
3。为了访问受限制的模型和数据集,建议您使用API​​键登录到拥抱面线。

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)
登录后复制
登录后复制
4。通过将数据集名称和列名提供给HuggingFacedatAsetLoader加载数据集。 “医生”列将是我们的主要文件,其余的列将是元数据。 

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]
登录后复制
8。将数据转换为嵌入,并将其保存到矢量数据库中。
[-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

>我们不会在医生和患者数据集上微调模型,因为我们已经在上一个教程中这样做了:微调Llama 3并在本地使用它:逐步指南。我们要做的就是加载微调模型,并为其提供相同的问题来评估结果。在拥抱的脸和kaggle上可以使用微调模型。

>

如果您有兴趣使用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适应专用域博客。

>如何在抹布与微调与筏

之间进行选择

>这一切都取决于您的用例和可用资源。如果您是资源有限的初创公司,请尝试使用打开的AI API和Langchain框架来构建抹布概念证明。为此,您将需要有限的资源,专业知识和数据集。 

您是一家中级公司,想微调以提高响应准确性并在云上部署开源模型,则需要聘请数据科学家和机器学习操作工程师等专家。微调需要一流的GPU,大型内存,清洁的数据集和了解LLM的技术团队。 

请参阅下表以获取抹布,微调和筏解决方案的概述。

> rag 微调木筏优势数据源管理,复杂性。数据偏见,资源密集,高计算成本,大量内存需求,时间和专业知识密集。实施中的复杂性,需要平衡检索和微调过程。高于及时工程。高于抹布。需要高度技术专家。这三个中最复杂的。>动态>静态>动态静态很容易适应新的数据并不断发展的事实。 > > 成本资源强度结论大型语言模型是当今AI发展的核心。公司正在寻找各种方法来改进和自定义这些模型,而无需花费数百万美元的培训。它们从参数优化和及时工程开始。他们要么选择抹布或微调模型以获得更好的响应并减少幻觉。虽然还有其他技术可以改善响应,但这些是最受欢迎的选择。 在本教程中,我们通过理论和实际例子了解了抹布和微调之间的差异。我们还探索了混合模型,并比较了哪种方法可能最适合您。

>上下文理解,最小化幻觉,很容易适应新数据,成本效益。

特定于任务的专业知识,自定义,增强的精度,提高了鲁棒性。

结合了抹布和微调的优势,更深入的理解和背景。

缺点

>

实现复杂度

学习样式

Adaptability

>将输出自定义为特定的任务和域。

适应实时数据和特定任务。

中等

低。推理期间使用资源。 

中等。在微调过程中使用资源。 

>

要了解有关部署LLM和所涉及的各种技术的更多信息,请查看与LlamainDex的抹布有关的代码,以及我们与Langchain部署LLM应用程序的课程。

以上是抹布与微调:一个全面的教程,带有实际示例的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板