Agent 与 RAG 入门详解
1. 这篇文档是写给谁的
这篇文档是写给“刚接触 AI、LangChain、RAG、Agent,还看不懂项目源码”的同学的。
你现在不用先追求把所有名词都背下来,只要先建立一个整体感觉:
- 大模型像一个“很会说话、很会总结”的大脑
- RAG 像“先查资料,再回答”
- Agent 像“会自己决定下一步要不要用工具”
- LangChain 像“把模型、工具、提示词、记忆、检索流程串起来的框架”
只要你先抓住这 4 句话,后面很多概念就不会乱。
2. 先理解:什么是大模型
我们平时说的 AI、大模型、LLM,通常指的是像 GPT、Qwen 这种可以理解文字、生成文字的模型。
它最擅长的事情包括:
- 理解自然语言
- 回答问题
- 总结文本
- 改写内容
- 写代码
- 进行一定程度的推理
但是它也有明显问题:
2.1 大模型不是“真的知道”
大模型本质上不是像人一样真正理解世界,它更像是:
通过大量训练后,学会“在当前上下文下,什么词最可能接在后面”
所以它很会“像懂了一样回答”,但不代表它真的掌握了外部世界的最新事实。
2.2 大模型有知识边界
模型训练完成后,它知道的知识通常停留在训练数据覆盖的时间范围内。
比如:
- 你问它公司去年的政策,可能答不准
- 你问它你上传到本地的 PDF,它默认根本不知道
- 你问它你的数据库里有什么,它也不知道
于是就出现了两个关键方向:
- 想让模型“查资料再回答” -> 这就是 RAG
- 想让模型“自己决定调用工具完成任务” -> 这就是 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.txtbackend/app/prompt/rag_summarize.txtbackend/app/prompt/reorder_prompt.txt
4.2 Token
Token 可以简单理解成“模型处理文本时的最小片段单位”。
它不完全等于“一个字”或者“一个单词”,但你可以先粗略这么理解。
为什么要知道 Token?
因为模型有上下文长度限制:
- 输入太长会截断
- 检索出来的资料太多会塞不进去
- 费用往往也和 token 数有关
所以 RAG 里一定会有“切分文档”的过程。
4.3 Embedding
Embedding 是非常关键的概念。
它的作用是:
把一段文字转成一串数字向量,让计算机可以比较“语义上像不像”
比如:
- “苹果手机怎么充电”
- “iPhone 如何充电”
这两句话字面上不完全一样,但语义接近。
如果转成向量后,它们在向量空间里可能就会离得比较近。
这就是向量检索能工作的基础。
4.4 向量库
向量库就是专门存储这些“文本向量”的数据库。
常见用途:
- 把知识库文档切成小块
- 每一块生成 embedding
- 存进向量库
- 用户提问时,把问题也转成 embedding
- 去向量库里找“最相似的几段文本”
这个项目里使用的是:
Chroma
对应代码主要在:
backend/app/rag/vector_store.py
4.5 检索器 Retriever
Retriever 就是“帮你找资料”的组件。
它的任务不是直接回答,而是:
从知识库里挑出和问题最相关的内容
检索方式常见有两类:
- 关键词检索
比如 BM25,偏“字面匹配” - 向量检索
偏“语义相似”
这个项目里用了混合检索:
- 向量检索
- BM25 检索
- 再做融合
这比只用单一方式更稳一些。
4.6 重排序 Rerank
第一次检索拿到的文档,不一定排序最准确。
于是会再加一步:
把“问题 + 候选文档”送进一个重排序模型,重新打分排序
这样更有机会把真正最相关的文档放到最前面。
这个项目里用了 Qwen3-Reranker-0.6B 做重排序。
5. 什么是 RAG
RAG 的全称是:
Retrieval-Augmented Generation
中文常翻译成:
检索增强生成
名字看起来很复杂,其实核心思想很简单:
先检索资料,再让模型根据资料生成答案。
5.1 为什么需要 RAG
因为单靠大模型本身有这些问题:
- 不知道你公司的私有知识
- 不知道你刚上传的文档
- 容易胡编乱造
- 很难精准引用某份资料
RAG 的目标就是缓解这些问题。
它让模型在回答前,先从“你提供的知识库”里查到相关内容。
5.2 RAG 的基本流程
一个最基础的 RAG 流程通常是:
- 准备知识库文档
- 切分文档
- 对每个分块做 embedding
- 存进向量库
- 用户提问
- 把用户问题也转成 embedding
- 检索出相关文本块
- 把这些文本块拼到 prompt 里
- 让大模型基于这些资料回答
可以把它理解成:
开卷考试,而不是闭卷考试
5.3 一个生活化例子
假设你上传了一份《公司报销制度.pdf》。
用户问:
出差住宿费的报销上限是多少?
没有 RAG 时:
- 模型可能瞎猜
- 或者泛泛而谈
有 RAG 时:
- 系统先去知识库里找“出差”“住宿费”“报销上限”
- 找到相关段落
- 把这些段落给模型
- 模型据此回答
这样答案就更像“根据资料得出的结果”。
6. RAG 的核心组成部分
6.1 文档加载
知识库通常来源于:
- txt
- md
- docx
- pptx
这个项目就支持多种文档格式。
也就是说,第一步是先把文件内容读出来。
6.2 文档切分
为什么不能整本 PDF 一次塞给模型?
因为:
- 太长
- 浪费 token
- 检索不精确
所以要把文档切成块。
例如一篇文章切成很多段。
好的切分要兼顾:
- 每块不要太短,不然上下文不够
- 每块不要太长,不然检索不灵活
- 相邻块可以有一点重叠,减少信息断裂
这个项目里就有切分器配置,比如:
chunk_sizechunk_overlapseparators
6.3 Embedding 建库
切分后,每个文本块要被转成向量。
这样做完以后,向量库里会保存:
- 文本内容
- 对应向量
- 元数据
元数据可能包括:
- 文件名
- 用户 ID
- 来源路径
- 上传时间
6.4 检索
用户提问后,系统要从知识库里找相关内容。
这里有两个常见思路:
关键词检索
优点:
- 对关键术语很敏感
- 很适合短查询、明确关键词
缺点:
- 容易只认字面,不懂同义表达
向量检索
优点:
- 擅长语义相似
- 适合同义改写、自然语言提问
缺点:
- 有时会“语义像但不够精确”
所以很多系统会做混合检索。
6.5 重排序
混合检索拿回来的候选文本,仍然可能有噪声。
这时候可以用一个 reranker 模型重新判断:
- 当前问题和哪个文档最匹配
- 哪些只是“看起来像”,其实不太相关
重排序不是必须,但在实际项目里通常很有价值。
6.6 生成回答
最后一步才轮到大模型:
- 把检索到的文本块放进 prompt
- 告诉模型“请基于以下资料回答”
- 模型生成最终答案
所以 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 通常包括:
- 大模型
负责理解任务和决定行动 - 工具 Tools
负责真正执行能力 - Prompt
告诉 Agent 它能做什么、怎么做 - 记忆或历史消息
让它知道上下文 - 执行器 Executor
负责循环执行“思考 -> 调工具 -> 再思考”
8.4 Tool 是什么
Tool 就是给 Agent 用的工具。
例如:
get_weatherget_timesearch_docsget_user_inforeorder_documents
注意:
工具不是大模型本身。
工具是被模型调用的函数、接口或服务。
模型负责“决定要不要调用”,工具负责“真的执行”。
8.5 Agent 的一个简单例子
用户问:
帮我看看今天上海天气怎么样,顺便告诉我现在几点。
如果是 Agent,它可能这样工作:
- 先判断这个任务需要外部信息
- 调天气工具
- 调时间工具
- 整合结果输出
如果没有 Agent,模型可能只会“凭印象胡猜天气”。
9. Agent 和 RAG 的关系
很多初学者最容易混的就是这里。
记住一句话:
RAG 是一种能力,Agent 是一种调度方式。
也可以这样理解:
- RAG 解决“怎么查知识库再回答”
- Agent 解决“面对一个任务时,要不要调用哪个工具”
所以它们不是二选一,而是经常一起用。
9.1 RAG 可以成为 Agent 的一个工具
例如:
- Agent 拥有一个
rag_summary工具 - 用户问到知识库相关问题时
- Agent 决定调用这个工具
- 工具内部执行 RAG
- 再把结果返回给 Agent
这就是“Agent 调 RAG”。
9.2 一个组合场景
用户问:
根据公司知识库,告诉我请假制度,并顺便帮我总结成 3 条重点。
可能流程是:
- Agent 先判断需要查知识库
- 调用 RAG 工具
- RAG 从知识库检索并总结
- Agent 再对结果进行组织和输出
如果任务更复杂,比如:
先查知识库,再查当前天气,再做一份建议
那 Agent 的优势就更明显。
10. 这个项目里的 RAG 是怎么工作的
下面我们结合你这个项目来讲,这样你不只是懂概念,也能对源码有感觉。
10.1 RAG 入口
项目里的 RAG 核心代码在:
backend/app/rag/rag_service.py
这个类叫 RagService。
你可以把它理解成:
专门负责“检索资料 + 生成总结回答”的服务类
10.2 这个项目的 RAG 流程
从代码来看,大致流程是:
- 初始化向量库服务
VectorStoreService - 获取检索器
retriever - 使用 HyDE 生成假设性答案
- 用这个假设性答案去检索文档
- 得到候选文档后做重排序
- 对前几个文档分别做摘要
- 再把多个摘要合并成最终回答
这其实比最基础的 RAG 稍微高级一点。
10.3 什么是 HyDE
HyDE 是:
Hypothetical Document Embeddings
可以简单理解成:
先让模型“假装回答一下”,再拿这个假想答案去检索
为什么要这么做?
因为有时候用户的问题很短,直接拿问题去检索不够好。
比如:
小户型扫地机器人怎么选?
如果先让模型生成一段“可能的回答草稿”,这个草稿里会自然包含:
- 户型面积
- 吸力
- 避障
- 续航
- 扫拖一体
那么拿这段更丰富的文本去检索,可能更容易找到真正相关的资料。
这个项目里就在 rag_service.py 里写了 generate_hypothetical_document。
10.4 为什么还要重排序
检索拿回来的文档不一定排序最好。
项目又调用了 reorder_service 去重新打分。
这一步的意义是:
- 提高前几条文档的相关性
- 减少无关内容进 prompt
- 让最终回答更聚焦
10.5 为什么要“先分别总结,再汇总”
在 rag_service.py 中,不是把所有文档一次性全塞给模型,而是:
- 每个文档先单独生成摘要
- 再把多个摘要拼起来
- 生成最终总结
这样做的好处通常是:
- 控制上下文长度
- 避免单次输入过长
- 减少多个长文档相互干扰
这是一种比较实用的“分而治之”策略。
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_toolsget_weather_toolswhat_time_is_nowget_user_info_toolsreorder_documents_tools
这说明这个项目里的 Agent 并不只是“知识库问答”,它还能:
- 查天气
- 查时间
- 获取用户信息
- 调用重排序能力
所以它更像一个“多工具智能助手”。
12.3 Agent 的执行过程
从代码逻辑看,大致是:
- 取出历史对话
- 构造
chat_history - 创建 AgentExecutor
- 把用户输入交给 Agent
- Agent 根据 prompt 和工具决定要不要调用工具
- 如果调用工具,就记录中间步骤
- 得到最终输出
- 把结果存入会话历史
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. 给你的一个学习建议
你现在最重要的不是把所有术语一次背会,而是建立这套顺序:
- 先理解“大模型只能生成,不一定知道外部信息”
- 再理解“RAG 是先查资料再回答”
- 再理解“Agent 是模型自己决定何时调用工具”
- 最后再回到项目代码里,看这些概念怎么落地
如果你现在一上来就硬啃源码,会很容易被这些名词压住:
- 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. 你下一步最适合学什么
如果你要继续学,我建议顺序是:
- 先学 Prompt、Token、Embedding
- 再学向量库和检索
- 再学 RAG 整体流程
- 再学 LangChain 的 Chain 和 PromptTemplate
- 最后学 Agent 和 Tool Calling
这样会顺很多。
如果你愿意,我下一步还可以继续帮你写:
- 一篇《Embedding、向量库、BM25、重排序到底是什么》
- 一篇《LangChain 从零入门,结合这个项目讲》
- 一篇《看懂这个项目 backend AI 代码的逐文件讲解》