目录

 

一、 我们为什么需要RAG?

二、 RAG究竟是什么?

三、 如何设计一个RAG系统?—— 核心三步曲

第一步:数据加载与处理(离线阶段)

第二步:向量化与存储(离线阶段)

第三步:检索与生成(在线阶段)

四、 进阶之道:如何设计一个“更好”的RAG系统?

五、 结语与下一步


 

一、 我们为什么需要RAG?

目前最强大的大语言模型(LLM),比如GPT-4,本质上是一个“超级猜字模型”。它在海量数据中学会了语法、逻辑和知识,但它有几个致命的弱点:

  1. 幻觉问题:遇到不懂的问题,它不是老实说“不知道”,而是会编造一个看似合理但错误的答案。

  2. 知识陈旧:它的知识停留在训练数据截止的那个时间点。你问它最新的新闻或公司内部政策,它只能一脸茫然。

  3. 来源不可查:你不知道它给出的答案是从哪篇文档、哪段话里来的,这在企业、医疗、金融等严肃场景下是不可接受的。

  4. 数据安全:你无法把自己的私有文档(比如财报、病历)喂给公用的GPT模型,这涉及到数据泄露的风险。

为了解决这些问题,RAG技术应运而生。

二、 RAG究竟是什么?

想象一下,你正在经历一场考试。

  • 普通的大模型:像一个闭卷考试的考生。它只能依靠自己大脑里(模型参数)记住的知识来回答问题。如果考试内容超纲(知识陈旧)或者它记错了(幻觉),就容易答错。

  • RAG模型:像一个开卷考试的考生。在你提问后,它先不急于回答,而是去翻阅一本指定的、无限更新的“教科书”(你的知识库),找到最相关的几段内容,然后结合“题目”和“参考材料”来组织答案。

一句话总结:RAG = 检索 (Retrieval) + 增强 (Augmented) + 生成 (Generation)

  • 检索:根据你的问题,从一个知识库(向量数据库)中找出最相关的文档片段。

  • 增强:将检索到的信息和你的原始问题,一起打包成一个更丰富的提示词。

  • 生成:把增强后的提示词交给大模型,让它有据可依地生成最终答案。

这个方法的优势:答案更准确、实时,而且可解释(你可以引用检索到的原文)。

三、 如何设计一个RAG系统?—— 核心三步曲

一个完整的RAG系统分为离线阶段(准备知识库)和在线阶段(处理查询)。我们把它拆解为三个核心步骤:数据加载与处理 -> 向量化与存储 -> 检索与生成

第一步:数据加载与处理(离线阶段)

这是地基工程,目标是把你手中的各种文档(Word, PDF, TXT, 网页)变成机器能理解的格式。

  1. 数据加载:使用工具读取原始文档。LangChainLlamaIndex提供了非常丰富的文档加载器,一行代码就能读取PDF、Markdown等文件。

  2. 文本切片(Chunking):这一步非常关键。你不能把整本书直接扔给模型,因为它有token长度限制,而且噪声太多。

    • 核心权衡

      • 切片太大:包含太多无关信息,干扰检索精度,还可能超限。

      • 切片太小:丢失上下文,导致语义不完整。

    • 最佳实践:一般按256或512个token切分,或者按句子、段落边界进行语义切分。比如,你可以用RecursiveCharacterTextSplitter这个工具来尝试。

第二步:向量化与存储(离线阶段)

计算机不认识文字,只认识数字。我们要把文本片段转化成计算机能高效查找的“向量”。

  1. 向量化(Embedding):使用一个嵌入模型,把每个文本片段变成一个由数百个小数组成的向量(例如 [0.12, -0.45, ..., 0.67])。这个过程会把“语义”编码进去,让意思相近的文本在向量空间里也彼此靠近。

    • 常见的嵌入模型text-embedding-ada-002 (OpenAI)、bge-large-zh (智源,对中文友好)。

  2. 存入向量数据库:将生成的向量和它的原始文本片段、来源等元数据一起,存入一个专门为向量检索优化的数据库。

    • 常用工具:开源的 FAISS (Meta出品,轻量高效)、ChromaQdrant,以及云服务 Pinecone

完成这一步,你的私有知识库就变成了一座“向量图书馆”,随时等待被检索。

第三步:检索与生成(在线阶段)

这是用户发起提问时的实时流程。

  1. 提问向量化:当用户提问,比如“公司年假怎么休?”,系统会使用同一个嵌入模型将这个问题也转换为一个向量。

  2. 相似度检索:拿着这个“问题向量”去向量数据库里进行搜索,找到与之最相似的Top-K个文档片段(比如最相关的3段公司制度)。

  3. 构建增强提示词:把用户的问题和检索到的几个文档片段,塞进一个精心设计的Prompt模板里。比如:

    请根据以下参考资料,回答用户的问题。
    如果参考资料中没有答案,请诚实地说“找不到相关信息”,不要自行编造。
    
    参考资料:
    {检索到的文档片段1}
    {检索到的文档片段2}
    {检索到的文档片段3}
    
    用户问题:{用户的问题}
    答案:
  4. 生成最终答案:将这个增强后的Prompt发给大模型(如GPT-4、Claude、ChatGLM),模型就会“照本宣科”,生成一个既准确又有据可循的答案。

四、 进阶之道:如何设计一个“更好”的RAG系统?

一个“朴素”的RAG系统很容易搭建,但生产环境中会遇到各种问题(比如查不到、查不准)。如何优化?可以从以下几个方面入手:

  1. 优化检索质量

    • 查询改写:用户问“苹果怎么样?”,系统可以自动改写成“苹果公司的财务状况?”、“苹果iPhone15的性能?”等多个查询,分别检索后合并结果,提高召回率

    • 重排序(Re-ranking):向量检索拿到一堆候选文档后,用一个更精确的重排模型(如 Cohere rerank)对它们进行二次排序,把最相关的放在最前面。

  2. 优化生成质量

    • Self-RAG:让模型自己学会“反思”。它生成内容时,如果发现信息不足,会主动触发新一轮检索,而不是强行编造。

  3. 优化Prompt

    • 在Prompt里明确要求“如果资料不足以回答问题,请回复‘根据现有资料无法回答’”,这是对抗“幻觉”最直接有效的方法之一。

    • 要求模型在回答末尾加上引用,指明信息来自于哪一篇文档。

五、 结语与下一步

至此,我们已经完整走了一遍RAG系统的设计思路:

动机:为了解决大模型的幻觉、知识陈旧和不可解释问题。

核心:“检索 -> 增强 -> 生成”。

实践:文本加载、切片、向量化、存储、检索、生成这六大关键步骤。

优化:从查询改写、重排序到Self-RAG等一系列进阶技巧。

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐