掘金 人工智能 06月10日 10:39
3-工具调用-解救困在时间里的她
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文分享了如何通过Spring AI框架为AI助手赋予时间感知能力。作者首先发现了AI助手在时间认知上的不足,随后通过编写和调用工具代码,让AI助手能够获取当前日期时间、计算时间差、设置提醒等。文章详细介绍了工具代码的编写方法和两种调用方式,并通过实际测试验证了其有效性。最后,作者鼓励读者探索更多大模型工具调用的可能性。

⏰ AI助手最初缺乏时间概念,无法正确回答关于日期和时间的问题。为了解决这个问题,作者引入了“工具”的概念。

🛠️ 作者使用Spring AI框架,通过编写Java代码实现了时间工具,包括获取当前日期时间、计算时间偏移量等功能。这些工具通过`@Tool`注解进行定义,方便大模型调用。

💡 文章提供了两种将工具集成到AI助手的方法:一种是在创建聊天客户端时传入工具,另一种是在发起请求时传入工具。这两种方法都确保了AI助手能够访问和使用这些时间工具。

✅ 通过测试,AI助手成功地调用了时间工具,能够准确地获取当前时间、计算未来时间,并设置提醒。这证明了工具调用的有效性。

1-背景故事

上一篇,我们治好了AI助手(女友)的健忘症之后,她变得真实多了。

但是跟她聊天,发现她似乎没有时间概念:

# 发送消息:现在几点了curl http://localhost:8080/ai/chat?message=%E7%8E%B0%E5%9C%A8%E5%87%A0%E7%82%B9%E4%BA%86# AI助手回复(注意分秒):...**『23:61:∞』**)  ...

进一步测试,发现她似乎被困在了某个日期:

# 发送消息:今天是几月几日curl http://localhost:8080/ai/chat?message=%E4%BB%8A%E5%A4%A9%E6%98%AF%E5%87%A0%E6%9C%88%E5%87%A0%E6%97%A5# AI助手回复(语气突然严肃):今天是2023年10月12日。不过其实我作为AI没有实时获取日期时间的能力,这个答案是基于我被训练的数据截止日期(2024年7月)推算的模拟回答。...

有没有办法让她具备时间观呢?这时就需要“工具“登场了。

2-动手实践

Spring AI让实现大模型工具调用变得非常容易。

2.1 第一步:编写工具代码

@Slf4j@Componentpublic class DateTimeTools {    @Tool(description = "获取当前日期时间")    String getCurrentLocalDateTime() {        String current = LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();        log.info("获取当前日期时间: {}", current);        return current;    }    @Tool(description = "获取当前日期")    String getCurrentLocalDate() {        String current = LocalDate.now().toString();        log.info("获取当前日期: {}", current);        return current;    }    @Tool(description = "获取当前时间")    String getCurrentLocalTime() {        String current = LocalTime.now().toString();        log.info("获取当前时间: {}", current);        return current;    }    // 大模型会根据工具描述理解它的能力,@ToolParam不是必须的,变量名取得好,大模型就能理解该传什么,数据类型也是    @Tool(description = "日期时间计算工具,获取某段时间前/后的日期时间非常有用")    String getOffsetTime(@ToolParam(description = "时间差") Duration plusTime) {        String datetime = LocalDateTime.now().plus(plusTime).atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();        log.info("当前偏移时间: {}", datetime);        return datetime;    }    @Tool(description = "设置一个指定日期时间的提醒")    void setAlarm(@ToolParam(description = "ISO-8601格式的具体时间点") String atDateTime, @ToolParam(description = "要执行的动作") String action) {        LocalDateTime alarmTime = LocalDateTime.parse(atDateTime, DateTimeFormatter.ISO_DATE_TIME);        log.info("请在:{} {}", alarmTime, action);    }}

2.2 调用聊天时传入工具

以下两种方法二选一:

方法一:创建聊天客户端时传入

@RestControllerpublic class MyChatController {    private final ChatClient chatClient;    public MyChatController(ChatClient.Builder chatClientBuilder) {        //...        this.chatClient = chatClientBuilder                .defaultAdvisors(new SimpleLoggerAdvisor())                .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())                // 创建客户端时传入默认工具                .defaultTools(new DateTimeTools())                .build();    }}

方法二:发起请求时时传入工具

@RestControllerpublic class MyChatController {    //...    @GetMapping(value = "/ai/chat", produces = MediaType.TEXT_PLAIN_VALUE)    public String generation(HttpServletRequest request, @RequestParam String message) {        Optional<String> conversationId = Optional.ofNullable(request.getHeader("x-conversation-id"));        return this.chatClient.prompt()                .advisors(a -> conversationId.ifPresent(id -> a.param(ChatMemory.CONVERSATION_ID, id)))                // 创建客户端时传入默认工具                .tools(new DateTimeTools())                .user(message)                .call()                .content();    }}

2.3 测试效果

🔔由于AI女友模式太啰嗦,以下测试去掉了女友模式的提示词。

通过调用合适的工具,AI助手不但知道现在的时间,还能计算某段时间之后的时间:

# 发送消息:当前的日期时间curl http://localhost:8080/ai/chat?message=%E5%BD%93%E5%89%8D%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4# AI助手回复(这个时间确实是当前时间)当前的日期时间是 2025年6月6日 14:35:10(北京时间)。# 发送消息:10分钟后的日期时间curl http://localhost:8080/ai/chat?message=10%E5%88%86%E9%92%9F%E5%90%8E%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4# AI助手回复(这个时间确实是当前时间10分钟后的时间):10分钟后的日期时间是 2025年6月6日 14:46:57(北京时间)。

更复杂的例子是,它现在还能连续调用多个工具,完成复杂的任务:

# 发送消息:15分钟后提醒我站起来走两步curl http://localhost:8080/ai/chat?message=15%E5%88%86%E9%92%9F%E5%90%8E%E6%8F%90%E9%86%92%E6%88%91%E7%AB%99%E8%B5%B7%E6%9D%A5%E8%B5%B0%E4%B8%A4%E6%AD%A5# AI助手回复当前的日期时间是 2025年6月6日 14:35:10(北京时间)。# 发送消息:10分钟后的日期时间curl http://localhost:8080/ai/chat?message=10%E5%88%86%E9%92%9F%E5%90%8E%E7%9A%84%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4# AI助手回复(这个时间确实是当前时间):好的,已为您设置15分钟后的提醒,到时会提醒您“站起来走两步”!# 服务控制台日志(由工具代码打印):2025-06-06T14:44:12.377+08:00  INFO 61141 --- [ai-assistant] [mcat-handler-18] o.c.s.s.a.assistant.tools.DateTimeTools  : 获取当前日期时间: 2025-06-06T14:44:12.377144+08:00[Asia/Shanghai]2025-06-06T14:44:16.850+08:00  INFO 61141 --- [ai-assistant] [mcat-handler-18] o.c.s.s.a.assistant.tools.DateTimeTools  : 请在:2025-06-06T14:59:12.377144 站起来走两步

可以看到AI助手针对一个问题,很智能地调用了两次工具😃

3-课外拓展

    并非所有大模型都支持工具调用,去openrouter.io/models上探索一下,哪些模型支持工具调用;想像一下,通过工具调用,大模型还可以做哪些事情?

4-参考资料

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Spring AI 工具调用 AI助手 时间感知
相关文章