实现 Function Call 工具注册,为大模型扩展网页抓取、文件解析等外部交互能力
求职派的岗位采集需要从招聘网站抓取数据,但大模型本身并不具备访问网络的能力。
大模型只负责文本推理,不负责和外部世界打交道。

Function Call 就是为了解决这个问题出现的。我们预先注册好工具方法,大模型在推理过程中判断需要外部能力时,发出一个工具调用请求,框架去执行对应的工具方法并把结果返回给模型,模型拿到结果后继续推理,最终生成完整的回答。
Spring AI 2.0.0-M4 对 Function Call 的支持已经相当成熟。

我们只需要关注两件事,用 @Tool 注解标注工具方法、在调用时用 .tools() 注册工具类。剩下的参数序列化、工具清单生成、调用过程管理,全部由框架来处理。
这篇内容会从 Spring AI 的工具注册讲起,然后依次讲解求职派是怎么处理返回数据截断的、怎么在 Function Call 和 MCP 之间自动切换的。
01、怎么把一个 Java 方法变成工具?
Spring AI 提供了 @Tool 注解,加在方法上就能把它注册为大模型可以调用的工具。
不是所有大模型都支持 Function Call,不过 DeepSeek V4.1 Flash 是支持的,求职派用的就是它。

求职派的岗位采集场景需要从网页中抓取表格数据。对于静态网页,用 Jsoup 解析 HTML 就够了;HTTP 请求则交给 Hutool 处理。
@Tool(description = "输入一个http链接,返回对应网页中的表格内容")
public String crawlerHttpTable(
@ToolParam(description = "http格式的url地址") String url) {
String text = HttpUtil.get(url, CharsetUtil.CHARSET_UTF_8);
Document doc = Jsoup.parse(text);
Element table = doc.select("table").first();
return table == null ? doc.body().text() : table.html().trim();
}
这里有个细节,当页面中没有 大模型拿到的是一份工具清单,清单里每个工具只有名称和描述两项信息。大模型就是根据这段描述来判断“用户的请求是否需要调用这个工具”。描述写得模糊或者不准确,模型在该调用的时候就可能不会调用。 求职派的网页抓取工具类中还包含了一个文件内容转换方法,同样用 实际项目中可以按功能领域来组织,比如数据采集相关的工具放在一起,浏览器操作的工具放在另一个类里,而不是每个工具方法都单独建一个类。 注册到大模型是... 1. 微信扫右侧的优惠券加入知识星球 2. 解锁星球的实战项目教程和源码:
项目源码+教程获取 真诚点赞 诚不我欺 标签时,方法会降级返回整个页面的文本内容,而不是直接抛异常。

@Tool 的 description 参数是整个 Function Call 能不能正确触发的关键。@ToolParam 的作用是告诉大模型这个参数应该传什么值。框架会把参数描述转换成 JSON Schema,大模型根据 Schema 来构造入参。@Tool 标注,用于处理用户上传的文件附件。一个工具类里可以包含多个 @Tool 方法,Spring AI 在扫描时会把它们全部注册为独立的工具。
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
回复