目 录CONTENT

文章目录

rag-agentic

~梓
2026-06-29 / 0 评论 / 0 点赞 / 1 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Agentic RAG

把检索做成 Agent 的一个工具,由 LLM 自己决定何时检索、用什么词检索。本质是 ReAct + RAG 的结合。


一、核心思想

Naive RAG 每次都检索,但有些问题不需要检索(如"你好""现在几点")。Agentic RAG 把检索做成工具,LLM 像人一样判断:这个问题需要查资料吗?查的话用什么关键词?

用户问题 → LLM 判断 → 需要检索?
                    ├─ 是 → 调检索工具(query) → 拿到文档 → 生成
                    └─ 否 → 直接回答

二、完整流程

1. 用户问题进入 ReAct agent
2. LLM 看到工具列表(含"检索知识库"工具)
3. LLM 判断: 这个问题要不要查资料?
   - 不需要 → 直接回答
   - 需要 → 决定调检索工具, 并自己写一个检索词 query
4. 检索工具(query) 执行:
   - query 向量化
   - 向量检索 top-k 文档
5. 检索到的文档作为 ToolMessage 返回 LLM
6. LLM 看到 ToolMessage, 基于文档生成回答

三、两个关键特征

1. LLM 自己写 query(不是独立改写模型)

LLM 调检索工具时要填参数(tool_call 的 args)。检索工具的参数就是 query: str,LLM 得自己决定填什么。

@tool
def retrieve_knowledge(query: str):    # ← LLM 自己填这个 query
    """从知识库中检索相关信息..."""

LLM 看到参数名 query + 工具描述,就明白要填一个检索词。然后根据用户问题,自己提炼一个检索词。

和用户原话不同:用户问"帮我找下禅院飞鸟相关的内容",LLM 可能提炼出 query="禅院飞鸟" 去检索。这个提炼是 LLM 调工具时顺手干的,不是独立的 query 改写步骤(Advanced RAG 才有专门的改写)。

2. 检索结果走 ToolMessage(不是拼 context)

Naive RAG 把检索结果拼进 prompt context。Agentic RAG 把检索结果作为 ToolMessage,在 ReAct 循环里给 LLM:

ReAct 循环里的消息序列:
  HumanMessage:   用户问题
  AIMessage:      tool_calls=[retrieve_knowledge("禅院飞鸟")]   ← LLM 决定调工具
  ToolMessage:    [检索到的文档内容]                            ← 工具结果
  AIMessage:      基于文档的回答                                ← 最终回答

LLM 在循环里看到 ToolMessage(文档),基于它生成回答。


四、对比 Naive RAG

Naive RAG Agentic RAG
检索时机 每次必检索 LLM 判断要不要检索
检索词 用户原话 / 简单改写 LLM 自定(作为工具参数)
检索结果去哪 拼进 prompt context 作为 ToolMessage
不需要检索时 也检索(浪费) 不检索,直接回答
架构 检索流程硬编码 检索是 Agent 的一个工具

五、背后的机制

Agentic RAG 依赖两个底层能力:

  1. Function Calling:LLM 能输出结构化的工具调用请求(name + args),这是 LLM 调工具的前提。
  2. ReAct 范式:思考→调工具→看结果→再思考的循环,让 LLM 自主决定调工具。

详细概念见 function-calling-mcp-notes.mdagent-learning-notes.md


六、优缺点

优点

  • 灵活:LLM 判断要不要检索,避免无脑检索
  • 智能:LLM 自定检索词,比用户原话可能更准
  • 可扩展:检索只是工具之一,可挂更多工具(查时间、查数据库、调 API)

缺点

  • LLM 可能不调:该检索时不调,瞎回答
  • LLM 可能乱调:检索词写得差,检索不到
  • ToolMessage 不充分使用:相比直接拼 context,LLM 在 ReAct 循环里可能没充分利用文档
  • 不确定性高:LLM 自主决策,行为难预测

七、适用场景

  • 问题多样(有的需要检索,有的不需要)
  • 需要多工具协作(检索 + 查时间 + 查数据库等)
  • 想要 Agent 风格的智能交互

八、实验观察(工具选择行为)

实际调试 Agentic RAG 时发现的现象:

  1. LLM 选工具看三件套:工具的 name + description + args 共同决定 LLM 是否选用。改这三件套影响 LLM 决策。
  2. 对话历史是强信号:历史里调过某工具,LLM 会沿用,甚至抄历史里的参数名,盖过当前 schema。
  3. LLM 选工具不是精确匹配:是需求驱动 + 排除法 + 试探。描述太宽泛(如"处理数据")会被当兜底工具试探调用。
  4. 要让 LLM 不调某工具:描述要「明确不相关」,而非「模糊宽泛」。

这些说明 Agentic RAG 的行为比 Naive RAG 难预测,调试时要隔离变量(清历史、换会话)。


九、关键认知

  1. Agentic RAG = ReAct + RAG,检索是 Agent 的一个工具。
  2. LLM 自己决定调不调、用什么 query(不是独立改写模型)。
  3. 检索结果走 ToolMessage,非拼 context。
  4. 灵活智能,但行为不确定性高,调试要注意历史污染。
  5. 工具选择看 name+description+args 三件套 + 对话历史。

Agentic RAG 解决了 Naive RAG "无脑检索"的问题,但没解决"检索质量"问题——检索精度仍靠单次向量检索,这催生了 Advanced RAG(专门优化检索质量)。

0

评论区