Spring AI(三):如何在你的系统中深入嵌入AI-@Tool的使用

29 阅读4分钟

今天简单用了一下Spring AI中的工具化调用。现在很多传统行业的系统中想集成一些AI,或者想让跟用户的交流更加智能化,那我强烈推荐@Tool

这个工具在接收到用户的请求后,先是AI处理请求,判断是否有可调用的接口,如果有的话,就调用接口得到接口返回,然后再根据返回自己润色答案。因为其中请求以及返回内容都是AI模型控制,所以比传统接口要灵活的多。而且可以将AI深度嵌入到你的系统中,让你的系统更加智能化,从原理上可以通过对话实现你的系统中的绝大多数功能。

image.png

话不多说,看代码

@Tool(description = "该接口的功能")

核心代码只有这一行,在原来的接口上加上注解就能实现,AI会自动根据用户请求的内容判断是否需要调用接口

@Tool(description = "根据大类的编码获取名称")  
public String getClassNameByCode(String code) {  
    if(Objects.equals("system", code)){  
        return "系统";  
    }  
    if(Objects.equals("user", code)){  
        return "玩家";  
    }  
    return "";  
}

调用


String userText = """  
        告诉我编码为{code}的大类,名称是什么?  
        """;  
  
String response = ChatClient.create(this.chatModel)  
        .prompt()  
        .system("仅回答名称即可,比如名称是 大类 ,则仅回复大类,详细情况根据编码内容而定")  
        .user(userPrompt ->userPrompt  
                .text(userText)  
                .param("code",code))  
        .tools(new DouBaoChatServiceImpl())  
        .call()  
        .content();

最后得到结果

简单实现就是这样,不过为了测一下AI可以做到什么程度,咱们可以给他加需求,看他能不能连着调用两个接口

首先加上两个接口内容

1、根据大类名称获取编码

@Tool(description = "根据大类的名称获取编码")  
public String getClassCodeByName(String name) {  
    if(Objects.equals("系统", name)){  
        return "system";  
    }  
    if(Objects.equals("用户", name)){  
        return "user";  
    }  
    return "";  
}

2、根据编码获取q3季度比q4季度多盈利多少钱

@Tool(description = "根据编码获取q3季度比q4季度多盈利多少钱")
public Integer q3ToQ4(String code){  
    if(Objects.equals("system", code)){  
        return 1;  
    }  
    if(Objects.equals("user", code)){  
        return 2;  
    }  
    return 0;  
}

调用

String response = ChatClient.create(this.chatModel)  
        .prompt()  
        .user(userPrompt ->userPrompt  
                .text(userText))  
        .tools(new DouBaoChatServiceImpl())  
        .call()  
        .content();

然后问问题

帮我获取大类名称为系统的,q3比q4多赚多少钱

得到答案

根据查询结果,大类名称为"系统"(编码为"system")的Q3季度比Q4季度多赚了 **1元**。

完成

另外还可以加需求,我要求每次回答的时候后加上,“感谢您的付出”

改调用代码,加上系统的提示词。


String response = ChatClient.create(this.chatModel)  
        .prompt()  
        .system("请你在每次回答的时候,回复后加上,“感谢您的付出”")  
        .user(userPrompt ->userPrompt  
                .text(userText))  
        .tools(new DouBaoChatServiceImpl())  
        .call()  
        .content();

也加上需求,要求AI简单分析

帮我获取大类名称为系统的,q3比q4多赚多少钱,并且简单分析

得到答案

根据查询结果,我为您分析如下:  
  
**查询结果:**  
- 大类名称:系统  
- 大类编码:system  
- Q3比Q4多赚金额:1(单位)  
  
**简单分析:**  
1. **盈利情况**:系统大类在第三季度(Q3)比第四季度(Q4)多盈利1个单位。这表明Q3的盈利能力略高于Q4。  
  
2. **季度表现**   - Q3表现相对较好,盈利能力略胜一筹  
   - Q4盈利能力相对较弱,但差距不大  
   - 两个季度之间的盈利差异较小,仅为1个单位  
  
3. **可能影响因素**   - 季节性因素:某些系统类业务可能在Q3有更好的表现  
   - 市场环境:Q3可能处于业务旺季或需求高峰期  
   - 项目周期:系统类项目的交付和收款可能集中在Q3  
  
4. **建议**   - 分析Q4盈利能力下降的具体原因  
   - 考虑如何将Q3的成功经验应用到Q4  
   - 制定季节性调整策略以平衡全年盈利  
  
总体来看,系统大类的季度盈利表现相对稳定,Q3略优于Q4,但差异不大,整体经营状况较为平稳。  
  
感谢您的付出

完成

小结

AI的嵌入意味着系统的使用过程更加顺滑,对于客户更加友好。测试过程中,我试过在@Tool中加入错别字,或者问的时候问的简单一点,但是AI的理解能力还是比较强的,不管是处理用户信息,还是在调用系统本身接口的时候,都比较智能。

这个功能调用简单,但是确实是把AI深入嵌入到系统中了。我是一个开发,不是产品,但是我看到了无数种可能性。