HelloAgents:RAG——让 Agent 学会检索知识 HelloAgentsRAG——让 Agent 学会检索知识一、为什么需要 RAG随着 ChatGPT、Claude 等大语言模型的发展人们越来越习惯向 AI 提问各种问题。例如今天北京天气怎么样 Transformer 是什么时候提出的 帮我阅读这篇论文。 解释一下公司的内部接口文档。虽然大模型拥有庞大的知识储备但它并不是万能的。它存在一个天然缺陷模型的知识来源于训练数据而不是实时互联网。这意味着训练完成之后模型参数基本固定无法自动学习最新知识更不知道企业内部的数据。例如公司内部产品说明书 最新 API 文档 实验室资料 PDF Word Markdown 会议纪要这些资料大模型训练时根本没有见过。因此即使模型推理能力再强也无法回答这些问题。LLM 的三个局限HelloAgents 在介绍 RAG 时也总结了目前 LLM 面临的几个主要问题。1. 知识具有时效性例如今天最新发布的论文是什么 OpenAI 最近更新了哪些模型这些内容可能发生在模型训练完成之后。模型自然无法知道。2. 无法访问私有知识例如公司的产品文档 学校实验数据 医院病例 企业知识库这些资料不会公开发布。因此模型无法学习。3. 容易产生幻觉Hallucination这是目前 LLM 最大的问题之一。例如用户问介绍一下 XX 公司新发布的软件。模型没有相关知识。但是它往往不会直接回答我不知道。而是根据已有知识进行推测。最终生成看起来很合理实际上完全错误。这种现象就是Hallucination幻觉。二、RAG 是什么针对这些问题目前最主流的方法就是Retrieval-Augmented GenerationRAG中文一般翻译为检索增强生成。它的核心思想其实非常简单回答问题之前不是直接让 LLM 作答而是先去查资料。整个流程如下用户提问 │ ▼ 检索知识库 │ ▼ 找到相关文档 │ ▼ 加入 Prompt │ ▼ LLM 回答可以发现LLM 并没有直接回答问题。而是先获得一份参考资料。然后再根据资料组织答案。这种方式就像考试时允许查阅参考书一样。一个简单例子假设知识库中保存了《Python 深度学习实践》 《机器学习导论》 《Transformer 原理解析》现在用户问Transformer 是什么时候提出的传统 LLM直接依靠参数回答。而 RAG首先检索知识库。找到Attention Is All You Need 发表于 2017 年 Google 提出 Transformer。随后把这段内容放入 Prompt已检索到资料 Transformer 来源于论文 《Attention Is All You Need》发表于 2017 年。 请根据以上资料回答用户问题。因此最终答案准确率会明显提高。三、Memory 与 RAG 的关系上一节我们已经介绍了 Memory。很多同学容易把 Memory 与 RAG 混淆。实际上它们解决的是两类不同的问题。可以用下面这张图理解Agent ┌─────────────────┐ │ LLM │ └────────┬────────┘ │ ┌──────────┴──────────┐ │ │ ▼ ▼ Memory RAG 历史记忆 知识检索两者最大的区别就是MemoryRAG保存 Agent 自己经历的信息查询外部知识用户画像企业知识库历史任务PDF、Word用户偏好API 文档长期存在根据需要动态检索举个例子用户问推荐一本机器学习的书。Agent 首先查询 Memory用户喜欢 Python。然后查询 RAGHands-On Machine Learning最终生成考虑到你一直使用 Python 推荐阅读 《Hands-On Machine Learning》可以看到Memory 决定推荐给谁。RAG 决定推荐什么。二者结合之后Agent 才真正具有个性化能力。四、HelloAgents 中 RAG 的整体流程HelloAgents 并不是简单调用一个向量数据库。而是构建了一条完整的数据处理 Pipeline。整体流程如下外部文档 │ ▼ MarkItDown 文档解析 │ ▼ Document Processor │ ▼ 文本切分Chunk │ ▼ Embedding 向量化 │ ▼ Qdrant 向量数据库 │ ──────────────────────────────── │ 用户提问 │ ▼ Query Embedding │ ▼ Vector Retrieval │ ▼ Top-K 文档返回 │ ▼ Prompt Augmentation │ ▼ LLM │ ▼ 最终回答整个流程可以分成两个阶段第一阶段知识库构建Offline这一阶段只需要执行一次。主要完成读取文档文档解析文本切分Embedding写入向量数据库。完成之后知识库就建立好了。以后无需重复执行。第二阶段在线检索Online真正回答问题时用户提出问题Transformer 是什么系统立即对问题进行 Embedding在 Qdrant 中搜索找到最相关几个 Chunk拼接 Prompt调用 LLM。整个过程通常只需要几百毫秒。相比直接让模型猜准确率会大幅提升。下面继续第二部分。这一部分重点讲解HelloAgents 如何构建知识库也是官方 8.3 节最重要的内容之一。五、知识库是如何构建的上一节我们已经了解了 RAG 的整体流程。那么一个问题来了知识库中的数据是如何建立起来的例如我们希望 Agent 能够回答下面的问题实验室规章制度有哪些 这篇论文主要讲了什么 SpringBoot 项目如何部署 公司的 API 如何调用首先需要把这些文档导入到知识库。HelloAgents 将整个知识库构建过程划分为几个步骤原始文档 │ ▼ MarkItDown 文档解析 │ ▼ Document Processor │ ▼ 文本切分Chunk │ ▼ Embedding 向量化 │ ▼ Qdrant 向量数据库只有完成整个流程之后这些文档才能真正被 Agent 检索。六、文档解析MarkItDown现实中的知识通常不会直接以纯文本形式存在而是保存在各种文件中例如PDFWord.docxPowerPoint.pptxMarkdownHTMLTXT如果直接读取这些文件LLM 很难理解其中复杂的格式。因此HelloAgents 首先引入了MarkItDown。什么是 MarkItDownMarkItDown 是微软开源的一个文档转换工具它能够将多种格式的文件统一转换为Markdown。例如PDF Word PowerPoint HTML经过 MarkItDown 后都可以转换为# 第一章 这是正文…… ## 1.1 ……为什么选择 Markdown因为 Markdown保留了标题层级保留了列表结构保留了代码块文本更加规整。相比直接提取纯文本Markdown 更容易进行后续处理。因此HelloAgents 将 Markdown 作为知识库的统一中间格式。七、为什么不能直接保存整个文档很多同学刚接触 RAG 时都会想到既然已经得到 Markdown为什么不直接存入数据库原因主要有两个。原因一上下文窗口有限例如一本教材300 页一篇论文40 页一个产品手册1000 页如果全部放进 PromptPrompt 整本书不仅速度非常慢而且已经超过 LLM 的上下文长度。因此必须切分。原因二检索精度下降例如一本《机器学习》教材包含第一章 绪论 第二章 线性回归 第三章 决策树 第四章 神经网络 第五章 Transformer用户提问Transformer 是什么真正需要的其实只有第五章。如果整个文档作为一个整体进行检索那么系统返回的将是整本教材。不仅浪费 Token还会干扰模型理解。因此RAG 通常都会进行Chunk文本切块。八、Chunk文本切分Chunk 是整个 RAG 中最重要的概念之一。它的本质就是把长文档切成许多较小的语义片段。例如一本书机器学习教材切分之后Chunk1 机器学习概述 ------------------- Chunk2 线性回归 ------------------- Chunk3 决策树 ------------------- Chunk4 Transformer以后用户问Transformer系统直接返回Chunk4即可。Chunk 多大比较合适Chunk 并不是越大越好。也不是越小越好。例如Chunk 太小Transformer 是 一种一句话就切断。语义已经丢失。Chunk 太大整个 PDF又失去了检索意义。因此HelloAgents 建议按照固定长度语义边界标题结构综合进行切分。例如Markdown ↓ 一级标题 ↓ 二级标题 ↓ 段落尽量保证一个 Chunk 表达一个完整主题。这样 Embedding 的效果最好。九、Embedding让计算机理解语义完成 Chunk 之后接下来就是整个 RAG 最核心的一步Embedding文本向量化。计算机并不能直接理解Transformer Python 深度学习这些文字。因此需要转换成数学向量。例如Transformer经过 Embedding[0.24, -0.18, 0.61, ……]而Attention Mechanism可能变成[0.21, -0.15, 0.59, ……]虽然两个句子不同。但是它们向量距离很近。说明语义相似。Embedding 的作用Embedding 最大的作用就是把自然语言映射到向量空间。以后不是比较字符串是否相同而是比较两个向量是否接近例如数据库中保存Python用户输入机器学习编程语言关键词完全不同。但是Embedding 后两个向量非常接近。因此仍然能够成功检索。这就是Semantic Search语义检索。相比传统关键词搜索它更加智能。十、Qdrant向量数据库得到 Embedding 后所有 Chunk 都需要保存起来。HelloAgents 选择使用Qdrant作为默认向量数据库。它的作用可以理解为SQLite 负责保存文本。 ↓ Qdrant 负责保存向量。例如Chunk Transformer 于 2017 年提出。数据库中实际上保存的是文本 Embedding Metadata其中 Metadata 可以包括文件名称 章节 页码 标签 来源以后检索时不仅能够返回内容。还可以告诉用户这段内容来自哪篇文档、哪一章节。为什么使用向量数据库假设知识库有100 万个 Chunk如果每次都逐个计算相似度速度会非常慢。因此Qdrant 内部采用了专门的近似最近邻Approximate Nearest NeighborANN索引算法例如 HNSW使其能够在海量向量中快速找到最相似的几个结果。整个过程可以表示为用户问题 │ ▼ Embedding │ ▼ Qdrant │ ▼ Top-K Chunk通常只需要几十毫秒即可完成一次检索。十一、HelloAgents 中知识入库流程综合前面的内容HelloAgents 的知识库建立过程可以总结为PDF / Word / Markdown │ ▼ MarkItDown │ ▼ Markdown 文本 │ ▼ Document Processor │ ▼ Chunk 切分 │ ▼ Embedding │ ▼ Qdrant 存储至此一份文档就真正变成了可检索的知识库。以后用户每提出一个问题系统都可以快速定位到最相关的几个 Chunk再交由大语言模型进行回答。下面是第三部分也是整个HelloAgents 第8.3节 RAG博客的最后一部分。这一部分结合 HelloAgents 官方实现介绍检索阶段、MQE、HyDE、RAGTool最后进行总结。十二、在线检索RAG 如何回答用户问题完成知识库构建之后真正的 RAG 才开始发挥作用。与传统数据库查询不同RAG 并不是根据关键词直接查找文本而是经历一套完整的语义检索流程。整个在线检索流程如下用户提问 │ ▼ Query Embedding问题向量化 │ ▼ Vector Search向量检索 │ ▼ 返回 Top-K Chunk │ ▼ Prompt Augmentation构建上下文 │ ▼ LLM │ ▼ 最终回答整个流程通常只需要几百毫秒。第一步Query Embedding首先系统不会立即调用 LLM。而是先对用户问题进行Embedding。例如用户 SpringBoot 如何整合 RedisEmbedding 后[0.31, -0.24, 0.61, ......]这里使用的 Embedding 模型与建立知识库时保持一致。这样问题和知识库中的 Chunk 才位于同一个向量空间可以直接计算相似度。第二步Vector Search随后系统进入向量数据库。例如知识库中存在Chunk1 SpringBoot 整合 MySQL -------------------- Chunk2 SpringBoot 整合 Redis -------------------- Chunk3 Spring Security经过相似度计算返回Top1 SpringBoot 整合 Redis Top2 Redis 配置说明而不是返回Spring Security这就是语义检索最大的优势。即使用户没有出现完全相同的关键词只要表达的含义相近也能够正确找到相关内容。第三步Top-K 检索实际应用中系统一般不会只返回一个 Chunk。而是返回Top-K例如Top1 Redis 配置 Top2 Redis 注解 Top3 RedisTemplate 使用为什么要返回多个因为一篇完整答案往往分散在多个 Chunk 中。多个 Chunk 能够共同补充上下文。当然Top-K 也不是越大越好。如果返回Top100大量无关内容反而会影响模型理解。因此实际项目通常设置Top-K 3~10十三、Prompt Augmentation提示增强得到检索结果之后HelloAgents 并不会直接返回。而是把这些内容重新组织成 Prompt。例如用户问题SpringBoot 如何连接 Redis检索结果RedisTemplate 配置…… EnableCaching…… application.yml……最终 Prompt下面是检索到的资料 ...... 请根据这些资料回答用户问题。 问题 SpringBoot 如何连接 Redis这样LLM 就拥有了回答问题所需的知识。因此最终生成内容既符合知识库又保持自然语言表达。十四、为什么普通 RAG 还不够虽然普通 RAG 已经能够解决很多问题。但是实际项目中仍然存在一些挑战。例如用户输入GPU 怎么训练这个问题非常模糊。GPU可能指CUDA PyTorch TensorFlow 显卡驱动 多 GPU如果直接检索容易找到错误 Chunk。因此HelloAgents 进一步介绍了两种高级检索策略。十五、MQEMulti-Query ExpansionMQE 全称Multi-Query Expansion中文一般翻译为多查询扩展。核心思想非常简单不要只搜索一次。例如用户输入SpringBoot 权限管理系统首先让 LLM 自动生成多个相似问题SpringBoot RBAC Spring Security 权限 JWT 权限认证 用户角色管理随后分别进行检索问题1 ↓ 检索 问题2 ↓ 检索 问题3 ↓ 检索最后把所有结果合并。这样能够覆盖更多知识。相比一次检索。MQE召回率更高。MQE 的优点例如知识库只有JWT用户却输入Token普通 RAG可能找不到。MQE自动扩展JWT Access Token Bearer Token因此成功检索。十六、HyDEHypothetical Document EmbeddingsHyDE 是近年来比较流行的一种 RAG 优化策略。全称Hypothetical Document Embeddings它的思想更加有趣。不是直接检索。而是先让 LLM“假装已经知道答案。”例如用户介绍 Transformer。LLM首先生成Transformer 是 Google 在 2017 年提出的…… 采用 Self-Attention……虽然这不是最终答案。但是已经形成了一篇假设文档。随后系统不是 Embedding用户问题而是 Embedding假设答案为什么这样效果更好因为知识库中的 Chunk一般都是完整段落。而不是一句问题。Embedding完整段落。通常比一句问题。更加接近真正文档。因此检索质量更高。HyDE 工作流程整个流程如下用户问题 │ ▼ LLM 生成假设答案 │ ▼ Embedding │ ▼ Qdrant │ ▼ Top-K Chunk相比普通 RAGHyDE能够明显提高长文本检索效果。十七、HelloAgents 中的 RAGTool为了方便开发者使用HelloAgents 将整个 RAG 封装成RAGTool开发者无需关心Embedding、数据库、检索流程。只需要调用接口即可。添加文本例如rag_tool.execute(add_text,textTransformer 于 2017 年提出。)系统自动完成Chunk ↓ Embedding ↓ Qdrant添加文档例如rag_tool.execute(add_document,pathpaper.pdf)内部流程PDF ↓ MarkItDown ↓ Markdown ↓ Chunk ↓ Embedding ↓ Qdrant整个过程无需人工干预。搜索知识例如rag_tool.execute(search,queryTransformer)系统返回Top-K Chunk开发者可以自己处理。也可以继续交给LLM。直接问答HelloAgents 还进一步封装rag_tool.execute(ask,queryTransformer 是什么)系统自动完成Embedding ↓ Vector Search ↓ Prompt ↓ LLM ↓ 最终回答对于开发者来说几乎只需要一句代码。即可拥有完整 RAG 能力。十八、Memory RAG构建完整的 Agent 知识体系至此我们已经学习了第八章的两个核心模块Memory记忆RAG检索二者并不是竞争关系而是现代 Agent 中最重要的两个组成部分。可以通过下图理解Agent │ ┌────────────┴────────────┐ │ │ ▼ ▼ Memory RAG 保存历史经验 查询外部知识 │ │ └────────────┬────────────┘ ▼ LLM │ ▼ 最终回答其中Memory 负责用户画像长期偏好历史任务对话记录。RAG 负责企业知识库PDFAPI 文档最新论文私有数据。只有两者结合Agent 才能够真正做到既记得过去又知道现在。十九、本章总结通过 HelloAgents 第八章的学习我们系统了解了 Agent 中两项关键能力Memory记忆与RAG检索增强生成。对于 RAG 部分可以总结为以下几点RAG 的本质是“先检索再生成”。它通过在生成答案前引入外部知识有效弥补了大语言模型知识过时、无法访问私有数据以及容易产生幻觉等缺陷。知识库构建Indexing是 RAG 的基础包括文档解析MarkItDown、文本切分Chunk、Embedding 向量化以及 Qdrant 向量存储等步骤这些操作通常离线完成。在线检索Retrieval包括 Query Embedding、Vector Search、Top-K 检索和 Prompt Augmentation。系统首先检索最相关的知识片段再将其作为上下文交给 LLM从而生成更加准确、可靠的回答。MQEMulti-Query Expansion和 HyDEHypothetical Document Embeddings是提升检索质量的重要策略。前者通过扩展多个查询提高召回率后者通过生成假设文档改善向量表示二者都能够有效增强 RAG 的性能。HelloAgents 提供了高度封装的RAGTool开发者只需调用简单接口即可完成文档导入、知识检索和问答大大降低了构建 RAG 系统的开发难度。