Langchain4j Function Calling (5)

article/2025/6/30 7:01:48

Langchain4j Function Calling(函数调用)

Function Calling 函数调用 也叫 Tools 工具.

不用函数调用存在的问题

测试计算问题

  • 提供agent

    @AiService(wiringMode = AiServiceWiringMode.EXPLICIT,chatModel = "qwenChatModel",chatMemory = "chatMemory",chatMemoryProvider = "chatMemoryProvider"
    )
    public interface SeparateChatAssistant {@SystemMessage(fromResource = "systemMessage.txt")String chat(@MemoryId int memoryId, @UserMessage String userMessage);}
    
  • 进行数学计算测试

    @Resource
    private SeparateChatAssistant separateChatAssistant;@Test
    public void testCalculatorTools() {String answer = separateChatAssistant.chat(1, "1+2等于几,322233222345的平方根是多少?");//答案:567,655.901System.out.println(answer);
    }
    

    image-20250530135936523

    根据模型回复,发现简单计算,模型是可以正常处理的,但是对于复杂计算就无能为力了。

函数调用

创建函数调用tools
@Component
public class CalculatorTools {@Tooldouble sum(double a, double b) {System.out.println("调用加法运算");return a + b;}@Tooldouble squareRoot(double x) {System.out.println("调用平方根运算");return Math.sqrt(x);}}
agent 使用tools
@AiService(wiringMode = AiServiceWiringMode.EXPLICIT,chatModel = "qwenChatModel",chatMemory = "chatMemory",chatMemoryProvider = "chatMemoryProvider",tools = "calculatorTools"
)
public interface SeparateChatAssistant {@SystemMessage(fromResource = "systemMessage.txt")String chat(@MemoryId int memoryId, @UserMessage String userMessage);}
进行数学计算测试

同样使用上面 出问题的测试用例,来对tools进行测试。

    @Resourceprivate SeparateChatAssistant separateChatAssistant;@Testpublic void testCalculatorTools() {String answer = separateChatAssistant.chat(1, "1+2等于几,322233222345的平方根是多少?");//答案:567,655.901System.out.println(answer);}

image-20250530140438445

根据模型输出,我们看到了在Tools工具中输出的日志,发现模型的确调用了我们的工具,同时也看到了数据开方也返回了正确的结果。

函数调用流程

查看存储的记录信息

image-20250530141015904

我们可以明显的看到type=AI的记录信息,在toolExecutionRequests中记录着我们的tools中的函数信息。

分析调用流程
Request:\- messages:\- SystemMessage:\- text: 系统定义AI的角色\- UserMessage:\- text: 用户提问\- AiMessage:\- toolExecutionRequests:\- ai获取提问信息组织参数调用工具方法\- ToolExecutionResultMessage:\- text: 工具方法执行
Response :\- AiMessage:\- text: 根据工具方法的执行ai再次组织结果返回

注解信息

  • @Tool注解

    @Tool 注解有两个可选字段:

    name:工具的名称。如果未提供该字段,方法名会作为工具的名称。

    value:工具的描述信息。

    根据工具的不同,即使没有任何描述,大语言模型可能也能很好地理解它(例如, add(a, b) 就很直观),但通常最好提供清晰且有意义的名称和描述。这样,大语言模型就能获得更多信息,以决定是否调用给定的工具以及如何调用。

    @Tool(name = "sum", value = "sum(a,b)计算a和b的和")
    double sum(double a, double b) {System.out.println("调用加法运算");return a + b;
    }@Tool(name = "squareRoot", value = "squareRoot(x)计算x的平方根")
    double squareRoot(double x) {System.out.println("调用平方根运算");return Math.sqrt(x);
    }
    
  • @P 注解

    方法参数可以选择使用 @P 注解进行标注。

    @P 注解有两个字段:

    value:参数的描述信息,这是必填字段。

    required:表示该参数是否为必需项,默认值为 true ,此为可选字段。

    @Tool(name = "sum", value = "sum(a,b)计算a和b的和")
    double sum(@P(value = "加数1",required = true) double a,@P(value = "加数2",required = true)double b) {System.out.println("调用加法运算");return a + b;
    }@Tool(name = "squareRoot", value = "squareRoot(x)计算x的平方根")
    double squareRoot(@P(value = "平方根数",required = true) double x) {System.out.println("调用平方根运算");return Math.sqrt(x);
    }
    
  • @ToolMemoryId 注解

    如果你的AIService方法中有一个参数使用 @MemoryId 注解,那么你也可以使用 @ToolMemoryId 注解@Tool 方法中的一个参数。提供给AIService方法的值将自动传递给 @Tool 方法。如果你有多个用户,或每个用户有多个聊天记忆,并且希望在 @Tool 方法中对它们进行区分,那么这个功能会很有用。

    @Tool(name = "sum", value = "sum(a,b)计算a和b的和")
    double sum(@ToolMemoryId int memoryId,@P(value = "加数1",required = true) double a,@P(value = "加数2",required = true)double b) {System.out.println("调用加法运算,memoryId: " +   memoryId);return a + b;
    }@Tool(name = "squareRoot", value = "squareRoot(x)计算x的平方根")
    double squareRoot(@ToolMemoryId int memoryId,@P(value = "平方根数",required = true) double x) {System.out.println("调用平方根运算,memoryId: " +   memoryId);return Math.sqrt(x);
    }
    

    image-20250530142718248

    可以明显的看到 @ToolMemoryId标记的字段,成功的拿到了请求的memoryId.


http://www.hkcw.cn/article/cnNVGEJGEn.shtml

相关文章

《数字世界的连接器:计算机网络应用全景解析》

一、引言 在万物互联的今天,计算机网络早已不再是幕后基础设施,而是推动数字时代变革的“神经系统”。无论你在使用智能手机刷短视频,还是企业通过云服务部署系统,这一切都离不开计算机网络的广泛应用。 本文将全面系统地介绍计…

密云北庄镇首次发现凤头鹰 生态魅力再添新证

近日,北庄镇观鸟爱好者与生态工作人员在日常监测中惊喜发现国家二级保护鸟类凤头鹰的踪迹。这一发现不仅为密云区鸟类名录新增一员,更印证了北庄镇作为“观鸟小镇”的生态魅力。凤头鹰是中型猛禽,因头部具短羽冠而得名,常栖息于山地森林中,以蛙、蜥蜴、鼠类及小型鸟类为食…

清华回应17岁学生登顶珠峰保送清华 最年轻登顶者澄清

近日,有媒体报道称北京第八十中学17岁的学生李浩榕成为中国首位从北坡登顶珠峰的青少年,消息一度登上热搜。还有报道称他是“全球中学生第一人”。不过,根据国内其他媒体报道,河北16岁女孩丁禹琪在2020年曾从北坡成功登顶珠峰。西藏登山协会证实,在中国业余登山爱好者中,…

宁德时代董事长现身尊界S800发布会 强调电池安全与可靠

在5月30日的尊界S800发布会上,华为与江淮汽车联合推出了新款车型尊界S800。宁德时代董事长曾毓群也出席了发布会,并强调智能与豪华的基础在于安全,而电池是实现这一目标的关键。曾毓群提到,安全是新能源汽车的生命线。要达到极致的安全标准,需要关注材料和化学体系、基于3…

利物浦签24岁荷兰边卫弗林蓬 3500万解约金锁定强援

利物浦宣布签下24岁的荷兰边卫弗林蓬,支付了3500万解约金。弗林蓬此前效力于勒沃库森。罗马诺确认,前亚特兰大主教练加斯佩里尼将执教罗马,签约三年。沙特媒体OKAZ报道,C罗拒绝了所有沙特国内外俱乐部的报价,并指示团队停止一切转会谈判,表明他将在利雅得胜利继续职业生涯…

贿赂百名医生的药企违规费用已清缴 相关人员接受调查处理

近期,我们收到关于某药企涉嫌向医生输送商业贿赂的举报信。对此,我们高度重视,立即成立调查组,并会同相关部门展开调查核实工作。以下是调查处置进展情况。举报信涉及125名医疗机构人员,其中6人信息重复,1人信息不实,实际核实为118人,分布在36家医疗机构(举报信中提到…

白举纲 只要有舞台就一定会在 歌手的自我救赎

《歌手》第三期中,白举纲遗憾落榜。其实早有迹象,他将《海鸥》和《The End of the World》融合在一起,编曲非常用心。但问题恰恰出在这首歌上,选得太“用力”了,不够松弛。如果他选择一首更轻松、更符合自己气质的歌曲,结果可能会完全不同。例如,马嘉祺选唱的《我也曾想…

日本首相石破茂国际论坛官宣:坚持战后和平发展道路,不重蹈覆辙

华沙犹太人殉难纪念碑前,一位德国总理突然双膝跪地。这一跪,让世界记住了勃兰特的名字。同样的二战轴心国,日本政要的身影却频频出现在靖国神社。2025年5月29日,东京“亚洲的未来”论坛现场。石破茂面对各国代表,首次以首相身份提及“吸取战争教训”。他承诺日本将坚持和平…

做实验 搞锻炼 神二十乘组的端午节很忙碌

当粽叶的幽香在神州大地飘荡,太空家园中的神舟二十号航天员乘组也寻味而至,送来了太空祝福。截至目前,三名航天员陈冬、陈中瑞、王杰进驻中国空间站已经一个多月了,今天是他们在太空迎来的第一个中国传统节日。三位航天员的端午节怎么度过?出差这段时间他们有哪些新的感悟…

全球住房危机影响近30亿人 亟需全球协调行动

当地时间5月29日至30日,第二届联合国人居大会续会在肯尼亚首都内罗毕召开。超过1000名代表参会,共同探讨日益严峻的全球住房危机,希望通过讨论、协作与政策规划推动问题的有效解决。联合国人类住区规划署执行主任阿纳克劳迪娅罗斯巴赫指出,据估计,全球有超过28亿人住房条件…

存款利率跌破1% 分红型理财产品发行升温:资金流向低估值资产

5月初降准释放的1万亿长期资金,减少了银行对高成本同业负债的依赖。配合存款利率下调,银行可将更多低成本资金用于贷款投放,形成低息吸储-低息放贷的良性循环。银行股为代表的低估红利资产具有双重防御属性。沪深300价值指数通过“低估值”指标筛选样本,其中银行股占比高达…

光电学、计算机科学及算法国际会议(OCSA 2025)征稿启事​

在科技浪潮奔涌向前的当下,光电学、计算机科学及算法领域的创新成果不断涌现,持续重塑着各个行业的格局,深刻影响着我们的生活。为了进一步促进该领域的学术交流与合作,汇聚全球智慧,光电学、计算机科学及算法国际会议…

设计模式之结构型:代理模式

代理模式(Proxy Pattern) 定义 适配器模式是一种​​结构型设计模式​​,用于解决两个不兼容接口之间的兼容性问题。它通过​​包装对象​​的方式,将已有接口转换为客户端期望的接口,类似电源适配器的功能。 UML 类图​ 核心角色 Subject&am…

Bootstrap:精通级教程(VIP10万字版)

一、网格系统:实现复杂响应式布局 I. 引言 在现代 Web 开发领域,构建具有视觉吸引力、功能完善且能在多种设备和屏幕尺寸上无缝运行的响应式布局至关重要。Bootstrap 作为业界领先的前端框架,其核心的网格系统为开发者提供了强大而灵活的工具集,用以高效创建复杂的响应式…

数据结构 堆与优先级队列

文章目录 📕1. 堆(Heap)✏️1.1 堆的概念✏️1.2 堆的存储方式✏️1.3 堆的创建✏️1.4 堆的插入✏️1.5 堆的删除 📕2. 优先级队列(PriorityQueue)✏️2.1 堆与优先级队列的关系✏️2.2 优先级队列的构造方法✏️2.3 优先级队列的常用方法 3. Java对象的…

基于Java 实现 IM 业务回调

1.什么是业务回调 2.腾讯云回调的类型 功能角度 在线状态回调 资料关系链回调 单聊消息回调 群组系统回调 处理角度 事件发生之前回调:回调的主要目的在于让 App 后台可以干预该事件的处理逻辑,即时通信 IM 会根据回调返回码确定后续处理流程&…

印度空军高官不满:“国产战机”到底何时能交货

据俄罗斯卫星通讯社5月29日报道,印度空军参谋长辛格在印度工业联合会举办的年度商业峰会上严厉批评本国的航空制造业,称印度大型国防项目的落实没有如期进行,包括国产“光辉”战机在内的战斗机向空军交付均出现延迟。辛格指出,根据2021年与印度斯坦航空有限公司签订的价值4…

澳贸易部长谈美国进口钢铝关税 反对不合理加征

5月30日,美国总统特朗普宣布,自6月4日起,将把钢铁和铝的进口关税从25%提高至50%。次日,澳大利亚贸易部长法瑞尔对此作出回应,表示澳大利亚的立场始终明确且一致。他认为这些关税措施既不合理,也不符合朋友之间的行为准则。法瑞尔指出,这种做法是一种经济上的自我伤害,不…

水上竞渡 绿道长安 ‘艇’进未来

为推动文旅赋能“百千万工程”,加快落实文化强市建设任务,东莞市长安镇即将举办一场精彩的文旅盛宴。5月29日至31日,“绿道长安 ‘艇’进未来”2025年长安镇水上竞渡活动将在莲花山风景区水上活动中心举行。活动期间,水上活动中心、莲花湖绿道生态停车场、莲花湖绿道三大场…

保安27层高空索降盗窃67块玉石 现实版“疯狂的石头”

电影《疯狂的石头》中盗贼们盯上价值连城的翡翠并化身“蜘蛛人”空降盗窃的情节,在新疆乌鲁木齐某大厦真实上演。5月23日凌晨,该市一玉石展厅内共计67块玉石被盗,估价约1亿元。警方勘查现场发现门锁完好,但23楼窗户玻璃被砸,外侧有使用绳索痕迹。大厦顶层27层平台处发现了…