概述
可以把前面那两个 Skill(代码评审 / 内部数据分析)理解为「外部可执行能力」,再用 Spring AI 的 Function/Tool Calling 把它们挂到 Agent 上,让模型自己决定何时调用哪一个脚本,然后再基于脚本结果继续对话。
下面给一个端到端的集成示例,假设你用的是 Spring Boot + Spring AI + OpenAI/Mistral 等支持函数调用的模型。
整体思路概览
- Skill 本身:仍然是文件夹 +
SKILL.md+scripts/*.py,部署在应用服务器旁(或者挂载到容器)。 - Spring AI 这边做三件事:
- 用 Java 封装「运行某个 Skill 的脚本」为一个 Function/Tool(例如
runCodeReviewSkill、runDataAnalysisSkill)。 - 在 Function 内部,通过
ProcessBuilder调 Python 脚本,并把结果(评审报告 / 分析报告)作为字符串返回给模型。 - 在
ChatClient中声明这些函数为可调用工具,让 LLM 自己选用。
- 用 Java 封装「运行某个 Skill 的脚本」为一个 Function/Tool(例如
下面示例以「内部数据分析 Skill」为主,同时顺带演示代码评审 Skill 的挂载方式。
1. 封装 Skill 的 Java DTO 与 Tool
1.1 定义请求/响应模型
// DataAnalysisSkillRequest.java
public record DataAnalysisSkillRequest(String analysisRequest, String constraints) {}
// DataAnalysisSkillResponse.java
public record DataAnalysisSkillResponse(String reportText) {}
// CodeReviewSkillRequest.java
public record CodeReviewSkillRequest(String diffOrFiles, String context) {}
// CodeReviewSkillResponse.java
public record CodeReviewSkillResponse(String reviewReport) {}
Spring AI 会用这些类型自动生成函数的 JSON Schema,帮助 LLM 正确构造调用参数。
1.2 Tool 实现:调用 Python Skill 脚本
这里用「内部数据分析 Skill」举例,调用的是 run_query.py + clean_and_aggregate.py,然后再调用一个「汇总为报告」的小脚本,或者直接把 CSV 路径返回给 LLM 让它读内容(取决于你怎么暴露数据)。示例里用最简单的方式:把「分析意图」传给一个 Python wrapper 脚本,由它内部使用前面那两个脚本并生成最终报告文本。
com.example.ai.tools;
org.springframework.stereotype.Service;
java.io.BufferedReader;
java.io.InputStreamReader;
java.nio.charset.StandardCharsets;
{
;
DataAnalysisSkillResponse {
{
(
,
SKILL_BASE_DIR + ,
, request.analysisRequest(),
, request.constraints() == ? : request.constraints()
);
pb.redirectErrorStream();
pb.start();
();
( ( (process.getInputStream(), StandardCharsets.UTF_8))) {
String line;
((line = reader.readLine()) != ) {
output.append(line).append();
}
}
process.waitFor();
(exitCode != ) {
( + exitCode + + output);
}
(output.toString());
} (Exception e) {
( + e.getMessage());
}
}
}


