Agent 与 RAG 入门详解

3 阅读21分钟

Agent 与 RAG 入门详解

1. 这篇文档是写给谁的

这篇文档是写给“刚接触 AI、LangChain、RAG、Agent,还看不懂项目源码”的同学的。

你现在不用先追求把所有名词都背下来,只要先建立一个整体感觉:

  • 大模型像一个“很会说话、很会总结”的大脑
  • RAG 像“先查资料,再回答”
  • Agent 像“会自己决定下一步要不要用工具”
  • LangChain 像“把模型、工具、提示词、记忆、检索流程串起来的框架”

只要你先抓住这 4 句话,后面很多概念就不会乱。


2. 先理解:什么是大模型

我们平时说的 AI、大模型、LLM,通常指的是像 GPT、Qwen 这种可以理解文字、生成文字的模型。

它最擅长的事情包括:

  • 理解自然语言
  • 回答问题
  • 总结文本
  • 改写内容
  • 写代码
  • 进行一定程度的推理

但是它也有明显问题:

2.1 大模型不是“真的知道”

大模型本质上不是像人一样真正理解世界,它更像是:

通过大量训练后,学会“在当前上下文下,什么词最可能接在后面”

所以它很会“像懂了一样回答”,但不代表它真的掌握了外部世界的最新事实。

2.2 大模型有知识边界

模型训练完成后,它知道的知识通常停留在训练数据覆盖的时间范围内。

比如:

  • 你问它公司去年的政策,可能答不准
  • 你问它你上传到本地的 PDF,它默认根本不知道
  • 你问它你的数据库里有什么,它也不知道

于是就出现了两个关键方向:

  1. 想让模型“查资料再回答” -> 这就是 RAG
  2. 想让模型“自己决定调用工具完成任务” -> 这就是 Agent

3. 什么是 LangChain

LangChain 是一个用来开发 LLM 应用的框架。

你可以把它理解成一个“搭积木工具箱”,它帮你把这些东西连起来:

  • 模型
  • Prompt
  • 检索器
  • 向量库
  • 工具
  • Agent
  • 输出解析器
  • 工作流链条

如果不用 LangChain,你当然也能自己写:

  • 自己调模型 API
  • 自己查向量库
  • 自己拼 prompt
  • 自己写工具调用逻辑

但会比较零散。

用了 LangChain,常见套路可以更快地组合起来。

比如这个项目里就能看到:

  • 用 LangChain 组织 RAG 流程
  • 用 LangChain 创建 Agent
  • 用 LangChain 对接向量库 Chroma
  • 用 LangChain 处理 prompt、messages、工具调用

4. 你先要认识的几个基础概念

在正式讲 RAG 和 Agent 之前,先把几个基础概念讲清楚。

4.1 Prompt

Prompt 就是你发给模型的提示词。

例如:

请根据以下资料回答用户问题。
资料:...
问题:小户型适合什么扫地机器人?

Prompt 决定了模型:

  • 扮演什么角色
  • 用什么语气回答
  • 是否要基于资料回答
  • 输出格式是什么

所以很多 AI 项目并不是“只有模型”,而是“模型 + Prompt”一起工作。

这个项目里也有专门放 Prompt 的目录:

  • backend/app/prompt/main_prompt.txt
  • backend/app/prompt/rag_summarize.txt
  • backend/app/prompt/reorder_prompt.txt

4.2 Token

Token 可以简单理解成“模型处理文本时的最小片段单位”。

它不完全等于“一个字”或者“一个单词”,但你可以先粗略这么理解。

为什么要知道 Token?

因为模型有上下文长度限制:

  • 输入太长会截断
  • 检索出来的资料太多会塞不进去
  • 费用往往也和 token 数有关

所以 RAG 里一定会有“切分文档”的过程。

4.3 Embedding

Embedding 是非常关键的概念。

它的作用是:

把一段文字转成一串数字向量,让计算机可以比较“语义上像不像”

比如:

  • “苹果手机怎么充电”
  • “iPhone 如何充电”

这两句话字面上不完全一样,但语义接近。

如果转成向量后,它们在向量空间里可能就会离得比较近。

这就是向量检索能工作的基础。

4.4 向量库

向量库就是专门存储这些“文本向量”的数据库。

常见用途:

  1. 把知识库文档切成小块
  2. 每一块生成 embedding
  3. 存进向量库
  4. 用户提问时,把问题也转成 embedding
  5. 去向量库里找“最相似的几段文本”

这个项目里使用的是:

  • Chroma

对应代码主要在:

  • backend/app/rag/vector_store.py

4.5 检索器 Retriever

Retriever 就是“帮你找资料”的组件。

它的任务不是直接回答,而是:

从知识库里挑出和问题最相关的内容

检索方式常见有两类:

  1. 关键词检索
    比如 BM25,偏“字面匹配”
  2. 向量检索
    偏“语义相似”

这个项目里用了混合检索:

  • 向量检索
  • BM25 检索
  • 再做融合

这比只用单一方式更稳一些。

4.6 重排序 Rerank

第一次检索拿到的文档,不一定排序最准确。

于是会再加一步:

把“问题 + 候选文档”送进一个重排序模型,重新打分排序

这样更有机会把真正最相关的文档放到最前面。

这个项目里用了 Qwen3-Reranker-0.6B 做重排序。


5. 什么是 RAG

RAG 的全称是:

Retrieval-Augmented Generation

中文常翻译成:

检索增强生成

名字看起来很复杂,其实核心思想很简单:

先检索资料,再让模型根据资料生成答案。

5.1 为什么需要 RAG

因为单靠大模型本身有这些问题:

  • 不知道你公司的私有知识
  • 不知道你刚上传的文档
  • 容易胡编乱造
  • 很难精准引用某份资料

RAG 的目标就是缓解这些问题。

它让模型在回答前,先从“你提供的知识库”里查到相关内容。

5.2 RAG 的基本流程

一个最基础的 RAG 流程通常是:

  1. 准备知识库文档
  2. 切分文档
  3. 对每个分块做 embedding
  4. 存进向量库
  5. 用户提问
  6. 把用户问题也转成 embedding
  7. 检索出相关文本块
  8. 把这些文本块拼到 prompt 里
  9. 让大模型基于这些资料回答

可以把它理解成:

开卷考试,而不是闭卷考试

5.3 一个生活化例子

假设你上传了一份《公司报销制度.pdf》。

用户问:

出差住宿费的报销上限是多少?

没有 RAG 时:

  • 模型可能瞎猜
  • 或者泛泛而谈

有 RAG 时:

  1. 系统先去知识库里找“出差”“住宿费”“报销上限”
  2. 找到相关段落
  3. 把这些段落给模型
  4. 模型据此回答

这样答案就更像“根据资料得出的结果”。


6. RAG 的核心组成部分

6.1 文档加载

知识库通常来源于:

  • txt
  • pdf
  • md
  • docx
  • pptx

这个项目就支持多种文档格式。

也就是说,第一步是先把文件内容读出来。

6.2 文档切分

为什么不能整本 PDF 一次塞给模型?

因为:

  • 太长
  • 浪费 token
  • 检索不精确

所以要把文档切成块。

例如一篇文章切成很多段。

好的切分要兼顾:

  • 每块不要太短,不然上下文不够
  • 每块不要太长,不然检索不灵活
  • 相邻块可以有一点重叠,减少信息断裂

这个项目里就有切分器配置,比如:

  • chunk_size
  • chunk_overlap
  • separators

6.3 Embedding 建库

切分后,每个文本块要被转成向量。

这样做完以后,向量库里会保存:

  • 文本内容
  • 对应向量
  • 元数据

元数据可能包括:

  • 文件名
  • 用户 ID
  • 来源路径
  • 上传时间

6.4 检索

用户提问后,系统要从知识库里找相关内容。

这里有两个常见思路:

关键词检索

优点:

  • 对关键术语很敏感
  • 很适合短查询、明确关键词

缺点:

  • 容易只认字面,不懂同义表达
向量检索

优点:

  • 擅长语义相似
  • 适合同义改写、自然语言提问

缺点:

  • 有时会“语义像但不够精确”

所以很多系统会做混合检索。

6.5 重排序

混合检索拿回来的候选文本,仍然可能有噪声。

这时候可以用一个 reranker 模型重新判断:

  • 当前问题和哪个文档最匹配
  • 哪些只是“看起来像”,其实不太相关

重排序不是必须,但在实际项目里通常很有价值。

6.6 生成回答

最后一步才轮到大模型:

  1. 把检索到的文本块放进 prompt
  2. 告诉模型“请基于以下资料回答”
  3. 模型生成最终答案

所以 RAG 不等于检索。

RAG 是:

检索 + 把检索结果喂给模型生成答案


7. RAG 的优点和局限

7.1 优点

  • 能回答私有知识
  • 比纯模型回答更可靠
  • 可以随着知识库更新而更新
  • 不需要重新训练大模型
  • 更适合企业问答、文档问答、客服知识库

7.2 局限

RAG 不是万能的,它也有问题:

  • 检索错了,回答就会跟着错
  • 文档切分不好,信息可能断裂
  • 检索到了,但 prompt 没写好,模型也可能总结偏
  • 资料本身没有答案,模型也答不出来

所以一个 RAG 系统做得好不好,关键不只是“模型强不强”,还包括:

  • 切分策略
  • embedding 模型
  • 检索策略
  • rerank 模型
  • prompt 设计

8. 什么是 Agent

接下来讲 Agent。

如果说 RAG 的核心是:

先查知识库,再回答

那 Agent 的核心就是:

模型自己决定是否要调用工具,以及按什么顺序完成任务

8.1 先看一个对比

普通聊天:

  • 用户问问题
  • 模型直接回答

RAG:

  • 用户问问题
  • 系统先检索资料
  • 模型根据资料回答

Agent:

  • 用户问问题
  • 模型先思考
  • 判断要不要调用工具
  • 调一个或多个工具
  • 根据工具结果继续思考
  • 最后再回答

8.2 Agent 为什么重要

因为很多任务不是“光靠嘴说”就能完成的。

比如:

  • 查天气
  • 查时间
  • 查数据库
  • 调接口
  • 检索知识库
  • 执行复杂多步流程

模型如果不能用工具,就像一个只会说话、不会动手的人。

Agent 的出现,就是为了让模型从“只会回答”进化成“会行动”。

8.3 Agent 的基本组成

一个 Agent 通常包括:

  1. 大模型
    负责理解任务和决定行动
  2. 工具 Tools
    负责真正执行能力
  3. Prompt
    告诉 Agent 它能做什么、怎么做
  4. 记忆或历史消息
    让它知道上下文
  5. 执行器 Executor
    负责循环执行“思考 -> 调工具 -> 再思考”

8.4 Tool 是什么

Tool 就是给 Agent 用的工具。

例如:

  • get_weather
  • get_time
  • search_docs
  • get_user_info
  • reorder_documents

注意:

工具不是大模型本身。

工具是被模型调用的函数、接口或服务。

模型负责“决定要不要调用”,工具负责“真的执行”。

8.5 Agent 的一个简单例子

用户问:

帮我看看今天上海天气怎么样,顺便告诉我现在几点。

如果是 Agent,它可能这样工作:

  1. 先判断这个任务需要外部信息
  2. 调天气工具
  3. 调时间工具
  4. 整合结果输出

如果没有 Agent,模型可能只会“凭印象胡猜天气”。


9. Agent 和 RAG 的关系

很多初学者最容易混的就是这里。

记住一句话:

RAG 是一种能力,Agent 是一种调度方式。

也可以这样理解:

  • RAG 解决“怎么查知识库再回答”
  • Agent 解决“面对一个任务时,要不要调用哪个工具”

所以它们不是二选一,而是经常一起用。

9.1 RAG 可以成为 Agent 的一个工具

例如:

  • Agent 拥有一个 rag_summary 工具
  • 用户问到知识库相关问题时
  • Agent 决定调用这个工具
  • 工具内部执行 RAG
  • 再把结果返回给 Agent

这就是“Agent 调 RAG”。

9.2 一个组合场景

用户问:

根据公司知识库,告诉我请假制度,并顺便帮我总结成 3 条重点。

可能流程是:

  1. Agent 先判断需要查知识库
  2. 调用 RAG 工具
  3. RAG 从知识库检索并总结
  4. Agent 再对结果进行组织和输出

如果任务更复杂,比如:

先查知识库,再查当前天气,再做一份建议

那 Agent 的优势就更明显。


10. 这个项目里的 RAG 是怎么工作的

下面我们结合你这个项目来讲,这样你不只是懂概念,也能对源码有感觉。

10.1 RAG 入口

项目里的 RAG 核心代码在:

  • backend/app/rag/rag_service.py

这个类叫 RagService

你可以把它理解成:

专门负责“检索资料 + 生成总结回答”的服务类

10.2 这个项目的 RAG 流程

从代码来看,大致流程是:

  1. 初始化向量库服务 VectorStoreService
  2. 获取检索器 retriever
  3. 使用 HyDE 生成假设性答案
  4. 用这个假设性答案去检索文档
  5. 得到候选文档后做重排序
  6. 对前几个文档分别做摘要
  7. 再把多个摘要合并成最终回答

这其实比最基础的 RAG 稍微高级一点。

10.3 什么是 HyDE

HyDE 是:

Hypothetical Document Embeddings

可以简单理解成:

先让模型“假装回答一下”,再拿这个假想答案去检索

为什么要这么做?

因为有时候用户的问题很短,直接拿问题去检索不够好。

比如:

小户型扫地机器人怎么选?

如果先让模型生成一段“可能的回答草稿”,这个草稿里会自然包含:

  • 户型面积
  • 吸力
  • 避障
  • 续航
  • 扫拖一体

那么拿这段更丰富的文本去检索,可能更容易找到真正相关的资料。

这个项目里就在 rag_service.py 里写了 generate_hypothetical_document

10.4 为什么还要重排序

检索拿回来的文档不一定排序最好。

项目又调用了 reorder_service 去重新打分。

这一步的意义是:

  • 提高前几条文档的相关性
  • 减少无关内容进 prompt
  • 让最终回答更聚焦

10.5 为什么要“先分别总结,再汇总”

rag_service.py 中,不是把所有文档一次性全塞给模型,而是:

  1. 每个文档先单独生成摘要
  2. 再把多个摘要拼起来
  3. 生成最终总结

这样做的好处通常是:

  • 控制上下文长度
  • 避免单次输入过长
  • 减少多个长文档相互干扰

这是一种比较实用的“分而治之”策略。


11. 这个项目里的向量库是怎么工作的

核心文件在:

  • backend/app/rag/vector_store.py

11.1 它做了哪些事情

这个类 VectorStoreService 主要负责:

  • 读取知识库文件
  • 切分文档
  • 生成 embedding
  • 写入 Chroma
  • 构造检索器
  • 删除指定用户的向量数据

11.2 它支持哪些文件

从代码看,支持的文档类型包括:

  • .txt
  • .pdf
  • .md
  • .pptx
  • .docx

这说明项目是一个面向“真实文档知识库”的系统,不只是演示代码。

11.3 混合检索是什么

项目里不是只用向量检索,还用:

  • 向量检索
  • BM25 检索
  • EnsembleRetriever 做融合

这就是混合检索。

这么做的好处是:

  • 语义相似问题交给向量检索
  • 关键词强匹配问题交给 BM25
  • 两种结果结合,更稳

11.4 动态权重是什么意思

项目里还根据 query 长度调整权重。

例如:

  • 问题很短时,可能更偏向 BM25
  • 问题很长时,可能更偏向向量检索

这是一个非常典型的工程优化思路:

不同类型的问题,用不同的检索偏好


12. 这个项目里的 Agent 是怎么工作的

核心文件在:

  • backend/app/agent/agent.py

12.1 AgentFactory 是什么

这里有个 AgentFactory,你可以把它理解成:

一个专门负责创建 Agent 的工厂

它负责准备:

  • 模型
  • 默认工具
  • 默认提示词
  • 中间件
  • 执行器

这样每次请求进来时,都可以创建一个新的 Agent 实例,避免全局状态污染。

12.2 这个项目的 Agent 用了哪些工具

从代码里能看到默认工具包括:

  • rag_summary_tools
  • get_weather_tools
  • what_time_is_now
  • get_user_info_tools
  • reorder_documents_tools

这说明这个项目里的 Agent 并不只是“知识库问答”,它还能:

  • 查天气
  • 查时间
  • 获取用户信息
  • 调用重排序能力

所以它更像一个“多工具智能助手”。

12.3 Agent 的执行过程

从代码逻辑看,大致是:

  1. 取出历史对话
  2. 构造 chat_history
  3. 创建 AgentExecutor
  4. 把用户输入交给 Agent
  5. Agent 根据 prompt 和工具决定要不要调用工具
  6. 如果调用工具,就记录中间步骤
  7. 得到最终输出
  8. 把结果存入会话历史

12.4 intermediate_steps 是什么

代码里专门记录了:

  • 思考内容
  • 调用了哪个工具
  • 工具输入是什么
  • 工具输出是什么

这部分可以帮助开发者理解:

  • Agent 为什么这么做
  • 它调用了哪些外部能力
  • 出错时卡在哪一步

这对调试 Agent 特别重要。

12.5 流式输出是什么

项目里还有 get_agent_stream_response,用于流式返回。

你可以把它理解成:

模型不是等全部生成完再一次性返回,而是一边生成一边往前端发

这样用户体验更像 ChatGPT:

  • 更快看到内容
  • 等待焦虑更少

13. Agent 和普通函数调用有什么区别

这是很多人刚学时会问的问题。

13.1 普通函数调用

普通程序是你手动写死流程:

先调 A
再调 B
最后调 C

13.2 Agent

Agent 是:

让模型根据用户问题自己判断:
要不要调 A?
还是调 B?
要调几次?
先后顺序是什么?

所以 Agent 更灵活,但也更难控制。

13.3 为什么 Agent 更难

因为 Agent 的“流程选择权”交给了模型。

这会带来:

  • 更强的泛化能力
  • 更灵活的任务处理

但也会带来:

  • 行为不稳定
  • 可能乱调用工具
  • prompt 难调
  • 调试难度更高

所以在真实项目里,并不是所有场景都需要 Agent。

如果任务很固定,直接写死流程有时更稳。


14. 什么场景适合 RAG,什么场景适合 Agent

14.1 适合 RAG 的场景

  • 文档问答
  • 企业知识库
  • FAQ 系统
  • 政策制度查询
  • 合同、手册、说明书问答

这类场景核心是:

先找到相关资料,再根据资料回答

14.2 适合 Agent 的场景

  • 多工具协作
  • 需要动态决策
  • 多步任务执行
  • 需要调用外部 API
  • 需要同时处理“查询 + 操作”

这类场景核心是:

模型需要自己决定下一步做什么

14.3 适合两者结合的场景

这是实际项目里最常见的情况。

比如智能办公助手:

  • 先查知识库制度
  • 再查当前数据
  • 再生成报告

这时候往往是:

  • RAG 负责知识检索
  • Agent 负责流程调度

15. 初学者最容易混淆的点

15.1 RAG 不是训练模型

很多人以为把文档放进去,模型就“学会了”。

其实不是。

RAG 通常没有重新训练模型,而是:

  • 把文档放进知识库
  • 查询时再检索出来
  • 临时喂给模型

所以更像“开卷查资料”,不是“重新上课训练大脑”。

15.2 向量库不是 MySQL 的替代品

向量库适合做语义检索。

但如果你要做:

  • 用户表
  • 订单表
  • 权限关系
  • 强一致事务

还是应该用 MySQL、PostgreSQL 这类关系型数据库。

向量库和传统数据库解决的问题不同。

15.3 Agent 不等于更高级就一定更好

Agent 很强,但不是所有地方都该用。

比如:

  • 固定问答流程
  • 固定表单提取
  • 固定总结任务

很多时候直接写链路就够了,没必要上 Agent。

15.4 Prompt 很重要,但不是万能

Prompt 能明显影响效果,但如果底层检索就错了,再好的 prompt 也救不了太多。

所以 AI 项目不是“只调 prompt”就行,还要看整个系统链路。


16. 你应该怎么阅读这个项目的 AI 代码

如果你现在基础比较弱,我建议你按这个顺序看:

第一步:先看接口入口

看:

  • backend/app/router/chat.py

你先知道系统对外提供了什么功能:

  • Agent 问答
  • RAG 问答
  • 文件上传建库
  • 会话管理
  • 重排序

第二步:看 RAG 主流程

看:

  • backend/app/rag/rag_service.py

你重点关注:

  • 怎么检索
  • 怎么 HyDE
  • 怎么重排序
  • 怎么总结

第三步:看向量库服务

看:

  • backend/app/rag/vector_store.py

你重点关注:

  • 怎么加载文件
  • 怎么切分
  • 怎么建库
  • 怎么混合检索

第四步:看 Agent 主流程

看:

  • backend/app/agent/agent.py

你重点关注:

  • Agent 是怎么创建的
  • 有哪些工具
  • 工具调用过程怎么记录
  • 流式输出怎么实现

第五步:再看 Prompt

看:

  • backend/app/prompt/

你会慢慢体会到:

  • 同样的模型
  • 不同 prompt
  • 结果会差很多

17. 如果你要给别人介绍这个项目里的 AI 部分,可以怎么说

你可以用一段比较容易懂的话来介绍:

这个项目的 AI 核心分成两部分。第一部分是 RAG,它负责把用户上传或系统已有的文档切分、向量化、存入 Chroma,然后在提问时通过混合检索、HyDE 和重排序找到最相关的内容,再交给大模型生成答案。第二部分是 Agent,它基于 LangChain 的工具调用机制,让模型不只是直接回答问题,还能根据任务需要调用知识库检索、天气、时间、用户信息等工具,最终形成更灵活的智能助手能力。

这段话已经比较适合:

  • 课程汇报
  • 面试介绍
  • 项目答辩

18. 给你的一个学习建议

你现在最重要的不是把所有术语一次背会,而是建立这套顺序:

  1. 先理解“大模型只能生成,不一定知道外部信息”
  2. 再理解“RAG 是先查资料再回答”
  3. 再理解“Agent 是模型自己决定何时调用工具”
  4. 最后再回到项目代码里,看这些概念怎么落地

如果你现在一上来就硬啃源码,会很容易被这些名词压住:

  • Retriever
  • Embedding
  • Vector Store
  • Reranker
  • PromptTemplate
  • AgentExecutor
  • Tool Calling

其实这些词背后都在做一件很朴素的事情:

让大模型更会查、会用工具、会结合资料、更像一个真正能工作的助手


19. 一张总图帮你串起来

flowchart TD
    A["用户提问"] --> B["是否需要外部知识或工具"]
    B --> C["RAG 路线"]
    B --> D["Agent 路线"]

    C --> C1["文档切分"]
    C1 --> C2["Embedding 向量化"]
    C2 --> C3["存入向量库"]
    C3 --> C4["检索相关文档"]
    C4 --> C5["重排序"]
    C5 --> C6["把资料交给大模型生成答案"]

    D --> D1["模型分析任务"]
    D1 --> D2["决定调用哪些工具"]
    D2 --> D3["调用 RAG/天气/时间/用户信息等工具"]
    D3 --> D4["整合工具结果"]
    D4 --> D5["输出最终答案"]

20. 最后做个一句话总结

RAG 是什么

RAG 是让大模型先去知识库查资料,再基于资料回答问题。

Agent 是什么

Agent 是让大模型像“会做决定的助手”一样,根据任务需要自动调用工具完成工作。

LangChain 是什么

LangChain 是把模型、检索、Prompt、工具、Agent 这些能力串起来的框架。

这个项目在做什么

这个项目本质上是在做一个:

基于 LangChain 的智能问答系统,其中 RAG 负责文档知识问答,Agent 负责多工具协同的智能交互。


21. 你下一步最适合学什么

如果你要继续学,我建议顺序是:

  1. 先学 Prompt、Token、Embedding
  2. 再学向量库和检索
  3. 再学 RAG 整体流程
  4. 再学 LangChain 的 Chain 和 PromptTemplate
  5. 最后学 Agent 和 Tool Calling

这样会顺很多。

如果你愿意,我下一步还可以继续帮你写:

  • 一篇《Embedding、向量库、BM25、重排序到底是什么》
  • 一篇《LangChain 从零入门,结合这个项目讲》
  • 一篇《看懂这个项目 backend AI 代码的逐文件讲解》