工具调用——即AI模型调用应用程序定义的函数并根据其结果采取行动的能力——是智能体型AI系统的核心构建模块。只能生成文本的模型只是聊天机器人;而能够发现信息、采取行动并循环执行直至达成目标的模型才是智能体。
一、目的
工具主要用于两个广泛的目的:
- 信息检索——通过数据库、网络服务、文件系统或搜索引擎中的数据来扩充模型的知识。示例:获取当前天气、查询客户记录、查阅最新新闻。
- 采取行动— 在您的系统中执行操作。示例:发送电子邮件、预订航班、更新记录、触发工作流
二、简单例子
1、定义工具
public class MyTools {@Tool(description = "获取当前的时间,")String getCurrentDateTime() {return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}}
2、使用工具
@GetMapping("/ask6")public String ask6(String topic){String result = openaiChatClient.prompt().user(u -> u.text("{topic}").param("topic",topic)).tools(new MyTools()).call().content();return result;}
这样请求的时候看日志就会发送进行了多轮请求,大模型发现需要调用工具然后把调用工具的内容要求返回给springAI,springAI通过模型给的参数对工具进行调用再将结果返回给大模型。
三、补充
为啥在日志里面没有看到SpringAI将工具发送给大模型的日志?
springAI 默认不会打印【发给模型的 function /tools schema 报文】,你看到的 SimpleLoggerAdvisor 只打印组装好的 Prompt 消息列表(messages),工具定义(functions)不属于 Message,不在 messages 里面,所以这个日志看不到工具描述、schema。
把 functions 塞到 ChatOptions(也就是你日志里的 OpenAiChatOptions@b45af8c8)
传给大模型的完整请求体结构是这样(OpenAI 协议)
{"messages": [ ... ],"tools": [{"type": "function","function": {"name": "getCurrentDateTime","description": "获取当前的时间","parameters": { "type":"object","properties":{} }}}]}
