news 2026/4/3 4:18:26

Spring AI Alibaba 的 ChatClient 工具注册与 Function Calling 实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring AI Alibaba 的 ChatClient 工具注册与 Function Calling 实践

Spring AI Alibaba 的 ChatClient 工具注册与 Function Calling 实践总结

在实际使用 Spring AI 进行聊天应用开发时,碰到工具(Tool)注册、函数调用(Function Calling)以及
ChatClient 配置
的问题。本文将总结从源码到实践的一些经验和知识点,帮助你更高效地集成 AI 聊天功能。


1. ChatClient Builder 的核心方法

Spring AI 提供了ChatClient.Builder,用于构建一个可用的 AI 聊天客户端。常用方法包括:

  • 默认系统提示
.defaultSystem(AiPrompts.GENERAL_ASSISTANT)
  • 默认会话记忆顾问
.defaultAdvisors(MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).build()).build())
  • 工具注册
.defaultTools(...)// 注册对象实例.defaultToolNames(...)// 注册 Spring Bean 名称对应的工具.tool(...)// 注册 @Tool 注解方法

注意:.defaultTools().defaultToolNames()的作用不同,稍后详细说明。


2. Function Calling 与工具注册

Spring AI 支持把 Spring Bean 自动注册为 AI 可调用的函数(function calling)。常用方式有两种:

2.1 Bean + Supplier / Function

@Bean@Description("查询所有学生信息")publicSupplier<List<Student>>getAllStudents(){return()->studentInfoService.selectStudentInfoList(newStudent());}@Bean@Description("根据学生ID查询学生信息")publicFunction<Long,Student>getStudentById(){returnstudentId->studentInfoService.selectStudentInfoByStudentId(studentId);}
  • Supplier:无入参,返回值为工具输出。
  • Function<T, R>:有入参T,返回值为工具输出R
  • 通过.defaultToolNames("getAllStudents")自动注册,AI 可以直接调用。

2.2 @Tool 注解方法

@Tool(name="getAllStudents",description="查询所有学生信息")publicList<Student>getAllStudents(){returnstudentInfoService.selectStudentInfoList(newStudent());}
  • 适用于更标准的 function calling 方式
  • 需要使用.defaultTools()注册

3..defaultTools().defaultToolNames()区别

方法适用场景注意点
.defaultTools(Object... tools)注册对象实例(Lambda、工具对象)如果 Lambda 没有@Tool注解,会报错 “No @Tool annotated methods found”,需要使用.toolCallbacks()
.defaultToolNames(String... beanNames)自动注册 Spring 上下文中 Bean 名称对应的工具只能识别 Bean 名称对应的 Supplier / Function 或@Tool方法
.toolCallbacks()注册@Tool注解方法或ToolCallback支持标准 function-calling

✅ 结论:

  • Supplier / Function Bean → 推荐.defaultToolNames()
  • 普通方法 + @Tool 注解 →.defaultTools()

4. 自动收集 Bean 注册工具

在实际项目中,如果工具数量较多,不希望手动写.defaultToolNames(...),可以通过循环自动收集:

Map<String,Supplier>supplierBeans=applicationContext.getBeansOfType(Supplier.class);Map<String,Function>functionBeans=applicationContext.getBeansOfType(Function.class);Set<String>allToolNames=supplierBeans.keySet().stream().collect(Collectors.toSet());allToolNames.addAll(functionBeans.keySet());ChatClientclient=ChatClient.builder(chatModel).defaultSystem("你是智能助手").defaultAdvisors(...).defaultToolNames(allToolNames.toArray(newString[0])).build();
  • 自动扫描 Spring 上下文的所有 Supplier / Function Bean
  • 避免手动列出工具名称
  • 保持 ChatClient 配置简洁

5. Supplier 与 Function 区别

类型参数返回值使用场景
Supplier<R>R无输入参数工具,直接返回结果
Function<T, R>TR需要输入参数的工具,例如根据 ID 查询对象

示例:

Supplier<List<Student>>getAllStudents;// 无入参Function<Long,Student>getStudentById;// 入参为学生ID


本文记录于 MindCampus 毕设项目开发过程中,2024年12月,如果对你有帮助不妨留一个赞

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 1:29:42

35岁程序员都去干什么了?答案藏在AI里:大模型正成为他们经验复用的最大红利(附转型指南)

曾几何时&#xff0c;互联网行业中企业频繁对35岁以上资深程序员进行优化调整——只因IT技术迭代速度堪称“日新月异”&#xff0c;相较于年轻从业者&#xff0c;35程序员常被贴上“学习新技能效率放缓、精力难以支撑高强度工作、无法长期熬夜加班写代码”的标签。也正因如此&a…

作者头像 李华
网站建设 2026/3/30 20:12:06

InstructPix2Pix图像编辑实战指南:从零开始掌握AI图像处理

想要用文字指令就能轻松编辑图片吗&#xff1f;InstructPix2Pix这款强大的图像编辑工具让你的创意触手可及&#xff01;无论是将普通照片变成赛博朋克风格&#xff0c;还是给人物添加酷炫特效&#xff0c;这款AI模型都能帮你实现。今天我们就来聊聊如何快速上手这个神奇的图像编…

作者头像 李华
网站建设 2026/4/2 8:37:03

【每日一题】讲讲PCIe链路训练和枚举的前后关系

几天前我们一篇文章《一文讲懂主机启动时是如何给每个PCIe外设分配BDF的》&#xff0c;有工程师留言问&#xff1a;电脑加电启动的时候&#xff0c;PCIe是全部训练完再枚举&#xff0c;还是训练一个枚举一个&#xff1f; 我们这里结论先说&#xff1a;PCIe 在系统加电启动&…

作者头像 李华
网站建设 2026/4/1 4:51:04

matRad开源放射治疗计划系统:Matlab平台的完整实践指南

matRad开源放射治疗计划系统&#xff1a;Matlab平台的完整实践指南 【免费下载链接】matRad An open source multi-modality radiation treatment planning sytem 项目地址: https://gitcode.com/gh_mirrors/ma/matRad matRad是一款基于Matlab开发的开源多模态放射治疗计…

作者头像 李华
网站建设 2026/3/31 6:11:29

云服务器成本控制:实现高效运营的智慧之选

在数字化转型的漫漫征程中&#xff0c;企业犹如一艘在波涛汹涌的市场海洋中航行的船只&#xff0c;不仅要时刻关注前方的航向和速度&#xff0c;确保云服务器的性能和安全性&#xff0c;以应对各种风浪和挑战&#xff1b;还要精心把控船只的燃料消耗和物资储备&#xff0c;注重…

作者头像 李华
网站建设 2026/3/31 8:21:46

GIF在线制作工具:3分钟轻松合成创意动图

在当今视觉内容为主导的数字时代&#xff0c;动图已成为表达情感、展示产品和分享创意的热门方式。无论你是社交媒体运营者、内容创作者还是普通用户&#xff0c;一款简单易用的GIF在线制作工具都能极大提升你的工作效率和创意表达。今天&#xff0c;我们将详细介绍如何通过GIF…

作者头像 李华