之前做个几个大模型的应用,都是使用Python语言,后来有一个项目使用了Java,并使用了Spring AI框架。随着Spring AI不断地完善,最近它发布了1.0正式版,意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说真是一个福音,其功能已经能满足基于大模型开发企业级应用。借着这次机会,给大家分享一下Spring AI框架。
注意:由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 Spring AI-1.0.0,JDK版本使用的是19,Spring-AI-Alibaba-1.0.0.3-SNAPSHOT。
代码参考: https://github.com/forever1986/springai-study
在《Spring AI 系列之六 - 工具调用》中讲了Spring AI的工具集成,但是Spring AI只是提供的工具的集成框架,对于现有工具几乎没有。不过好在Spring AI Alibaba弥补了这一部分的空缺,在Spring AI Alibaba中,对于工具集成也已经形成了一个较好的生态。这一章将讲一下Spring AI Alibaba的工具集成。
1 Tool Calling
1.1 Tool Calling集成
虽然现在已经有了MCP,但是工具的调用对于大模型来说还是非常重要的。Spring AI Alibaba 社区提供了很多 Tool Calling 扩展实现,方便开发者通过声明的方式直接开启插件,避免重复开发的麻烦。
以下是截止到目前为止实现的一些解析插件(版本号截止到目前为止,亲测有效):
工具说明 | 工具名称 | 配置前缀及说明 | Maven依赖 | 版本 |
---|---|---|---|---|
阿里云机器翻译 | aliTranslateService | spring.ai.alibaba.toolcalling.alitranslate enabled:设置为true时启动插件。 access-key-id:服务的AccessKeyId,若不提供则读取系统环境变量ALITRANSLATE_ACCESS_KEY_ID的值。 secret-key:服务的SecretKey,若不提供则读取系统环境变量ALITRANSLATE_ACCESS_KEY_SECRET的值。 | spring-ai-alibaba-starter-tool-calling-alitranslate | 1.0.0.3-SNAPSHOT |
高德地图获取城市天气 | gaoDeGetAddressWeather | spring.ai.alibaba.toolcalling.amap enabled:设置为true时启动插件。 api-key:高德地图服务的ApiKey,若不提供则读取系统环境变量GAODE_AMAP_API_KEY的值。 | spring-ai-alibaba-starter-tool-calling-amap | 1.0.0.3-SNAPSHOT |
百度地图 | baiduMapGetAddressInformation:获取地址详细信息 baiDuMapGetAddressWeatherInformation:获取城市天气 | spring.ai.alibaba.toolcalling.baidu.map enabled:设置为true时启动插件。 api-key:百度地图服务的ApiKey,若不提供则读取系统环境变量BAIDU_MAP_API_KEY的值。 | spring-ai-alibaba-starter-tool-calling-baidumap | 1.0.0.3-SNAPSHOT |
百度搜索 | baiduSearch | spring.ai.alibaba.toolcalling.baidu.search enabled:设置为true时启动插件。 | spring-ai-alibaba-starter-tool-calling-baidusearch | 1.0.0.3-SNAPSHOT |
百度翻译 | baiduTranslate | spring.ai.alibaba.toolcalling.baidu.translate enabled:设置为true时启动插件。 secret-key:百度翻译服务的SecretKey,若不提供则读取系统环境变量BAIDU_TRANSLATE_SECRET_KEY的值。 app-id:百度翻译服务的AppId,若不提供则读取系统环境变量BAIDU_TRANSLATE_APP_ID的值。 | spring-ai-alibaba-starter-tool-calling-baidutranslate | 1.0.0.3-SNAPSHOT |
必应搜索 | bingSearch | spring.ai.alibaba.toolcalling.bingsearch enabled:设置为true时启动插件。 token:必应服务的Token,若不提供则读取系统环境变量BING_SEARCH_TOKEN的值。 | spring-ai-alibaba-starter-tool-calling-bingsearch | 1.0.0.2 |
钉钉群发消息 | dingTalkGroupSendMessageByCustomRobot | spring.ai.alibaba.toolcalling.dingtalk enabled:设置为true时启动插件。 custom-robot-access-token:自定义机器人的AccessToken,必须提供。 custom-robot-signature:自定义机器人的Signature,必须提供。 | spring-ai-alibaba-starter-tool-calling-dingtalk | 1.0.0.3-SNAPSHOT |
DuckDuckGo 查询最近新闻 | duckDuckGoQueryNews | spring.ai.alibaba.toolcalling.duckduckgo enabled:设置为true时启动插件。 api-key:Serpapi服务的ApiKey,若不提供则读取系统环境变量SERPAPI_KEY的值。 | spring-ai-alibaba-starter-tool-calling-duckduckgo | 1.0.0.3-SNAPSHOT |
GitHub Tool Kits | getIssue :获取 GitHub 某个仓库的 Issue 信息 createPullRequest :在 GitHub 某个仓库创建 PR SearchRepository :查询 GitHub 某个名称的仓库信息 | spring.ai.alibaba.toolcalling.githubtoolkit enabled:设置为true时启动插件。 token:GitHub的Token,若不提供则读取系统环境变量GITHUB_TOKEN。 owner:要查询的仓库所有者,必须设置。 repository:要查询的仓库名称,必须设置。 | pring-ai-alibaba-starter-tool-calling-githubtoolkit | 1.0.0.3-SNAPSHOT |
谷歌翻译 | googleTranslate | spring.ai.alibaba.toolcalling.googletranslate enabled:设置为true时启动插件。 api-key:谷歌翻译的ApiKey,若不提供则读取系统环境变量GOOGLE_TRANSLATE_APIKEY。 | spring-ai-alibaba-starter-tool-calling-googletranslate | 1.0.0.3-SNAPSHOT |
JSON 处理工具 | jsonInsertPropertyFieldFunction:给一个 JSON 对象添加字段值。 jsonParsePropertyFunction:获取 JSON 对象某个字段的值。 jsonRemovePropertyFieldFunction:删除 JSON 对象某个字段。 jsonReplacePropertyFiledValueFunction: 替换 JSON 对象某个字段的值。 | spring.ai.alibaba.toolcalling.jsonprocessor enabled:设置为true时启动插件。 | spring-ai-alibaba-starter-tool-calling-jsonprocessor | 1.0.0.3-SNAPSHOT |
快递100查询快递信息 | queryTrack | spring.ai.alibaba.toolcalling.kuaidi100 enabled:设置为true时启动插件。 api-key:快递100的ApiKey,若不提供则读取系统环境变量KUAIDI100_KEY的值。 app-id:快递100的AppId,若不提供则读取系统环境变量KUAIDI100_CUSTOMER的值。 | spring-ai-alibaba-starter-tool-calling-kuaidi100 | 1.0.0.3-SNAPSHOT |
飞书文档 | larksuiteCreateDocFunction:创建文档 larksuiteChatFunction:发送聊天消息 larksuiteCreateSheetFunction:创建工作表 | spring.ai.alibaba.toolcalling.larksuite enabled:设置为true时启动插件。 app-id:飞书的AppId,必须提供。 app-secret:飞书的AppSecret,必须提供。 | spring-ai-alibaba-starter-tool-calling-larksuite | 1.0.0.3-SNAPSHOT |
微软翻译 | microSoftTranslateFunction | spring.ai.alibaba.toolcalling.microsofttranslate enabled:设置为true时启动插件。 api-key:微软翻译的ApiKey,若不提供则读取系统环境变量MICROSOFT_TRANSLATE_API_KEY的值。 region:为请求头Ocp-Apim-Subscription-Region的值,必须提供。 | spring-ai-alibaba-starter-tool-calling-microsofttranslate | 1.0.0.3-SNAPSHOT |
正则表达式查询 | regexFindAll | spring.ai.alibaba.toolcalling.regex enabled:设置为true时启动插件。 | spring-ai-alibaba-starter-tool-calling-regex | 1.0.0.3-SNAPSHOT |
敏感信息过滤 | sensitiveFilter | spring.ai.alibaba.toolcalling.sensitivefilter enabled:设置为true时启动插件。 replacement:用来替换敏感信息的字符串,默认为"***"。 filterPhoneNumber:是否过滤电话号码,默认为true。 filterIdCard:是否过滤 ID 卡号,默认为true。 filterBankCard:是否过滤银行卡号,默认为true。 filterEmail:是否过滤邮箱地址,默认为true。 | spring-ai-alibaba-starter-tool-calling-sensitivefilter | 1.0.0.3-SNAPSHOT |
Serpai 查询 | serpApiSearch | spring.ai.alibaba.toolcalling.serpapi enabled:设置为true时启动插件。 api-key:Serpapi服务的ApiKey,若不提供则读取系统环境变量SERPAPI_KEY的值。 engine:选择使用的搜索引擎,必填。 | spring-ai-alibaba-starter-tool-calling-serpapi | |
新浪新闻 | getSinaNews | spring.ai.alibaba.toolcalling.sinanews enabled:设置为true时启动插件。 | spring-ai-alibaba-starter-tool-calling-sinanews | 1.0.0.3-SNAPSHOT |
Tavily Search | tavilySearch | spring.ai.alibaba.toolcalling.tavilysearch enabled:设置为true时启动插件。 api-key:Tavily Search 的ApiKey,若不提供则读取系统环境变量TAVILY_SEARCH_API_KEY的值。 | spring-ai-alibaba-starter-tool-calling-tavilysearch | |
获取某个时区时间 | getCityTimeFunction | spring.ai.alibaba.toolcalling.time enabled:设置为true时启动插件。 | spring-ai-alibaba-starter-tool-calling-time | 1.0.0.3-SNAPSHOT |
今日头条 | getToutiaoNews | spring.ai.alibaba.toolcalling.toutiaonews enabled:设置为true时启动插件。 | spring-ai-alibaba-starter-tool-calling-toutiaonews | 1.0.0.3-SNAPSHOT |
Weather Api 获取城市天气 | getWeatherService | spring.ai.alibaba.toolcalling.weather enabled:设置为true时启动插件。 api-key:服务的ApiKey,若不提供则读取系统环境变量WEATHER_API_KEY的值。 | spring-ai-alibaba-starter-tool-calling-weather | 1.0.0.3-SNAPSHOT |
有道翻译 | youdaoTranslate | spring.ai.alibaba.toolcalling.youdaotranslate enabled:设置为true时启动插件。 secret-key:有道翻译的AppSecret,若不提供则读取系统环境变量YOUDAO_APP_SECRET的值。 app-id:有道翻译的AppId,若不提供则读取系统环境变量YOUDAO_APP_ID的值。 | spring-ai-alibaba-starter-tool-calling-youdaotranslate | 1.0.0.3-SNAPSHOT |
语雀 | createYuqueDoc:创建语雀文档。 createYuqueBook:创建语雀Book知识库。 updateDocService:更新语雀文档。 deleteDocService:删除语雀文档。 | spring.ai.alibaba.toolcalling.yuque enabled:设置为true时启动插件。 token,语雀的Token,必须设置。 | spring-ai-alibaba-starter-tool-calling-yuque | 1.0.0.3-SNAPSHOT |
1.2 示例演示
代码参考lesson29子模块
示例说明:通过引入百度搜索(baiduSearch)工具,实现在线查询功能,(注意:这里使用的是智谱的大模型,非阿里大模型)
1)在lesson29子模块的pom中引入:
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-tool-calling-baidusearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2)新建application.properties配置文件
# 聊天模型
spring.ai.zhipuai.api-key=你的智谱API KEY
spring.ai.zhipuai.chat.options.model=GLM-4-Flash-250414
spring.ai.zhipuai.chat.options.temperature=0.7
# 百度配置
spring.ai.alibaba.toolcalling.baidu.search.enabled=true
3)创建BaiduSearchController演示类
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BaiduSearchController {
private ChatClient chatClient;
public BaiduSearchController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder
.defaultToolNames("baiduSearch")
.build();
}
/**
* @param message 问题
*/
@GetMapping("/ai/baidu")
public String baidu(@RequestParam(value = "message", defaultValue = "从百度搜索中查找北京天气?", required = true) String message) {
return this.chatClient.prompt()
.user(message)
.call()
.content();
}
}
4)创建Lesson29Application 启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Lesson29Application {
public static void main(String[] args) {
SpringApplication.run(Lesson29Application.class, args);
}
}
5)演示效果
http://localhost:8080/ai/baidu
结语:本章讲解了Spring AI Alibaba的Tool Calling的生态,可以看出在Spring AI的基础上,Spring AI Alibaba扩展了很多插件,这样也是丰富了Spring AI的生态,对于java用户来说是一个很好的福音。
Spring AI系列上一章:《Spring AI 系列之三十七 - Spring AI Alibaba-DocumentReader》
Spring AI系列下一章:《Spring AI 系列之三十九 - Spring AI Alibaba-集成百炼知识库》