链载Ai

标题: 通过微调 Embedding 优化 RAG [打印本页]

作者: 链载Ai    时间: 6 小时前
标题: 通过微调 Embedding 优化 RAG

大型语言模型 (LLM) 向用户和组织展示了巨大的潜力;它们的强大功能和生成能力使它们最近广受欢迎并被广泛接受。LLM 面临的一些缺点是无法以上下文感知的方式生成或响应用户给出的提示,听起来非常通用和开放,或者有时响应的信息已经过时。如果正确实施,检索增强生成 (RAG) 已被用于解决这一挑战。


RAG(检索增强生成)最近已成为利用公开可用的 LLM 的最流行方式之一。RAG 提高了 LLM 生成的响应质量,这就是为什么许多组织在其软件系统中实施 LLM 时采用 RAG 的原因。


对能够构建高度优化的 RAG 系统以满足组织需求的专业人员的需求日益增长。根据 Grandview 的研究,去年(2023 年)RAG 市场规模估计为 10.427 亿美元;有预测称,从 2024 年到 2030 年,该领域的复合年增长率将达到 44.7%,这是由于自然语言处理 (NLP) 领域的快速发展以及对智能 AI 系统的需求。


RAG 实施的另一面是 RAG 优化;这是通过使信息检索更准确来提高 RAG 系统性能的过程,从而提高整体性能。在本教程的后面部分,您将学习几种实现此目的的技术。


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.6px;text-wrap: wrap;background-color: rgb(255, 255, 255);">

阅读本文的先决条件




要完全理解这篇技术文章,您应该熟悉 LLM 及其工作原理。您还应该熟悉 Python 编程,因为本文的代码、片段和实现都是用 Python 编写的。


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.6px;text-wrap: wrap;background-color: rgb(255, 255, 255);">

了解 RAG 及其组件




RAG 只是通过引用训练数据之外的外部权威知识库来优化 LLM 生成的输出信息。此权威知识库是包含特定于特定组织或领域的数据的附加信息。


LLM 通常接受大量数据的训练,这使它们能够执行语言翻译和生成问题答案等任务。


RAG 利用 LLM 的生成功能来生成自定义、机构和特定领域的响应。因此,RAG 为公开可用的 LLM 添加了额外的功能。这节省了从头开始构建自定义 LLM 以实现预期目的(例如,为企业构建聊天机器人)所需的大量时间和财务影响。


让我带您了解 RAG 系统的高级工作流程:

  1. 用户从前端界面发出提示

  2. 然后,RAG 模型确保根据收到的提示从权威知识库中检索到正确的信息

  3. 现在,从权威知识库检索到的信息用于由 LLM 生成响应,并发送回客户端


这样,您就会看到提示不会直接进入 LLM,就像没有 RAG 实现那样。尽管如此,仍会从权威知识库中检索与提示语义同步的信息。现在,LLM 的生成功能用于生成用户可以看到、理解和欣赏的响应。


RAG 加上 LLM 等于魔法。



ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.6px;text-wrap: wrap;background-color: rgb(255, 255, 255);">

RAG 的应用





由于其对自然语言处理领域的价值和影响,RAG 已在不同行业和用例中得到广泛采用和适用。甚至非技术人员也开始将 RAG 系统集成到他们的业务中,以提高生产力。


RAG 的一些应用范围从内容创建和摘要到对话代理和聊天机器人。功能性 RAG 系统通常由三个组件组成,它们是:

  1. 检索组件

  2. 增强组件

  3. 生成组件


检索组件


此组件处理从外部权威知识库检索相关信息。它确保检索到的信息或段落与给出的提示最密切相关。可以使用多种机制,包括基于关键字的搜索、语义相似性搜索和基于神经网络的检索方法。


可以根据适合项目的方案实施其中任何一种。


以下代码片段显示了如何在 RAG 系统中从外部知识库进行检索。

importfaiss#ThishandlessimilaritysearchimportnumpyasnpfromtransformersimportAutoTokenizer,AutoModelimporttorch#Apre-trainedembeddingmodel(e.g.,BERT)isloadedmodel_name="sentence-transformers/all-MiniLM-L6-v2"tokenizer=AutoTokenizer.from_pretrained(model_name)model=AutoModel.from_pretrained(model_name)#Functiontoencodetextintoembeddingsdeftext_to_embedding(text):inputs=tokenizer(text,return_tensors="pt",truncation=True,padding=True)withtorch.no_grad():embeddings=model(**inputs).last_hidden_state.mean(dim=1)#Meanpoolingreturnembeddings.cpu().numpy()#Sampledocumentcorpusalsoknownasthe#authoritativeknowledgebase,inthisexampleitisfora#bakeryshopdocuments=["Weareopenfor6daysoftheweek,onMonday,Tuesday,Wednesday,Thursday,Friday,Saturday","TheRAGsystemusesaretrievalcomponenttofetchinformation.","WearelocatedinLagos,ouraddressis456computerLekki-EpeExpressway.","OurCEOisMrAustin,hisphonenumberis09090909090"]#EncodedocumentsandstoreinFAISSindexdimension=384#Setembeddingdimensionbasedon#themodelusedindex=faiss.IndexFlatL2(dimension)#CreateFAISSindex#CreatedocumentembeddingsandaddtoFAISSindexdoc_embeddings=np.vstack([embed_text(doc)fordocindocuments])index.add(doc_embeddings)#QueryGivenitbyauserquery="Whereisthelocationofyourbusiness?"query_embedding=embed_text(query)#Retrievetop2documentsbasedonsimilaritytop_k=2_,indices=index.search(query_embedding,top_k)retrieved_docs=[documents[idx]foridxinindices[0]]print("YourQuery:",query)print("RetrievedDocuments:",retrieved_docs)


上面的代码片段为您提供了实用的信息,并让您更详细地了解 RAG 检索过程的内部工作原理。


发生了三件大事:

  1. 嵌入创建:文档或权威知识库以及传递给它的查询被嵌入。不要太担心“嵌入”的新概念;您将在本文的后面部分详细了解它

  2. 使用 FAISS 进行索引:嵌入的文档存储在 FAISS 索引中,从而实现快速相似性搜索

  3. 检索:根据余弦相似度检索与用户传递的查询最相似的前 k 个文档


增强组件


检索过程成功完成后,增强过程会为检索到的信息添加更多与用户传递的提示相关的上下文含义,使其更加流畅。


生成组件


生成过程确保基于增强信息生成自然语言。它允许人类理解检索到的信息,这可以通过使用 GPT-4、GPT-5、BERTH 等预先训练的 LLM 来实现。


下面的代码片段提供了一个完整的 RAG 管道,展示了使用 Pytorch 的 RAG 系统的检索、增强和生成过程。

from sentence_transformers import SentenceTransformerfrom transformers import T5ForConditionalGeneration, T5Tokenizerimport faissimport torch
# Load Sentence Transformer model for embeddings (using PyTorch)embed_model = SentenceTransformer('all-MiniLM-L6-v2')
# Sample documents for retrievaldocuments = ["We are open for 6 days of the week, on Monday, Tuesday, Wednesday,Thursday, Friday, Saturday","The RAG system uses a retrieval component to fetch information.","We are located in Lagos, our address is 456 computer Lekki-Epe Express way.","Our CEO is Mr. Austin, his phone number is 09090909090"]
# Embed the documentsdoc_embeddings = embed_model.encode(documents)
# Use FAISS for fast similarity searchdimension = doc_embeddings.shape[1]index = faiss.IndexFlatL2(dimension)index.add(doc_embeddings)
# Load T5 model and tokenizer for the generation componenttokenizer = T5Tokenizer.from_pretrained("t5-small")model = T5ForConditionalGeneration.from_pretrained("t5-small")
# Define a queryquery = "How does a RAG system work in machine learning?"
# Retrieve top-k relevant documentsquery_embedding = embed_model.encode([query])top_k = 2_, indices = index.search(query_embedding, top_k)retrieved_docs = [documents[idx] for idx in indices[0]]
# Concatenate retrieved docs to augment the queryaugmented_query = query + " " + " ".join(retrieved_docs)print("Augmented Query:", augmented_query)
# Prepare input for T5 modelinput_text = f"answer_question: {augmented_query}"input_ids = tokenizer.encode(input_text, return_tensors="pt")
# Generate answer using T5with torch.no_grad():output = model.generate(input_ids, max_length=50, num_beams=5, early_stopping=True)answer = tokenizer.decode(output[0], skip_special_tokens=True)
print("Generated Answer:", answer)


什么是 RAG 嵌入




RAG 中的嵌入是文本的密集向量表示;这与将单词表示为高维稀疏向量的独热编码不同;嵌入将这些信息压缩为低维和连续向量,捕获单词之间的语义关系,使模型理解上下文。


因此,嵌入基本上涉及将文本转换为能够理解语义关系的低维向量表示。


您在 RAG 系统中嵌入了什么?您正在嵌入用户传递的提示和要检索的自定义文档/权威领域特定知识。这样做是为了让信息检索在语义上与传递的提示一致。


下一步是在开发 RAG 系统并选择 LLM(例如 GPT-4)时选择检索模型。一些流行的模型是 DPR(密集段落检索器)、Sentence-BERT 和 RoBERTa;这些模型为您处理嵌入。之后,您的自定义文档将被处理和集成以供检索。


因此,您发送提示。检索模型嵌入提示,捕获上下文和语义关系。它从嵌入式数据库中检索最相关的信息。它将其传递给 LLM,LLM 利用其生成能力生成与检索到的数据一致的文本。


优化 RAG 中嵌入的必要性


在 RAG 系统中,嵌入优化在确保从知识源或权威库检索到的信息/数据的质量和相关性方面起着至关重要的作用,就像之前讨论嵌入是什么时所解释的那样;传递给模型的提示被转换为嵌入,这些嵌入在从权威知识库检索之前捕获用户提示的语义含义。


如果嵌入得到适当优化,它们可以通过检索与用户提示非常接近的正确信息来提高模型的整体性能。这就是为什么嵌入优化对 RAG 系统至关重要。


此外,根据 RAG 系统的实现,会使用预先训练的嵌入模型。一些常用的嵌入模型是:


这些预先训练的嵌入模型可以为您处理嵌入(它们将您的提示转换为嵌入或数字表示),但这需要权衡;由于它们是在大型通用数据集中训练的,因此它们可能无法完全理解自定义或域应用程序。这就是为什么您必须微调或优化嵌入模型的原因。



在 RAG 中嵌入调优的技术




有多种方法可以实现嵌入调整;下面是一些实现嵌入调整的流行技术;


1. 通过适应领域

专门针对特定领域或主题进行调整的嵌入可以产生很大的不同。例如,在相关数据上训练嵌入可以使 RAG 模型在法律或医疗保健等领域更加精确,因为这些领域的语言具有独特的术语和细微差别。这样,当用户提问时,他们会得到与上下文产生共鸣的答案。


2. 使用对比学习

将对比学习视为帮助模型“磨练”相似和不相似的内容。通过教导模型将相关的查询和答案更紧密地分组在一起(并将不相关的查询和答案分开),您可以让模型更容易返回对所提问题有意义的结果。


3. 添加来自真实数据的信号

添加一些监督数据(如用户反馈或标记示例)可以使嵌入更接近人们的期望。这有助于引导模型找到重要的模式,例如识别哪些响应往往会达到目标,哪些不会。模型从真实用户交互中学习得越多,它就越能提供有用的响应。


4. 自监督学习

自监督学习是处理标记数据较少的情况的绝佳选择。此方法在数据本身中发现模式,这有助于为模型构建基础,而无需进行太多手动标记。它非常适合需要保持灵活性的通用 RAG 系统。


5. 结合嵌入以获得更丰富的响应

有时,混合多个嵌入会产生奇效。例如,将通用嵌入与针对特定领域进行微调的嵌入相结合可以创建一个全面的模型,该模型可以理解一般和小众问题。如果您要处理广泛的主题,这种方法尤其有用。


6. 保持嵌入平衡

正则化技术(如 dropout 或 triplet loss)可帮助模型避免“卡”在某些单词或想法上,使其理解范围足够广泛,以处理不同的查询。这可确保模型的响应范围不会太窄,从而有助于其保持对新问题或意外问题的灵活性。


7. 用硬否定挑战模型

硬否定足够接近,但仍然不正确。在训练中添加这些可以鼓励模型完善其理解,尤其是在处理细微差异时。这就像给它所需的心理重复,以便更好地在几乎正确的选项中找到正确答案。


8. 使用反馈循环进行持续改进

通过主动学习,您可以设置一个反馈循环,其中将不确定或具有挑战性的答案标记为人工审核。这些评论反馈到模型中,以随着时间的推移不断提高其准确性,这对于不断发展或具有许多复杂细微差别的领域非常有用。


9. 通过跨编码器调优进行更深入的研究

对于更细微的查询(尤其是需要问题和答案紧密匹配的查询),跨编码器方法可以提供帮助。跨编码器直接评估查询和文档对,因此模型会将它们一起“读取”,而不是将它们视为单独的实体。这通常会在精确匹配是关键的领域带来更深入的理解。


通过这种方式对嵌入进行微调,RAG 模型可以提供更自然、更切题的响应。简而言之,就是要让 AI 成为更好的倾听者和响应者,为用户提供切中要害的答案。


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.6px;text-wrap: wrap;background-color: rgb(255, 255, 255);">

评估 RAG 嵌入质量的方法




评估 RAG 系统嵌入的质量至关重要,因为它可以作为一个指标,表明它是否可以检索相关且上下文正确的数据,无论是否经过优化。


下面列出了用于评估 RAG 中嵌入质量的方法:


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.6px;background-color: rgb(255, 255, 255);">

嵌入 RAG 调优的挑战




尽管嵌入调整会对 RAG 系统的性能产生巨大影响,但有时实施起来非常具有挑战性。它不是直接的,有时需要迭代才能达到所需的性能。


其中一些挑战包括:


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.6px;background-color: rgb(255, 255, 255);">

写在最后的话




在开发需要高精度的系统时,RAG 优化至关重要,因为用于开发 RAG 系统的嵌入模型主要用于通用应用程序。嵌入调整对于提高 RAG 系统的检索精度以获得更好的性能是必要的。


在开发 RAG 模型时实施上述任何一种检索技术后,正确的做法是测试新开发的 RAG 模型的性能,以了解它对传递给它的某些提示的响应程度;如果它表现得非常好;满足您的期望和要求,那对您来说很好,您在开发 RAG 系统方面做得很好。如果在向它传递某些提示时它没有给您所需的响应,请不要担心;您仍然可以通过进一步优化和微调来提高模型的性能。谢谢阅读。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5