Agentic RAG 模式
Agentic RAG 让大语言模型自主决定检索时机,支持多步推理与多次检索,适合复杂对话场景。
核心理念
与 Standard RAG 的固定检索不同,Agentic RAG 将检索作为一个 工具 交由 LLM 自主调用:
与 Standard RAG 的对比
| 维度 | Standard RAG | Agentic RAG |
|---|---|---|
| 检索策略 | 固定: 先检索后生成 | 动态: LLM 自主决定 |
| 查询构建 | 历史问题拼接 | LLM 改写查询词 |
| 检索次数 | 1 次 | 多次 (最多 max-tool-calls) |
| 灵活性 | 中 | 高 |
检索工具定义
Knowledge 将检索功能封装为 Spring AI 的 @Tool:
java
@Component
public class KnowledgeSearchTool {
@Tool(description = "Search knowledge base for relevant documents. " +
"Use this tool when you need to find information about a topic.")
public String knowledgeSearch(
@P("Search query") String query,
@P("Knowledge base IDs") List<String> libraryIds) {
// 执行检索
RetrievalOptions options = RetrievalOptions.builder()
.libraryIds(libraryIds)
.build();
List<RetrievedDocument> docs = retrievalService.search(query, options);
// 返回格式化的检索结果
return formatDocuments(docs);
}
}Agentic RAG 流程
第一步: 构建 Agent 上下文
java
// 伪代码 - 构建 Agent 上下文
AgentRagContext agentContext = AgentRagContext.builder()
.userId(userId)
.query(message)
.libraryIds(libraryIds)
.maxToolCalls(maxToolCalls) // 默认 5
.build();第二步: 系统提示词
java
private static final String AGENT_SYSTEM_PROMPT = """
你是一个专业的知识库问答助手。
你可以使用 knowledgeSearch 工具检索知识库获取信息。
## 使用建议:
1. 如果问题涉及具体知识,请使用 knowledgeSearch 工具检索
2. 你可以多次调用 knowledgeSearch 获取不同方面的信息
3. 如果信息已足够,直接回答用户问题
4. 如果工具检索不到相关信息,请告知用户
## 工具参数:
- query: 搜索查询词,请根据你的理解改写用户问题
- libraryIds: 知识库 ID 列表
""";第三步: LLM 自主检索
java
// 伪代码 - Agent 模式执行流程
public Flux<RagChatResponse> execute(AgentRagContext context) {
// 1. 构建 Prompt (含工具定义)
String prompt = buildAgentPrompt(context);
// 2. 流式调用 LLM
return chatClient.prompt(prompt)
.tools(knowledgeSearchTool) // 注册工具
.stream()
.chatResponse()
.map(response -> {
// 处理工具调用
if (response.hasToolCalls()) {
return handleToolCalls(response);
}
// 处理回答内容
String content = response.getResult().getOutput().getText();
return RagChatResponse.content(content);
});
}示例场景
场景: 对比分析
用户问题: "对比 Redis 和 ZooKeeper 实现分布式锁的优缺点"
LLM 自主决策过程:
LLM 思考: 这个问题需要对比两种实现方式,我需要分别检索它们的信息。
第 1 次检索:
查询: "Redis 分布式锁 实现 优点 缺点"
结果: 获取 Redis 实现的相关信息
LLM 思考: 我还需要 ZooKeeper 的信息。
第 2 次检索:
查询: "ZooKeeper 分布式锁 实现 优点 缺点"
结果: 获取 ZooKeeper 实现的相关信息
LLM 思考: 信息已足够,开始生成对比回答。
生成回答: Redis 和 ZooKeeper 实现分布式锁的对比...Standard RAG 的局限
Standard RAG 只能进行一次检索:
检索查询: "对比 Redis 和 ZooKeeper 实现分布式锁的优缺点"
结果: 可能返回提及对比的分片,但不一定包含两种实现的详细信息配置
Agent 模式的启用由前端请求参数控制,配置文件仅用于调整行为参数:
yaml
molandev:
rag:
agent:
# Agent 最大工具调用次数 (防止无限循环)
max-tool-calls: 5
# 是否启用查询改写
enable-query-rewrite: true
# 是否启用元数据提取
enable-metadata-extraction: true最大工具调用次数
max-tool-calls 限制 LLM 最多可调用多少次检索工具:
| 值 | 说明 |
|---|---|
| 3 | 适合简单问答 |
| 5 | 默认值,适合大部分场景 |
| 10 | 适合复杂分析 |
注意: 过多检索会增加延迟,建议根据场景调整。
使用方式
启用 Agent 模式
在问答界面切换到 Agent 模式,输入复杂的对比分析问题:
- 输入问题,如 "对比 Redis 和 ZooKeeper 实现分布式锁的优缺点"
- LLM 自主决定检索策略
- 系统实时流式输出回答
Agent 模式适合:
- 对比分析类问题
- 需要多步推理的复杂问题
- 开放性的探索类问题
💡 可通过系统界面切换到 Agent 模式,体验 LLM 自主检索能力。
适用场景
| 场景 | 是否适用 | 说明 |
|---|---|---|
| 对比分析 | ✅ | 需多次检索不同知识 |
| 多步推理 | ✅ | LLM 自主拆解问题 |
| 探索类问题 | ✅ | LLM 自主决定策略 |
| 简单问答 | ⚠️ | Standard 模式更快捷 |
| 概念查询 | ⚠️ | Standard 模式已足够 |
优势与劣势
优势
- ✅ 灵活性高 — LLM 根据问题自主决定检索策略
- ✅ 多次检索 — 可获取多方面的信息
- ✅ 查询改写 — LLM 可优化查询词,提升检索质量
- ✅ 适合复杂场景 — 对比、分析、推理类问题
劣势
- ❌ 延迟较高 — 可能多次检索,增加响应时间
- ❌ 不可控 — 检索策略由 LLM 决定,可能不符合预期
- ❌ 成本较高 — 更多 API 调用
最佳实践
何时使用 Agent 模式?
- 问题涉及 多个主题 的对比
- 需要 多步推理 才能回答
- 用户问题 模糊或开放,需要探索
调优建议
| 参数 | 建议值 | 说明 |
|---|---|---|
max-tool-calls | 3-5 | 避免过多检索 |
top-k | 10-15 | Agent 模式不需要太多初检结果 |