Agentic Search 的核心原理与案例


Agentic Search 的核心原理

Agentic Search(也称 Agentic RAG)把「检索」从一次性、固定参数的动作,升级成由 LLM 自主决策、可迭代、可反思的工具调用过程。它不再是「问题 → 固定 Top-K 检索 → 生成」,而是「问题 → 思考 → 决定是否检索/怎么检索 → 观察结果 → 再思考 → …… → 最终回答」。

1. 核心思想:检索变成「可规划的工具」

传统 RAG:

Query → Retriever(Top-K) → Context → LLM → Answer

检索参数(K、查询语句、过滤条件)是写死的,LLM 只能被动使用结果。

Agentic Search:

Query → LLM(规划) → 调用检索工具(可多次、可改写) → 观察结果 → 反思/再规划 → …… → 最终生成

LLM 拥有「检索工具」的使用权,自己决定:

• 要不要检索

• 用什么查询语句

• 检索几次

• 当前证据够不够

• 要不要改写查询或拆分子问题

这本质上是 ReAct(Reason + Act) 范式在检索场景的落地:先推理(Reason),再行动(Act = 调用检索),再观察(Observation),循环直到满足停止条件。

2. 关键机制(原理拆解)

机制

作用

解决什么问题

查询规划 / 分解

把复杂问题拆成多个子查询

答案分散在多处时,单次查询覆盖不全

工具调用(Tool Calling)

把检索器封装成 tool,LLM 主动调用

从「被动接收」变成「主动获取」

反思 / 评分(Reflection / Grading)

对检索到的文档或中间答案打分:相关?充分?有幻觉?

过滤噪声、判断是否需要再检索

查询改写(Query Rewriting)

根据已有结果优化下一轮查询

提升后续召回质量

停止条件

最大轮数、置信度阈值、token 预算、信息充分性判断

防止无限循环、控制成本

状态管理

记录已检索片段、子问题、中间结论

避免重复检索、支持多跳推理

3. 典型工作流(简化版)

接收问题

规划:LLM 分析问题复杂度,决定策略(直接回答 / 单次检索 / 多轮拆解)

执行检索:调用混合检索(或向量/关键词),拿到候选片段

观察与评分:判断这些片段是否相关、是否足够回答问题

决策

生成 + 可选二次验证:基于收集到的证据生成答案,有时再做一次 groundedness 检查

— 足够 → 进入最终生成

— 不够 → 改写查询 / 提出新子问题 → 回到第 3 步

这就是为什么它能解决「Top-K 太小漏信息、太大塞爆上下文」的矛盾——每次只取少量高相关内容,通过多轮按需补全,而不是一次性塞大量文档。

4. 与传统 RAG 的本质区别

• 决策权:从工程师预设 → LLM 运行时决策

• 检索次数:固定 1 次 → 动态 0~N 次

• 查询质量:原始问题直接检索 → 可改写、可分解、可迭代优化

• 上下文控制:固定窗口 → 按需精选最小充分集

• 适用场景:简单事实问答 → 多跳、证据分散、低覆盖知识库

5. 原理背后的关键假设

LLM 具备一定的「元认知」能力:能判断自己知道什么、还缺什么。

检索工具是可靠的(因此底层仍推荐混合检索 + 重排,保证单轮质量)。

通过反思和停止条件,可以把额外成本控制在可接受范围内。

「短路径优先」:简单问题尽量走单轮,复杂问题才启动多轮,兼顾效果与成本。

RAGflow项目中Agentic Search

Agentic Search 主要实现在 internal/agent/tool/agentic_search.go 的 AgenticSearchTool,它在 internal/agent/tool/registry.go 中注册为 hybrid_search、vector_search、bm25_search 三个工具。另外,聊天侧的 Agentic 检索(ReAct 循环)实现在 internal/agentic_rag 包和 internal/service/agentic_pipeline.go 中,两者是相关但不同的系统。

1. Canvas 工具:AgenticSearchTool

核心实现在 internal/agent/tool/agentic_search.go:

  • 三种检索模式由常量定义:hybrid_search(权重 0.3)、vector_search(1.0)、bm25_search(0.0) agentic_search.go:36-40
  • AgenticSearchTool 结构体持有 mode 和 weight,NewAgenticSearchTool 按模式设置向量相似度权重 agentic_search.go:65-81
  • InvokableRun 解析参数后调用 GetRetrievalService().Search(),强制 AllowDenseFallback=false 和 ExcludeCompiled=true,并通过 canvasDatasetIDs 做 KB 权限交集 agentic_search.go:102-146
  • narrowByKeywords 对结果做关键词句子级裁剪(移植自 Python 的 _narrow_by_keywords) agentic_search.go:151-172

注册与上游调用

  • 三个模式在工具注册表中映射到 NewAgenticSearchTool 工厂 registry.go:43-45
  • 底层检索走 NLPRetrievalAdapter.Search(internal/agent/tool/retrieval_nlp.go),处理元数据过滤、跨语言翻译等 retrieval_nlp.go:253-277
  • 行为由测试固定:禁用 dense fallback、排除 compiled 结果、透传检索错误 retrieval_test.go:125-144 retrieval_test.go:168-187

2. Chat 侧 Agentic 检索(相关但独立的系统)

在 internal/service 和 internal/agentic_rag 中,是另一套面向对话的 Agentic RAG:

  • AsyncChat 在 kwargs[“agent_mode”] 或 reasoning level 为 agentic 且有 KB 时,分发到 s.agenticRag(…) chat_pipeline.go:288-297
  • agenticRag 驱动一轮 ReAct 循环:设置 15 分钟超时、50 万 token 预算、证据注册表 EvidenceRegistry agentic_pipeline.go:76-135
  • 默认模板 smart-reasoning 在 conf/agentic_rag.yaml 中定义,工具集为 grep_chunks、search_bm25_chunks、search_semantic_chunks、list_chunks 等 agentic_rag.yaml:1-18
  • 图谱工具如 graph_explore 在 internal/agentic_rag/tool_graph_explore.go 中实现 tool_graph_explore.go:33-40

Notes

  • 注意命名区分:agentic_search.go 里的工具名是 hybrid_search/vector_search/bm25_search(Canvas Agent 节点用);而 chat pipeline 的 agentic 模式用的是 search_bm25_chunks/search_semantic_chunks/grep_chunks(internal/agentic_rag 包),两套工具名不同、实现也不同。
  • 文档侧入口:docs/guides/chat/chat_configuration.md 的 “Agentic Settings” 描述了用户如何配置该模式 chat_configuration.md:109-119


一句话总结

Agentic Search 的原理 = 把检索变成 LLM 可自主调用、可迭代优化的工具,通过「规划 → 行动 → 观察 → 反思」的闭环,动态补全分散证据,从而在不盲目扩大 Top-K 的前提下提高覆盖率与答案质量。

它不是新的检索算法,而是检索的编排与决策范式。底层检索器可以是 BM25、向量、混合、图谱,甚至文件系统搜索;真正的差异在于「谁在决定什么时候查、怎么查、查到什么程度停」。

文章摘自:https://www.cnblogs.com/wintersun/p/23604871