Java 工程师 AI 智能体学习路线 · 阶段 5:工具调用、MCP 与 RAG 详解

本阶段目标:让智能体连接外部世界(工具调用)与私有知识(RAG),从"会聊天"升级为"能办事、知内情"。掌握 Function Calling、Java 工具注册、MCP 协议与完整 RAG 流水线。


注:

博客:

https://blog.csdn.net/badao_liumang_qizhi

5.1 Function Calling(函数调用)

讲解
Function Calling 让模型不仅能"说",还能"指使"程序执行动作。标准流程:

  1. 声明工具:开发者给出工具名、描述、参数 JSON Schema。
  2. 用户提问:如"北京今天天气如何?"
  3. 模型决策:返回要调用的工具及参数 {name:"get_weather", arguments:{city:"北京"}}
  4. 本地执行:程序真正调用 get_weather("北京")
  5. 结果回灌:把结果作为 ToolMessage 发回模型。
  6. 生成答案:模型基于真实结果组织回答。

关键点:模型真正执行函数,它只"决定调哪个、传什么参",真正执行的是你的代码。

常见场景

  • 查天气、查订单、算运费、发短信等任意确定性操作。
  • 让 Agent 具备"读/写外部系统"的能力。

面试知识点

  • Q:Function Calling 中模型真的执行了函数吗?
    A:没有。模型只输出"调用哪个函数、传什么参数"的结构化决策;真正的函数执行由本地代码完成,再把结果回灌给模型。

5.2 Java 中注册工具(@Tool / ToolCallback)

讲解
主流 Java 框架都提供声明式工具注册,免去手写 JSON Schema。

示例(Spring AI @Tool

public class WeatherTool {
    @Tool(description = "查询指定城市的当前天气")
    public String getWeather(
        @ToolParam(description = "城市名称,如 北京") String city) {
        return weatherService.query(city);   // 真实 HTTP/DB 调用
    }
}

// 注册到 ChatClient
ChatClient client = ChatClient.builder(chatModel)
        .defaultTools(new WeatherTool(), new CalculatorTool())
        .build();

String ans = client.prompt().user("北京天气怎么样?适合穿短袖吗?").call().content();

示例(LangChain4j @Tool

public class Tools {
    @Tool("根据城市查询天气")
    String weather(@P("城市名") String city) {
        return weatherService.query(city);
    }
}

方法级控制

  • 参数校验:在方法内对入参做范围/格式校验,防工具误用。
  • 权限控制:高危工具(发消息/删数据)加注解或开关,必要时人工确认。
  • 超时:给工具调用加超时与熔断,避免阻塞整个 Agent 循环。

面试知识点

  • Q:如何防止模型给工具传错参数?
    A:①在工具 Schema/描述中写清参数含义与类型;②方法内部做参数校验与范围限制;③对关键工具加人工确认;④调用失败可让模型基于报错重试。

5.3 MCP(模型上下文协议)

讲解
MCP(Model Context Protocol)是一个开放标准,用于统一地"把工具/资源/提示"暴露给模型,类似"AI 界的 USB-C 接口"。

  • 架构MCP Server(提供能力:工具、数据源)与 MCP Client(Agent 侧连接)。
  • 与 Function Calling 的关系:FC 是"模型如何表达要调函数"的机制;MCP 是"工具如何被标准化地发现与调用"的协议。MCP Server 可以把本地函数/数据库/API 包装成标准工具,Agent 通过 MCP Client 动态获取并调用,无需把每个工具硬编码进应用。
  • 价值:工具一次实现、多模型/多应用复用;解耦"能力提供方"与"模型调用方"。

示例(Spring AI 连接 MCP Server,示意)

// 通过 MCP 客户端获得工具回调,无需在应用里手写每个工具
McpSyncClient mcpClient = ...;            // 连接某个 MCP Server
List<ToolCallback> tools = mcpClient.listTools().stream()
        .map(McpToolCallback::new)
        .toList();
ChatClient client = ChatClient.builder(model).defaultTools(tools).build();

常见场景

  • 公司内部把"查 CRM""查库存"做成 MCP Server,多个 Agent 共用。
  • 第三方提供标准 MCP Server(数据库、文件系统、浏览器)。

面试知识点

  • Q:MCP 和 Function Calling 是一回事吗?
    A:不是。Function Calling 是模型表达"要调函数"的调用机制;MCP 是工具如何被标准化发现、描述、调用的协议。MCP Server 可以把工具以标准方式暴露,Agent 通过 MCP Client 动态使用,解耦能力提供与模型调用。

5.4 RAG 检索增强生成

讲解
RAG(Retrieval-Augmented Generation)用"外部知识"增强模型回答,缓解幻觉、注入私有数据。完整流水线:

5.4.1 文档加载与切分(Chunking)

  • 加载:PDF / Word / 网页 / 数据库。
  • 切分:按固定长度、按段落或按语义切分;块太大检索不精准,太小丢失上下文。常见 200~500 字/块,块间可留重叠。

5.4.2 Embedding 与向量库

  • 每个文本块用 Embedding 模型转成向量。
  • 存入向量库:Milvus / pgvector / Chroma / Redis / Elasticsearch。

5.4.3 检索与重排(Rerank)

  • 用户提问同样 Embedding,在向量库做相似度检索(Top-K)。
  • 用 Rerank 模型对候选再排序,提升相关性。

5.4.4 注入与生成

  • 把最相关的若干块拼进 Prompt(作为"参考资料")。
  • 模型基于资料作答,并可标注来源。

示例(RAG 流水线伪代码)

// 1) 建库
List<Document> docs = loader.load("knowledge/");
List<TextSegment> segments = splitter.split(docs);
vectorStore.add(embeddingModel.embedAll(segments));

// 2) 检索 + 重排
List<TextSegment> hits = vectorStore.search(embeddingModel.embed(question), 5);
hits = reranker.rerank(question, hits, 3);

// 3) 注入生成
String context = hits.stream().map(TextSegment::text).collect(joining("\n"));
String answer = chatClient.prompt()
    .user("参考资料:\n" + context + "\n问题:" + question)
    .call().content();

常见场景

  • 企业知识库问答、产品手册助手、合同/法规检索。
  • 客服机器人基于最新文档回答。

面试知识点

  • Q:RAG 中切分块(chunk)太大或太小会怎样?
    A:太大→检索噪声多、命中不精准、浪费 Token;太小→上下文被割裂、语义不完整。需结合文档结构与重叠窗口调优。
  • Q:为什么检索后还要 Rerank?
    A:向量相似度(粗排)速度快但精度有限;Rerank 模型用语义匹配精细排序,显著提升 Top 结果相关性,减少无关内容干扰生成。

5.5 引用与溯源

讲解
让模型在回答中标注"依据来自哪个文档/段落",提升可信度与可审计性。

  • 实现:给每个检索块编号,要求模型回答时附带编号;或返回时附上来源元数据。
  • 价值:用户可点击溯源、便于纠错、满足合规。

常见场景

  • 金融/法律等强合规领域必须可追溯。
  • 企业内部问答需注明"依据 XX 制度第 3 条"。

面试知识点

  • Q:如何降低 RAG 的"答非所问/编造来源"?
    A:①只在 Prompt 中给检索到的真实片段并要求"无依据则说不知道";②要求回答附带来源编号;③对来源做校验(确属检索结果);④结合置信度阈值触发人工复核。

5.6 Agentic RAG

讲解
传统 RAG 是"一次检索→一次生成",而 Agentic RAG 让智能体自主决定何时检索、检索什么、是否多轮检索、是否先规划再查。

  • 模型可判断"资料不足,需换关键词再查"。
  • 可组合多个知识源(数据库 + 网页 + 文档)。
  • 与 ReAct 结合:Thought 决定 Action=retrieve,Observation=检索结果。

常见场景

  • 复杂研究任务:先规划子问题,再分别检索汇总。
  • 多源比对:跨多个知识库取证。

面试知识点

  • Q:Agentic RAG 和传统 RAG 区别?
    A:传统 RAG 是静态"检索一次→生成";Agentic RAG 由智能体动态控制检索时机、查询词与多轮迭代,能应对更复杂、需多步取证的问题。

5.7 阶段 5 自测清单

  • 能为 Java 方法注册为可调用工具(@Tool)
  • 能说明 Function Calling 中"谁真正执行函数"
  • 能解释 MCP 与 Function Calling 的关系
  • 能跑通最小 RAG:切分→Embedding→检索→生成
  • 能说出 RAG 中 Rerank 的作用

5.8 阶段 5 面试题与参考答案

1. Function Calling 中模型真的执行了函数吗?

没有。模型只输出"调用哪个函数、传什么参数"的结构化决策;真正的函数执行由本地代码完成,再把结果(Observation)回灌给模型。

2. 如何防止模型给工具传错参数?

在工具 Schema/描述中写清参数含义与类型;方法内部做参数校验与范围限制;关键工具加人工确认;调用失败可让模型基于报错重试。

3. MCP 和 Function Calling 是一回事吗?

不是。FC 是模型表达"要调函数"的调用机制;MCP 是工具如何被标准化发现、描述、调用的开放协议。MCP Server 把能力以标准方式暴露,Agent 通过 MCP Client 动态使用,解耦能力提供方与调用方。

4. RAG 中切分块太大或太小会怎样?

太大→检索噪声多、命中不精准、浪费 Token;太小→上下文割裂、语义不完整。需结合文档结构与重叠窗口调优。

5. 为什么检索后还要 Rerank?

向量相似度是粗排,速度快但精度有限;Rerank 模型用语义匹配精细排序,显著提升 Top 结果相关性,减少无关内容干扰生成。

6. 如何降低 RAG 编造来源的问题?

只给真实检索片段并约束"无依据则拒答";要求回答附带来源编号;对来源做校验;结合置信度阈值触发人工复核。

7. 什么是 Agentic RAG?和传统 RAG 区别?

Agentic RAG 由智能体动态控制检索时机、查询词与多轮迭代;传统 RAG 是静态"检索一次→生成"。Agentic RAG 适合需多步取证的复杂问题。

8. 向量库在 RAG 中扮演什么角色?

存储文本块的 Embedding 向量,提供高效的相似度检索,使"用户问题"能快速找到语义最相关的知识片段。

9. MCP 对工程化的价值是什么?

工具一次实现、多模型/多应用复用;标准化发现与调用,降低 Agent 与工具间的耦合;便于权限治理与统一审计。

10. 一个完整的 RAG 流水线包含哪些步骤?

文档加载 → 切分(Chunking)→ Embedding 向量化 → 存入向量库 → 提问 Embedding → 相似度检索(Top-K)→ Rerank 重排 → 注入 Prompt → 模型生成(可带引用)。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐