
在本文中,我们将探讨 Spring AI 中的 Agent Skills 功能。我们会配置一个自定义技能,并将其与一个简单的聊天机器人相结合,用来对文章进行总结。
一、与聊天机器人互动既然我们已经完成了实现,那接下来就让我们与聊天机器人进行互动,测试一下该智能体的各项功能吧。
在这里,我们要求聊天机器人通过提供文章的 URL 来总结该文章的内容。我们故意使用一个并不存在的文章的 URL,以此来验证聊天机器人是否真的能总结出我们在 Python 脚本中预先定义好的文章内容。
让我们看看会得到怎样的回应吧:
curl -X POST "http://localhost:8088/chat" \-H "Content-Type: application/json" \
-d '{"question":"请总结如下文章:: https://www.xxxbbbccc.com/"}'

正如我们所见,该大型语言模型很好地总结了我们预先输入的文章内容。其输出格式完全符合要求:包括简短的总结、若干关键点以及最终结论。
在幕后,该智能体根据用户请求的描述,将请求与相应的文章摘要(article-summarizer )生成功能Skill 相匹配。接着,它使用 FileSystemTools 将相关指令加载到适当的环境中,再通过 ShellTools 执行 fetch_article.py 脚本来获取文章内容。最后,它按照 SKILL.md 文件中的指示来组织响应内容。
二、请求时序图用户发起一次 POST /chat 请求。
后端并不是只调用一次模型,而是模型与工具之间进行了 3 轮循环。
前两轮模型都返回 TOOL_CALLS(要求调用工具),第三轮才返回 STOP(最终答案)。
控制器拿到最终文本后,封装成 HTTP 200 JSON 返回给客户端。

按阶段看,可以分为如下几个步骤:
入站阶段(1-3)
Client 把问题发到 ChatbotController。
Controller 调用 ChatClient。
ChatClient 组装第 1 轮请求给 Qwen。
第一次工具决策(4-6)
Qwen 第 1 轮返回 TOOL_CALLS,点名 Skill(article-summarizer)。
Tools 执行 Skill。
Skill 结果回传给 ChatClient,作为下一轮上下文。
第二次工具决策(7-10)
ChatClient 发第 2 轮请求(含 Skill ToolResponse)。
Qwen 第 2 轮再次返回 TOOL_CALLS,点名 Bash 执行抓取脚本。
Tools 执行 Bash 命令。
Bash 输出结果(ARTICLE 内容)回传。
最终生成与返回(11-14)
ChatClient 发第 3 轮请求(含 Bash ToolResponse)。
Qwen 第 3 轮返回 STOP 和最终摘要文本。
Controller 取 content 并封装响应体。
返回 HTTP 200 给客户端。
上面时序图介绍:
泳道从左到右是参与者:Client -> Controller -> ChatClient -> Qwen -> Tools。红色节点表示模型响应(最关键是 TOOL_CALLS 或 STOP)。绿色节点表示工具执行或请求载荷。蓝色节点表示用户可见输入输出或工具结果。Skill 与 Bash 的结果是中间态,会回灌给后续轮次。真正返回给用户的最终文本来自第 3 轮 STOP 响应。
三、小结在本文中,我们探讨了如何利用 Spring AI 来实现“智能体技能”这一概念。
首先了解了什么是Agent Skill,以及它们如何帮助我们将那些可重复使用的功能呈现给AI Agent。
接着,我们定义了一个自定义的文章总结功能,并将其集成到聊天机器人中。最后,我们与聊天机器人进行了互动,确认它能够正确地识别并使用该功能。

示例项目源码可以在github 上获取。