RAG是什么?如何设计一个RAG系统?
目录
一、 我们为什么需要RAG?
目前最强大的大语言模型(LLM),比如GPT-4,本质上是一个“超级猜字模型”。它在海量数据中学会了语法、逻辑和知识,但它有几个致命的弱点:
-
幻觉问题:遇到不懂的问题,它不是老实说“不知道”,而是会编造一个看似合理但错误的答案。
-
知识陈旧:它的知识停留在训练数据截止的那个时间点。你问它最新的新闻或公司内部政策,它只能一脸茫然。
-
来源不可查:你不知道它给出的答案是从哪篇文档、哪段话里来的,这在企业、医疗、金融等严肃场景下是不可接受的。
-
数据安全:你无法把自己的私有文档(比如财报、病历)喂给公用的GPT模型,这涉及到数据泄露的风险。
为了解决这些问题,RAG技术应运而生。
二、 RAG究竟是什么?
想象一下,你正在经历一场考试。
-
普通的大模型:像一个闭卷考试的考生。它只能依靠自己大脑里(模型参数)记住的知识来回答问题。如果考试内容超纲(知识陈旧)或者它记错了(幻觉),就容易答错。
-
RAG模型:像一个开卷考试的考生。在你提问后,它先不急于回答,而是去翻阅一本指定的、无限更新的“教科书”(你的知识库),找到最相关的几段内容,然后结合“题目”和“参考材料”来组织答案。
一句话总结:RAG = 检索 (Retrieval) + 增强 (Augmented) + 生成 (Generation)
-
检索:根据你的问题,从一个知识库(向量数据库)中找出最相关的文档片段。
-
增强:将检索到的信息和你的原始问题,一起打包成一个更丰富的提示词。
-
生成:把增强后的提示词交给大模型,让它有据可依地生成最终答案。
这个方法的优势:答案更准确、实时,而且可解释(你可以引用检索到的原文)。
三、 如何设计一个RAG系统?—— 核心三步曲
一个完整的RAG系统分为离线阶段(准备知识库)和在线阶段(处理查询)。我们把它拆解为三个核心步骤:数据加载与处理 -> 向量化与存储 -> 检索与生成。
第一步:数据加载与处理(离线阶段)
这是地基工程,目标是把你手中的各种文档(Word, PDF, TXT, 网页)变成机器能理解的格式。
-
数据加载:使用工具读取原始文档。
LangChain和LlamaIndex提供了非常丰富的文档加载器,一行代码就能读取PDF、Markdown等文件。 -
文本切片(Chunking):这一步非常关键。你不能把整本书直接扔给模型,因为它有token长度限制,而且噪声太多。
-
核心权衡:
-
切片太大:包含太多无关信息,干扰检索精度,还可能超限。
-
切片太小:丢失上下文,导致语义不完整。
-
-
最佳实践:一般按256或512个token切分,或者按句子、段落边界进行语义切分。比如,你可以用
RecursiveCharacterTextSplitter这个工具来尝试。
-
第二步:向量化与存储(离线阶段)
计算机不认识文字,只认识数字。我们要把文本片段转化成计算机能高效查找的“向量”。
-
向量化(Embedding):使用一个嵌入模型,把每个文本片段变成一个由数百个小数组成的向量(例如
[0.12, -0.45, ..., 0.67])。这个过程会把“语义”编码进去,让意思相近的文本在向量空间里也彼此靠近。-
常见的嵌入模型:
text-embedding-ada-002(OpenAI)、bge-large-zh(智源,对中文友好)。
-
-
存入向量数据库:将生成的向量和它的原始文本片段、来源等元数据一起,存入一个专门为向量检索优化的数据库。
-
常用工具:开源的
FAISS(Meta出品,轻量高效)、Chroma、Qdrant,以及云服务Pinecone。
-
完成这一步,你的私有知识库就变成了一座“向量图书馆”,随时等待被检索。
第三步:检索与生成(在线阶段)
这是用户发起提问时的实时流程。
-
提问向量化:当用户提问,比如“公司年假怎么休?”,系统会使用同一个嵌入模型将这个问题也转换为一个向量。
-
相似度检索:拿着这个“问题向量”去向量数据库里进行搜索,找到与之最相似的Top-K个文档片段(比如最相关的3段公司制度)。
-
构建增强提示词:把用户的问题和检索到的几个文档片段,塞进一个精心设计的Prompt模板里。比如:
请根据以下参考资料,回答用户的问题。 如果参考资料中没有答案,请诚实地说“找不到相关信息”,不要自行编造。 参考资料: {检索到的文档片段1} {检索到的文档片段2} {检索到的文档片段3} 用户问题:{用户的问题} 答案: -
生成最终答案:将这个增强后的Prompt发给大模型(如GPT-4、Claude、ChatGLM),模型就会“照本宣科”,生成一个既准确又有据可循的答案。
四、 进阶之道:如何设计一个“更好”的RAG系统?
一个“朴素”的RAG系统很容易搭建,但生产环境中会遇到各种问题(比如查不到、查不准)。如何优化?可以从以下几个方面入手:
-
优化检索质量:
-
查询改写:用户问“苹果怎么样?”,系统可以自动改写成“苹果公司的财务状况?”、“苹果iPhone15的性能?”等多个查询,分别检索后合并结果,提高召回率。
-
重排序(Re-ranking):向量检索拿到一堆候选文档后,用一个更精确的重排模型(如
Cohere rerank)对它们进行二次排序,把最相关的放在最前面。
-
-
优化生成质量:
-
Self-RAG:让模型自己学会“反思”。它生成内容时,如果发现信息不足,会主动触发新一轮检索,而不是强行编造。
-
-
优化Prompt:
-
在Prompt里明确要求“如果资料不足以回答问题,请回复‘根据现有资料无法回答’”,这是对抗“幻觉”最直接有效的方法之一。
-
要求模型在回答末尾加上引用,指明信息来自于哪一篇文档。
-
五、 结语与下一步
至此,我们已经完整走了一遍RAG系统的设计思路:
动机:为了解决大模型的幻觉、知识陈旧和不可解释问题。
核心:“检索 -> 增强 -> 生成”。
实践:文本加载、切片、向量化、存储、检索、生成这六大关键步骤。
优化:从查询改写、重排序到Self-RAG等一系列进阶技巧。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)