Java 工程师 AI 智能体学习路线 · 阶段 5:工具调用、MCP 与 RAG 详解
Java 工程师 AI 智能体学习路线 · 阶段 5:工具调用、MCP 与 RAG 详解
本阶段目标:让智能体连接外部世界(工具调用)与私有知识(RAG),从"会聊天"升级为"能办事、知内情"。掌握 Function Calling、Java 工具注册、MCP 协议与完整 RAG 流水线。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
5.1 Function Calling(函数调用)
讲解
Function Calling 让模型不仅能"说",还能"指使"程序执行动作。标准流程:
- 声明工具:开发者给出工具名、描述、参数 JSON Schema。
- 用户提问:如"北京今天天气如何?"
- 模型决策:返回要调用的工具及参数
{name:"get_weather", arguments:{city:"北京"}}。 - 本地执行:程序真正调用
get_weather("北京")。 - 结果回灌:把结果作为
ToolMessage发回模型。 - 生成答案:模型基于真实结果组织回答。
关键点:模型不真正执行函数,它只"决定调哪个、传什么参",真正执行的是你的代码。
常见场景
- 查天气、查订单、算运费、发短信等任意确定性操作。
- 让 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 → 模型生成(可带引用)。
更多推荐

所有评论(0)