SenseNova 商汤日日新大模型 Function Call(函数调用)功能讲解和应用示例

考虑到使用 magic 申请 OpenAPI 的账号挺麻烦的,这里以商汤日日新大模型 SenseNova 介绍 Function Call 的功能。

 

官方链接:日日新开放平台

一、Function Call 是个啥?

LLM(Large Language Model) 语言大模型时代,Function Call(函数调用)是指可靠地连接 LLM 与外部工具的能力。让用户能够使用高效的外部工具、与外部 API 进行交互。

GPT-4 和国内 SenseNova 等经过微调的 LLM,能够检测函数是否被调用,随后输出包含调用函数参数的 JSON。通过这一过程被调用的函数能够作为工具添加到您的 AI 应用中,并且您可以在单个请求中定义多个函数。

函数调用是一项重要能力。它对于构建 LLM 驱动的聊天机器人或代理至关重要。这些聊天机器人或代理需要为 LLM 检索上下文。它们还与外部工具交互。这种交互是通过将自然语言转换为 API 调用来完成的。

函数调用使开发者能够创建:

  • 能够高效使用外部工具回答问题的对话代理。例如,查询「上海的天气如何?」将被转换为类似 get_current_weather(location: string, unit: 'celsius' | 'fahrenheit') 的函数调用。
  • 用于提取和标记数据的 LLM 驱动解决方案(例如,从维基百科文章中提取人名)。
  • 可以帮助将自然语言转换为 API 调用或有效数据库查询的应用程序。
  • 能够与知识库交互的对话式知识检索引擎。
  • 从文本中提取结构化数据。

二、使用 SenseNova 进行函数调用

假设一个用户向模型提出以下问题:

上海今天的天气怎么样?

看大部分的教程都是用这个示例来说明函数调用,但这里想说商汤的 SenseNova 其实已经支持联网功能了,API 层面设置对应的参数即可自动从网络上实时获取天气信息!!!

这里对比一下 ChatGPT 和 SenseChat(基于 SenseNova 大模型的聊天机器人),看下他们的回答分别是什么?

商汤通过 search_enable 参数将是否开启在线检索开放出来了,以下是配置参数:

所以用天气怎么样,无法作为函数调用示例代码了。下面我们通过「查询学生成绩」来讲解如何使用函数调用。

功能:我们有一个数据库其中有学生表,记录每个学生的成绩,我现在需要和 SenseNova 交流问它其中某个学生的成绩怎么样。

要使用函数调用处理此请求,第一步是定义一个查询学生成绩的函数。您将作为 SenseNova API 请求的一部分传递这些函数:

tools = [{"type": "function","function": {"name": "get_score","description": "通过学生的姓名查询学生的成绩",  # 这个描述对 LLM 非常重要"parameters": {"type": "object","properties": {"name": {"type": "string","description": "学生姓名"}},"required": ["name"]}}}
]
tool_choice = {"mode": "auto"
}

get_score 函数能够返回指定学生的成绩信息。当您将这个函数定义作为请求的一部分传递时,它实际上并不执行函数,只是返回一个包含调用函数所需参数的 JSON 对象。

以下是实现这一需求的函数调用整个代码片段,读者可自行复制粘贴执行一下,前提是申请了 SenseNova 的试用账号。

import json
import osimport sensenovaak = os.environ['SENSENOVA_AK']
sk = os.environ['SENSENOVA_SK']sensenova.access_key_id = ak
sensenova.secret_access_key = sk
model_id = "SenseChat-FunctionCall"tools = [{"type": "function","function": {"name": "get_score","description": "通过学生的姓名查询学生的成绩",  # 这个描述对 LLM 非常重要"parameters": {"type": "object","properties": {"name": {"type": "string","description": "学生姓名"}},"required": ["name"]}}}
]
tool_choice = {"mode": "auto"
}def get_response(question):resp = sensenova.ChatCompletion.create(model=model_id,messages=[{"role": "user", "content": question}],max_new_tokens=1024,temperature=0.8,tools=tools,tool_choice=tool_choice,)return resp['data']['choices'][0]question = "帮我查询张三的考试成绩"
# 1. 第一次 LLM 调用
message = get_response(question)def get_score(name):"""模拟读取数据库中的学生表:param name::return:"""# 用一个字典存储姓名和成绩对应关系, 实际这里是查询数据库scores = {"小明": 90, "小红": 80, "小白": 59, "张三": 99}score = {"name": name,"score": scores[name]}return json.dumps(score)# 2. 解析第一次LLM调用结果,构建参数进行第二次LLM调用,获取最终结果
if message.get("tool_calls"):# 函数调用ID,下一次调用需要传入tool_call_id = message['tool_calls'][0]['id']# 我们定义的函数参数值,这里是经过 LLM 解析后,将"帮我查询张三的考试成绩"这种非结构化数据转为了结构化数据,这里的name=张三name = json.loads(message['tool_calls'][0]['function']['arguments']).get("name")# 调用我们定义的函数:get_scorefunction_response = get_score(name=name)# 将用户的原始输入、第一次LLM返回的message、还有tool_call_id/function_response一起组成第二次调用的messages,发起LLM第二次调用second_response = sensenova.ChatCompletion.create(model=model_id,messages=[{"role": "user", "content": question},message,{"role": "tool", "content": function_response, "tool_call_id": tool_call_id}],tools=tools,tool_choice=tool_choice,)# 输出想要的结果print(second_response['data']['choices'][0]['message'])

输出:

张三的考试成绩是99分。

三、小结

通过上面的示例,相信你应该对 Function Call(函数调用)的用法和作用有了初步了解,如有不明白的地方,欢迎留言或私聊联系我。

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

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

相关文章

Redhat Linux(RHEL) - Primavera P6 EPPM 安装及分享

引言 继上一期发布的Oracle Linux版环境发布之后,近日我又制作了基于Redhat Linux 的P6虚拟机环境,同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机,请先与Oracle Primavera销售代表…

Unity之PUN实现多人联机射击游戏的优化

目录 🎮一、 跳跃,加速跑 🎮二、玩家自定义输入昵称 🍅2.1 给昵称赋值 🍅2.2 实现 🎮三、玩家昵称同步到房间列表 🍅3.1 获取全部玩家 🍅3.2 自定义Player中的字段 &#…

如何利用WebRTC构建点对点的即时通讯工具

在当今竞争激烈的商业环境中,企业越来越需要构建自己的即时通讯工具来提升内部沟通效率和信息安全,减少第三方工具依赖带来的潜在风险,并能与自身的行业业务深入融合。 拥有专用的通讯平台能够加快信息的流动,提升工作协同和任务执…

通过网口或串口走Modbus协议,读写数据库中的数据

智能网关IGT-DSER方便实现多台PLC与数据库之间的数据通讯,既可以读取PLC的数据上报到数据库,也可以从数据库查询数据后写入到PLC的寄存器,还可以将数据库的数据转为Modbus服务端/从站,实现数据库内的数据也可以走Modbus协议通过网…

springmvc学习笔记2

springmvc学习笔记2 springmvc响应数据页面跳转控制开发模式介绍快速返回逻辑视图jsp页面创建配置jsp视图解析器mvc初始化handler返回视图 转发和重定向实现返回json数据(重点静态资源处理 RestFull风格设计和实战风格介绍实战 扩展知识全局异常处理拦截器拦截器声明…

什么是字节码?采用字节码的好处是什么?

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),字节码是一种中间代码,它是由源代码经过编译生成的一种二进制表示形式。字节码通常不针对特定的硬件平台,而是针对虚拟机设计的&…

面试题系列一之-css画三角形(原理解析)

用html写一个三角形的图标算是一个比较简单的,但是工作中用的还是比较多的&#xff0c;面试也可能会问&#xff0c;但了解背后的原理才能熟练使用 我们首先写一个div,设置边框 <body><div class"border"></div> </body> <style> .bo…

MySQL 篇-深入了解事务四大特性及原理

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 事务的概述 2.0 事务的特性 2.1 原子性 2.2 一致性 2.3 持久性 2.4 隔离性 2.4.1 脏读问题 2.4.2 不可重复读问题 2.4.3 幻读问题 3.0 事务的四个隔离级别 3.1…

【LeetCode】升级打怪之路 Day 17:二叉树题型 —— 二叉树的序列化与反序列化

今日题目&#xff1a; 297. 二叉树的序列化与反序列化652. 寻找重复的子树 目录 LC 297. 二叉树的序列化与反序列化 【classic】 ⭐⭐⭐⭐⭐1&#xff09;序列化逻辑2&#xff09;反序列化逻辑 LC 652. 寻找重复的子树 【稍有难度】 今天主要学习了二叉树的序列化和反序列化相关…

基于Java+SpringBoot+vue的图书购物商城系统详细设计和实现

基于JavaSpringBootvue的图书购物商城系统详细设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

Redis及其数据类型和常用命令(一)

Redis 非关系型数据库&#xff0c;不需要使用sql语句对数据库进行操作&#xff0c;而是使用命令进行操作&#xff0c;在数据库存储时使用键值对进行存储&#xff0c;应用场景广泛&#xff0c;一般存储访问频率较高的数据。 一般关系型数据库&#xff08;使用sql语句进行操作的…

伪分布HBase的安装与部署

1.实训目标 &#xff08;1&#xff09;熟悉掌握使用在Linux下安装伪分布式HBase。 &#xff08;2&#xff09;熟悉掌握使用在HBase伪分布式下使用自带Zookeeper。 2.实训环境 环境 版本 说明 Windows 10系统 64位 操作电脑配置 VMware 15 用于搭建所需虚拟机Linux系统 …