通义千问( 四 ) Function Call 函数调用

4.2.function call 函数调用

大模型在面对实时性问题、私域知识型问题或数学计算等问题时可能效果不佳。

您可以使用function call功能,通过调用外部工具来提升模型的输出效果。您可以在调用大模型时,通过tools参数传入工具的名称、描述、入参等信息。

4.2.1.Function Call 流程

Function Call的工作流程示意图如下所示:

在这里插入图片描述

4.2.2.工具类

这里的一些工具类是一些测试工具类, 只是模拟对应的功能

获取天气

public class GetWhetherTool {private String location;public GetWhetherTool(String location) {this.location = location;}public String call() {return location + "今天是晴天";}
}

获取时间

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class GetTimeTool {public GetTimeTool() {}public String call() {LocalDateTime now = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String currentTime = "当前时间:" + now.format(formatter) + "。";return currentTime;}
}

获取好友姓名

public class GetNamesTool {public GetNamesTool() {}public String call() {return "[\"王小二\",\"李小三\",\"赵小四\"]";}
}

4.2.3.调用处理

通过 通义大模型 进行函数调用

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.tools.FunctionDefinition;
import com.alibaba.dashscope.tools.ToolCallBase;
import com.alibaba.dashscope.tools.ToolCallFunction;
import com.alibaba.dashscope.tools.ToolFunction;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.victools.jsonschema.generator.*;
import com.yuan.tongyibase.tools.GetNamesTool;
import com.yuan.tongyibase.tools.GetTimeTool;
import com.yuan.tongyibase.tools.GetWhetherTool;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import com.alibaba.dashscope.aigc.generation.GenerationOutput.Choice;@RestController
@RequestMapping("/tongyi")
public class CallFuncController {@Value("${tongyi.api-key}")private String apiKey;@RequestMapping("/call/func")public String callFunc(@RequestParam(value = "message", required = false, defaultValue = "中国的首都是哪里?") String message) throws NoApiKeyException, InputRequiredException {String selectTool = selectTool(message);return selectTool;}public String selectTool(String message) throws NoApiKeyException, ApiException, InputRequiredException {// 设置API密钥Constants.apiKey = apiKey;// 创建SchemaGeneratorConfigBuilder实例,指定使用JSON格式的模式版本SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON);// 构建SchemaGeneratorConfig配置,包含额外的OpenAPI格式值,但不使用枚举的toString方法进行展平SchemaGeneratorConfig config = configBuilder.with(Option.EXTRA_OPEN_API_FORMAT_VALUES).without(Option.FLATTENED_ENUMS_FROM_TOSTRING).build();// 根据配置创建SchemaGenerator实例,用于生成模式SchemaGenerator generator = new SchemaGenerator(config);// 生成GetWhetherTool类的JSON SchemaObjectNode jsonSchema_whether = generator.generateSchema(GetWhetherTool.class);// 生成GetTimeTool类的JSON SchemaObjectNode jsonSchema_time = generator.generateSchema(GetTimeTool.class);// 生成GetNamesTool类的JSON SchemaObjectNode jsonSchema_names = generator.generateSchema(GetNamesTool.class);// 构建获取指定地区天气的函数定义FunctionDefinition fd_whether = FunctionDefinition.builder().name("get_current_whether") // 设置函数名称.description("获取指定地区的天气") // 设置函数描述.parameters(JsonUtils.parseString(jsonSchema_whether.toString()).getAsJsonObject()) // 设置函数参数.build();// 构建获取当前时刻时间的函数定义FunctionDefinition fd_time = FunctionDefinition.builder().name("get_current_time") // 设置函数名称.description("获取当前时刻的时间") // 设置函数描述.parameters(JsonUtils.parseString(jsonSchema_time.toString()).getAsJsonObject()) // 设置函数参数.build();// 构建获取当前names的函数定义FunctionDefinition fd_names = FunctionDefinition.builder().name("get_current_names") // 设置函数名称.description("获取好友") // 设置函数描述.parameters(JsonUtils.parseString(jsonSchema_names.toString()).getAsJsonObject()) // 设置函数参数.build();// 构建系统消息,用于提示助手使用工具回答问题Message systemMsg = Message.builder().role(Role.SYSTEM.getValue()) // 设置消息角色为系统.content("你是一个乐于助人的AI助手。当被问到问题时,尽可能使用工具。") // 设置消息内容.build();Message userMsg =Message.builder().role(Role.USER.getValue()).content(message).build();List<Message> messages = new ArrayList<>();messages.addAll(Arrays.asList(systemMsg, userMsg));// 构建生成参数对象,用于配置文本生成的相关参数GenerationParam param = GenerationParam.builder()// 设置所使用的模型为“qwen-max”.model("qwen-turbo") //qwen-max// 设置对话历史,用于模型生成时参考.messages(messages)// 设置生成结果的格式为消息格式.resultFormat(GenerationParam.ResultFormat.MESSAGE)// 设置可用的工具函数列表,包括天气查询和时间查询功能.tools(Arrays.asList(ToolFunction.builder().function(fd_whether).build(),ToolFunction.builder().function(fd_time).build(),ToolFunction.builder().function(fd_names).build())).build();// 大模型的第一轮调用Generation gen = new Generation();GenerationResult result = gen.call(param);System.out.println("\n大模型第一轮输出信息:" + JsonUtils.toJson(result));for (Choice choice : result.getOutput().getChoices()) {messages.add(choice.getMessage());// 如果需要调用工具if (result.getOutput().getChoices().get(0).getMessage().getToolCalls() != null) {for (ToolCallBase toolCall : result.getOutput().getChoices().get(0).getMessage().getToolCalls()) {if (toolCall.getType().equals("function")) {// 获取工具函数名称和入参String functionName = ((ToolCallFunction) toolCall).getFunction().getName();String functionArgument = ((ToolCallFunction) toolCall).getFunction().getArguments();// 大模型判断调用天气查询工具的情况if (functionName.equals("get_current_whether")) {GetWhetherTool GetWhetherFunction = JsonUtils.fromJson(functionArgument, GetWhetherTool.class);String whether = GetWhetherFunction.call();Message toolResultMessage = Message.builder().role("tool").content(String.valueOf(whether)).toolCallId(toolCall.getId()).build();messages.add(toolResultMessage);System.out.println("\n工具输出信息:" + whether);}// 大模型判断调用时间查询工具的情况else if (functionName.equals("get_current_time")) {GetTimeTool GetTimeFunction =JsonUtils.fromJson(functionArgument, GetTimeTool.class);String time = GetTimeFunction.call();Message toolResultMessage = Message.builder().role("tool").content(String.valueOf(time)).toolCallId(toolCall.getId()).build();messages.add(toolResultMessage);System.out.println("\n工具输出信息:" + time);}// 大模型判断调用[ names ]的情况else if (functionName.equals("get_current_names")) {GetNamesTool GetNamesFunction =JsonUtils.fromJson(functionArgument, GetNamesTool.class);String names = GetNamesFunction.call();Message toolResultMessage = Message.builder().role("tool").content(String.valueOf(names)).toolCallId(toolCall.getId()).build();messages.add(toolResultMessage);System.out.println("\n工具输出信息:" + names);}}}}// 如果无需调用工具,直接输出大模型的回复else {System.out.println("\n最终答案:" + result.getOutput().getChoices().get(0).getMessage().getContent());return "\n最终答案:" + result.getOutput().getChoices().get(0).getMessage().getContent();}}// 大模型的第二轮调用 包含工具输出信息param.setMessages(messages);result = gen.call(param);System.out.println("\n大模型第二轮输出信息:" + JsonUtils.toJson(result));System.out.println(("\n最终答案:" + result.getOutput().getChoices().get(0).getMessage().getContent()));return "\n最终答案:" + result.getOutput().getChoices().get(0).getMessage().getContent();}
}

4.2.4.测试

###
GET http://localhost:8081/tongyi/call/func?message=好友的名字是什么?

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

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

相关文章

C语言(16)——初识单链表

1.链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 结构图&#xff1a; 补充说明&#xff1a; 1、链式机构在逻辑上是连续的&#xff0c;在物理结构上不⼀定连续 2、…

Oracle Java JDK 21 下载地址及安装教程

Oracle JDK 21 官方地址 https://www.oracle.com/java/technologies/downloads/#java21 1. Linux 版本 ARM64 Compressed Archive https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz ARM64 RPM Package https://download.oracle.com/java/21/late…

Python爬虫图片:从入门到精通

在数字化时代&#xff0c;图片作为信息传递的重要媒介之一&#xff0c;其获取和处理变得越来越重要。Python作为一种功能强大且易于学习的编程语言&#xff0c;非常适合用来编写爬虫程序&#xff0c;帮助我们自动化地从互联网上获取图片资源。本文将从基础到高级&#xff0c;详…

【qt】跳转到另一个界面

如何在一个界面跳转到另一个界面呢&#xff1f; 1.具体步骤 1.先新建一个界面 2.选择qt设计师界面 3.选择W 4.新界面名称 5.界面设计 因为我们要实现通信&#xff0c;需要一个发送信息栏&#xff0c;一个发送按钮&#xff0c;一个清空发送栏按钮 6.实现跳转 我们可以参…

python 已知x+y=8 求x*y*(x-y)的最大值

先用导数求解 已知xy8 求xy(x-y)的最大值 令y8-x 则 f(x)x⋅(8−x)⋅(x−(8−x))x⋅(8−x)⋅(2x−8) 导数方程为 f(x)-3x^2 24x - 32 求方程 − 3 x 2 24 x − 32 0 -3x^2 24x - 32 0 −3x224x−320 的根。 首先&#xff0c;我们可以尝试对方程进行因式分解。观察…

Airtest 的使用

Airtest 介绍 Airtest Project 是网易游戏推出的一款自动化测试框架&#xff0c;其项目由以下几个部分构成 Airtest : 一个跨平台的&#xff0c;基于图像识别的 UI 自动化测试框架&#xff0c;适用于游戏和 App &#xff0c; 支持 Windows, Android 和 iOS 平台&#xff0c…

鸿蒙应用程序框架基础

鸿蒙应用程序框架基础 应用程序包基础知识应用的多Module设计机制Module类型 Stage模型应用程序包结构开发态包结构编译包形态发布台包结构选择合适的包类型 应用程序包基础知识 应用的多Module设计机制 **支持模块化开发&#xff1a;**一个应用通常会包含多种功能&#xff0…

为什么MCU I2C波形中会出现的脉冲毛刺?

在I2C的波形中&#xff0c;经常会发现有这样的脉冲毛刺&#xff0c;会被认为是干扰或者器件不正常。 看到这个波形时&#xff0c;可以先数一下出现在第几个clock的位置&#xff0c;如果出现在第9个clock的低电平期间&#xff0c;就不是干扰或者器件异常导致。 在I2C的协议中&a…

虎牙驶入快车道

撰稿 | 多客 来源 | 贝多财经 一份Q2财报&#xff0c;狠狠打脸了那些唱反调的人&#xff0c;特别是故意唱衰直播和游戏公司的一些TMT观察者。 同时&#xff0c;直播平台如何健康转型实现可持续发展&#xff0c;游戏相关服务业务应该怎么做增量&#xff0c;虎牙的这份财报也给…

【Kubernetes】虚拟 IP 与 Service 的代理模式

虚拟 IP 与 Service 的代理模式 1.userspace 代理模式2.iptables 代理模式3.IPVS 代理模式 由于 Service 的默认发布类型是 ClusterlP&#xff0c;因此也可以把 ClusterIP 地址叫作 虚拟 IP 地址。在 Kubernetes 创建 Service 时&#xff0c;每个节点上运行的 kube-proxy 会自动…

golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息

golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息 package mainimport ("fmt""regexp""github.com/StackExchange/wmi""github.com/shirou/gopsutil/v3/disk" )// 定义 WMI 类结构体 type Win32_LogicalDiskToPartition struct {Ant…

高数4.2 积分方法-换元积分法

1. 第一类换元积分法 2. 第二类换元积分法

算法【Java】 —— 滑动窗口

滑动窗口 在上一篇文章中&#xff0c;我们了解到了双指针算法&#xff0c;在双指针算法中我们知道了前后指针法&#xff0c;这篇文章就要提到前后指针法的一个经典的使用 —— 滑动窗口&#xff0c;在前后指针法中&#xff0c;我们知道一个指针在前&#xff0c;一个指针在后&a…

JavaScript初级——运算符

一、算数运算符 1、运算符也叫操作符。通过运算符可以对一个或多个值进行运算&#xff0c;并获取运算结果。 比如&#xff1a;typeof 就是运算符&#xff0c;可以获得一个值的类型&#xff0c;他会将该值的类型以字符串的形式返回 &#xff08;number、string、boolean、undefi…

【秋招笔试】8.12-4399秋招(第一套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

计算机网络12——IM聊天系统——项目分析和架构搭建

1、IM——聊天系统主要功能 &#xff08;1&#xff09;注册 根据&#xff1a;昵称&#xff0c;手机号&#xff0c;密码 &#xff08;2&#xff09;登录 根据&#xff1a;手机号&#xff0c;密码 &#xff08;3&#xff09;添加好友 根据&#xff1a;昵称 &#xff08;4&…

Secure CRT 9.x版本高亮着色配置文件

Secure CRT的网络配置文件高亮显示&#xff0c;还在完善&#xff0c;逐渐适配不同厂商 设备名字自动蓝色高亮显示设备接口名高亮显示IPv4地址、IPv6地址、MAC地址高亮显示掩码、反掩码高亮显示设备SN号高亮显示接口状态、设备状态等高亮显示各路由协议高亮显示 【下载地址】效果…

XSS-复现dom破坏案例和靶场

目录 xss注入原理&#xff1a; xss是什么&#xff1f; xss原理&#xff1a; DOM&#xff1a; 闯关&#xff1a; 第一关&#xff1a;Ma Spaghet! 源码&#xff1a; 要求&#xff1a; 分析&#xff1a; 第二关&#xff1a; Jefff 源码&#xff1a; 要求&#xff1a; …

ubuntu基于sealos搭建k8s集群,helm3安装配置自动化扩容Prometheus,grafana出图展示,以及动态web搭建

1.项目简介 大方向&#xff1a;k8s云原生方向&#xff0c;运维技术&#xff0c;配置问题解决 解决技术:ubuntu模板机安装&#xff0c;配置远程xshell连接ubuntu&#xff0c;设置静态ip&#xff0c;换ubuntu阿里云源&#xff0c;配置集群间域名解析&#xff0c;解决双IP冲突网…

ubuntu下使用docker、socket、yolov5进行图像处理数据交互记录

ubuntu下使用docker、socket、yolov5进行图像处理数据交互记录 概述&#xff1a;主要实现了在宿主机上通过8000端口传递一张图像给docker镜像&#xff0c;然后镜像中处理后&#xff0c;通过8001端口回传处理后的图像给宿主机。 第一章、构建镜像 一、dockerfile文件 1.拉取…