大模型应用中提升 RAG 检索增强生成能力的实践方法
RAG(检索增强生成)通过引入外部知识库减少大模型幻觉。分析检索阶段的质量低、覆盖不足及生成阶段的幻觉、可解释性差等痛点,提出微调检索器、优化分块策略、重排序及可信度指标等解决方案,并介绍真实性、相关性等评价指标,旨在提升大模型应用的准确性与可靠性。

RAG(检索增强生成)通过引入外部知识库减少大模型幻觉。分析检索阶段的质量低、覆盖不足及生成阶段的幻觉、可解释性差等痛点,提出微调检索器、优化分块策略、重排序及可信度指标等解决方案,并介绍真实性、相关性等评价指标,旨在提升大模型应用的准确性与可靠性。

RAG(Retrieval-Augmented Generation,检索增强生成)简单来说就是给予大语言模型(LLM)的一些增强。它通过引入新的信息来补充 LLM 的知识库,这些信息可能不在 LLM 的预训练数据中。
使用 RAG 控制内容来减少幻觉(模型生成与现实不符的输出),这是 RAG 的一个常见用途。通常的用例是提供内容给模型,并指示它仅使用该内容来回答问题,不使用 LLM 自有的知识,以此限制回答来自特定的知识库,减少幻觉。
简单来说,RAG 主要是由检索和生成两个阶段组成:
基于 RAG 的提升方法也是从这两个极端来实现,接下来会用更简单通俗的方法讲解一下 RAG 存在的痛点和解决方法。
RAG 模型严重依赖于检索到的上下文文档的质量。如果检索器无法找到相关的事实段落,就会严重妨碍模型根据有用信息并产生准确、深入的响应的能力。
特别是现在,稀疏向量检索在语义匹配和检索高质量文档存在困难。
解决方案:
虽然外部知识对于高质量的 RAG 输出是必不可少的,但即使是最大的语料库也无法完全覆盖用户可能查询的实体和概念。如果无法访问全面的知识源,该模型就会返回对利基或新兴主题的无知、通用的响应。
解决方案:
即使具有良好的检索能力,RAG 模型也常常难以正确地调节上下文文档并将外部知识合并到生成的文本中。如果没有有效的情境调节,就无法产生具体的、真实的反应。
解决方案:
对于新增加的文档而言,RAG 模型确定所需要检索的内容并用于生成是十分困难的,特别是针对长内容的处理。这就需要针对新增加的信息进行清洗和划分。
解决方案:
在检索源数据时候,需要有效的方法给检索的数据进行排名,找到最想相关的数据才能更好的得到内容。
解决方案:
由于过度依赖语言模型先验,RAG 模型经常生成看似合理但完全错误或不忠实的语句,而没有在检索到的上下文中进行验证。
解决方案:
与传统的 QA 系统不同,RAG 模型无法了解生成文本背后的推理。模型的可解释性仍然是含蓄和不透明的,而不是明确的。
解决方案:
检索与生成的耦合阻碍了 RAG 模型与标准语言模型的延迟匹配。推理管道缺乏对需要毫秒响应的实时应用程序的优化。
解决方案:
在通用语料库上训练的 RAG 模型缺乏针对特定用户需求、上下文和查询生成响应的能力。如果没有个人理解,他们无法解决模棱两可的信息请求。
解决方案:
在 RAG 架构中会存在以下评价指标:
为了更直观地展示 RAG 的实现流程,以下是一个基于 Python 和 LangChain 的基础 RAG 实现示例:
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import HuggingFacePipeline
# 1. 加载文档
loader = TextLoader("./data/document.txt")
documents = loader.load()
# 2. 文本分块
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(documents)
# 3. 创建向量存储
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = FAISS.from_documents(splits, embeddings)
# 4. 初始化检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# 5. 定义 LLM 和 QA 链
llm = HuggingFacePipeline.from_model_id(
model_id="mistralai/Mistral-7B-Instruct-v0.1",
task_text_generation,
pipeline_kwargs={"max_new_tokens": 512}
)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
# 6. 执行查询
query = "What is the main topic of this document?"
result = qa_chain({"query": query})
print(result["result"])
RAG 是一种很有前途的提高 LLM 准确性和可靠性的方法,具有事实依据、减少偏见和降低维护成本等优点。虽然未知识别和检索优化等领域仍然存在挑战,但正在进行的研究正在突破 RAG 功能的界限,并为更值得信赖和信息丰富的 LLM 应用铺平道路。通过优化检索策略、增强生成可控性以及建立完善的评估体系,开发者可以显著提升 RAG 系统的实际表现。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online