Skip to content

Agentic RAG 模式

Agentic RAG 让大语言模型自主决定检索时机,支持多步推理与多次检索,适合复杂对话场景。

核心理念

与 Standard RAG 的固定检索不同,Agentic RAG 将检索作为一个 工具 交由 LLM 自主调用:

与 Standard RAG 的对比

维度Standard RAGAgentic 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-calls3-5避免过多检索
top-k10-15Agent 模式不需要太多初检结果

下一步