LangChain4j +DeepSeek大模型应用开发——8 Function Calling 函数调用

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

入门案例

例如,大语言模型本身并不擅长数学运算。如果应用场景中偶尔会涉及到数学计算,我们可以**为他提供一个 “数学工具”。**当我们提出问题时,大语言模型会判断是否使用某个工具。

创建工具类

@Tool 注解的方法:

  • 既可以是静态的,也可以是非静态的;
  • 可以具有任何可见性(公有、私有等)。
package com.atguigu.java.ai.langchain4j.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);}
}
配置工具类

SeparateChatAssistant中添加tools属性配置

@AiService(wiringMode = EXPLICIT,chatModel = "qwenChatModel",chatMemoryProvider = "chatMemoryProvider",tools = "calculatorTools" //配置tools
)
测试工具类

添加了tools属性后,AI就能自动根据我们写的函数进行相应计算

package com.atguigu.java.ai.langchain4j;@SpringBootTest
public class ToolsTest {@Autowiredprivate SeparateChatAssistant separateChatAssistant;@Testpublic void testCalculatorTools() {String answer = separateChatAssistant.chat(1, "1+2等于几,475695037565的平方根是多少?");//答案:3,689706.4865System.out.println(answer);}
}

测试后可以查看持久化存储中SYSTEM、USER、AI以及Tools的消息,分析tools的调用流程:

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

@Tool 可选字段

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

  • name(工具名称):工具的名称。如果未提供该字段,方法名会作为工具的名称。
  • value(工具描述):工具的描述信息。

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

@P 注解

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

@P 注解有两个字段:

  • value:参数的描述信息,这是必填字段。
  • required:表示该参数是否为必需项,默认值为 true,此为可选字段。

@ToolMemoryId

如果你的AIService方法中有一个参数使用 @MemoryId 注解,那么你也可以使用 @ToolMemoryId 注解 @Tool标记的 方法中的一个参数。

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

package com.atguigu.java.ai.langchain4j.tools;public class CalculatorTools {@Tool(name = "加法", value = "返回两个参数相加之和")double sum(@ToolMemoryId int memoryId,     //AIservice方法的memory将传递到工具类里@P(value="加数1", required = true) double a,@P(value="加数2", required = true) double b) {System.out.println("调用加法运算 " + memoryId);return a + b;}@Tool(name = "平方根", value = "返回给定参数的平方根")double squareRoot(@ToolMemoryId int memoryId, double x) {System.out.println("调用平方根运算 " + memoryId);return Math.sqrt(x);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Prometheus-Mongodb Exporter安装配置指南,开机自启】

目录 内容概述 一、创建MongoDB监控专用用户二、安装MongoDB Exporter三、启动Exporter服务四、配置Systemd服务五、服务管理命令六、Prometheus集成配置七、Grafana看板 内容概述 本教程详细演示了如何在Linux系统中部署MongoDB Exporter以监控MongoDB数据库,并将…

在 Ubuntu 上安装 cPanel

开始之前,请确保拥有一台 Ubuntu 服务器,推荐使用 Ubuntu 22.04 LTS。如果没有,可以查看免费服务器: 11个免费 VPS,够用一辈子了!(2025最新)Top 11 免费VPS推荐平台对比&#xff08…

【算法基础】插入排序算法 - JAVA

一、算法基础 1.1 什么是插入排序 插入排序是一种简单直观的排序算法,它的工作原理类似于我们打牌时整理手牌的过程。插入排序的核心思想是将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的适当位置。 1.…

WEB前端小练习——记事本

一、登陆页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本登录注册</title><link…

[ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec

[ACTF2020 新生赛]Include 因为前端过滤的太多了 所以直接使用 日志包含 搞 包含这个 /var/log/nginx/access.log [ACTF2020 新生赛]Include蚁剑连接 翻看 flag{1ce7a81e-0339-44ef-a398-a7784d3efe37} [ACTF2020 新生赛]Exec [ACTF2020 新生赛]Exec 127.0.0.1 |echo <?…

VFS Global 携手 SAP 推动数字化转型

2025年5月2日&#xff0c;SAP 公司宣布&#xff0c;全球领先的签证、领事和技术服务提供商 VFS Global 将采用 SAP 的多项核心软件解决方案&#xff0c;推动其全球政务服务和跨境流动解决方案迈向全面数字化和智能化。此次合作标志着 VFS Global 在 AI 赋能的政府科技&#xff…

GTC2025全球流量大会:领驭科技以AI云端之力,助力中国企业出海破浪前行

在全球化与数字化浪潮下&#xff0c;AI技术正成为中国企业出海的重要驱动力。一方面&#xff0c;AI通过语言处理、数据分析等能力显著提升出海企业的运营效率与市场适应性&#xff0c;尤其在东南亚等新兴市场展现出"高性价比场景适配"的竞争优势&#xff1b;另一方面…

安全漏洞扫描费用受哪些因素影响?市场价格区间是多少?

安全漏洞扫描费用是个复杂且关键的话题。它涉及多种影响因素。合理的费用可让企业有效防范安全风险。下面我们深入探讨一番。 市场价格区间 安全漏洞扫描的费用在市场上差别很大。小型企业进行简单扫描&#xff0c;可能只要几千元。大型企业做全面的深度扫描&#xff0c;费用…

n8n工作流自动化平台的实操:解决中文乱码

解决问题&#xff1a; 通过ftp读取中文内容的文件&#xff0c;会存在乱码&#xff0c;如下图&#xff1a; 解决方案 1.详见《安装 iconv-lite》 2.在code节点&#xff0c;写如下代码&#xff1a; const iconv require(iconv-lite);const items $input.all(); items.forEa…

豪越科技消防立库方案:实现应急物资高效管理

在消防救援工作中&#xff0c;应急物资管理是至关重要的一环。然而&#xff0c;当前应急物资管理的现状却令人担忧。传统的应急物资管理方式存在诸多弊端&#xff0c;严重影响了消防救援的效率和效果。 走进一些传统的消防仓库&#xff0c;映入眼帘的往往是杂乱无章的存储场景。…

zabbix 重置登录密码

概述 本节介绍在 Zabbix 中重置用户密码的步骤。 步骤 如果您忘记了 Zabbix 密码并且无法登录&#xff0c;请联系您的 Zabbix 管理员。 超级管理员用户可以更改用户 配置表单 中所有用户的密码。 如果超级管理员忘记了密码并且无法登录&#xff0c;则必须运行以下 SQL 查询…

生成树、Prime、Kruskal

1、任何一个带权无向连通图的最小生成树——可能是不唯一的。 2、给定有权无向图的邻接矩阵如下&#xff0c;其最小生成树的总权重是&#xff1a;14 3、给定有权无向图如下。关于其最小生成树&#xff0c;最小生成树不唯一&#xff0c;其总权重为23。 4、给出如下图所示的具有…

用Suno V4.5试了一下1850字的歌词进行创作出来了6分钟的歌曲

我的宝贝V1,未来AI视界,5分钟 之前的Suno 3和Suno 4的版本&#xff0c;创作的音乐最长是4分钟&#xff0c;这里最大的问题就是&#xff0c;唱到4分钟歌曲就突然断了&#xff0c;那么只能使用续写的方式进行创作。对于续写的问题&#xff0c;其一增加用户的使用和理解成本&…

机器人编程基础---C语言中的表达式和求值

C语言中的表达式和求值 C语言中的表达式和求值表达式示例代码示例说明C语言中的表达式和求值 表达式是运算符和操作数(变量、常量、表达式等)的组合,它们可以产生一个值。 表达式示例 int x = 10, y = 20; int z = x + y * 2; // 根据运算符优先级,先计算y*2,然后计算x…

[UVM]在SoC中用寄存器模型backdoor访问寄存器的案例

在SoC中用寄存器模型backdoor访问寄存器的案例 摘要:在 UVM (Universal Verification Methodology) 验证环境中,寄存器模型是验证 DUT (Design Under Test) 寄存器行为的重要工具。特别是对于层次化的验证环境(如 IP 到 Sub-system 再到 SoC 的集成),使用 UVM 寄存…

NV203NV207SSD固态闪存NV208NV213

NV203NV207SSD固态闪存NV208NV213 美光SSD全解析&#xff1a;NV203/NV207/NV208/NV213技术矩阵 一、产品定位与技术脉络 在存储技术迭代浪潮中&#xff0c;美光NV系列产品构建起多层次的技术矩阵。NV203作为入门级SATA SSD&#xff0c;主打成本控制与基础性能平衡&#xff0c…

迭代器的思想和实现细节

1. 迭代器的本质 迭代器是一种行为类似指针的对象&#xff0c;它可能是指针&#xff08;如 std::vector 的迭代器&#xff09;&#xff0c;也可能是封装了指针的类&#xff08;如 std::list 的迭代器&#xff09;。如果是指针那天然就可以用下面的运算&#xff0c;如果是类&am…

工业传动核心部件深度剖析:丝杆升降机与气缸的技术特性及选型指南

在工业自动化技术飞速发展的当下&#xff0c;丝杆升降机与气缸作为关键的直线传动部件&#xff0c;广泛应用于各类机械设备中。对于工程师而言&#xff0c;深入了解它们的技术特性、优缺点及适用场景&#xff0c;是实现高效、精准设备设计的重要前提。本文将从技术原理出发&…

HarmonyOS NEXT——DevEco Studio的使用(还没写完)

一、IDE环境的搭建 Windows环境 运行环境要求 为保证DevEco Studio正常运行&#xff0c;建议电脑配置满足如下要求&#xff1a; 操作系统&#xff1a;Windows10 64位、Windows11 64位 内存&#xff1a;16GB及以上 硬盘&#xff1a;100GB及以上 分辨率&#xff1a;1280*8…

Modbus 通讯协议(超详细,简单易懂)

目录 一、协议中的寄存器定义 二、协议概述 三、使用串口的Modbus 报文帧 ​编辑 3.1、Modbus ASCII 模式 3.2、Modbus RTU 模式 3.3、功能码概要 3.4、Modbus 报文分析 四、什么是RS-485 RS-232&#xff1f; 一、协议中的寄存器定义 阅读 Modbus 协议时会发现它的概念别扭…