当前位置: 首页 > news >正文

Function Calling学习

Function Calling第一篇

  • Agent:AI 主动提要求
  • Function Calling:AI 要求执行某个函数
  • 场景举例:明天上班是否要带伞?AI反过来问你,明天天气怎么样?
    在这里插入图片描述

Function Calling 的基本流程

在这里插入图片描述

Function Calling 完整的官方接口文档:https://platform.openai.com/docs/guides/function-calling
接口里的 tools,最初版本叫 functions

定义函数tools

# 定义function
def get_completion(messages, model="gpt-3.5-turbo"):response = client.chat.completions.create(model=model,messages=messages,temperature=0,  # 模型输出的随机性,0 表示随机性最小tools=[{  # 用 JSON 描述函数。可以定义多个。由大模型决定调用谁。也可能都不调用"type": "function","function": {"name": "sum","description": "只能用来计算加法,计算一组数的和","parameters": {"type": "object","properties": {"numbers": {"type": "array","items": {"type": "number"}}}}}}],)return response.choices[0].message

执行sum函数

方法中的get_completion方法可以查看之前的文章prompt工程那篇

#prompt = "Tell me the sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, 10."
prompt = "桌上有 2 个苹果,四个桃子和 3 本书,一共有几个水果?"
#prompt = "1+2+3...+99+100"
#prompt = "1024 乘以 1024 是多少?"   # Tools 里没有定义乘法,会怎样?
#prompt = "太阳从哪边升起?"           # 不需要算加法,会怎样?messages = [{"role": "system", "content": "你是一个数学家"},{"role": "user", "content": prompt}
]
response = get_completion(messages)# 把大模型的回复加入到对话历史中
messages.append(response)print("=====GPT回复=====")
print_json(response)# 如果返回的是函数调用结果,则打印出来
if (response.tool_calls is not None):# 是否要调用 sumtool_call = response.tool_calls[0]if (tool_call.function.name == "sum"):# 调用 sumargs = json.loads(tool_call.function.arguments)result = sum(args["numbers"])print("=====函数返回=====")print(result)# 把函数调用结果加入到对话历史中messages.append({"tool_call_id": tool_call.id,  # 用于标识函数调用的 ID"role": "tool","name": "sum","content": str(result)  # 数值 result 必须转成字符串})# 再次调用大模型print("=====最终回复=====")print(get_completion(messages).content)

划重点:

  1. OpenAI并不会主动调用函数,只会根据prompt中提供的函数判断是否要调用函数
  2. Function Calling 中的函数与参数的描述也是一种 Prompt
  3. 这种 Prompt 也需要调优,否则会影响函数的召回、参数的准确性,甚至让 GPT 产生幻觉

发现问题:

大家可以试一下问他1024乘以1024等于多次,会发现OpenAI将乘以也识别成了sum的函数,得出的结果是2048。我尝试了很多种prompt,都没能解决这个问题。最终我又创建了一个tools用来计算乘法,这时候OpenAI就能识别乘法了。

相关文章:

  • 开源数据库同步工具DBSyncer
  • Altium Designer软件下载安装「专业PCB设计软件」Altium Designer安装包获取!
  • 【Linux 网络编程】协议的分层知识!
  • 专项技能训练五《云计算网络技术与应用》实训9 使用openVPN建立小型企业内网VPN环境
  • C语言 指针——指针变量的定义、初始化及解引用
  • 串口通信问题排查总结
  • Flink 对接 Hudi 查询数据,java代码编写
  • Windows驱动开发系列文章一
  • Deepin Linux 深度 V23 beige 官方源及换镜像源方法。
  • 【MySQL精通之路】优化
  • 一千题,No.0037(组个最小数)
  • 2021职称继续教育--中国共产党的光辉历程及其经验
  • 服务器的远程桌面无法连接,服务器远程桌面无法连接问题处理教程
  • nginx配置文件
  • 分布式事务-TCC
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [case10]使用RSQL实现端到端的动态查询
  • 【个人向】《HTTP图解》阅后小结
  • 78. Subsets
  • IDEA常用插件整理
  • interface和setter,getter
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Node + FFmpeg 实现Canvas动画导出视频
  • React-Native - 收藏集 - 掘金
  • Spring Cloud Feign的两种使用姿势
  • Terraform入门 - 1. 安装Terraform
  • 番外篇1:在Windows环境下安装JDK
  • 后端_ThinkPHP5
  • 前端面试之闭包
  • 前言-如何学习区块链
  • 树莓派 - 使用须知
  • 通过npm或yarn自动生成vue组件
  • 问题之ssh中Host key verification failed的解决
  • 一个JAVA程序员成长之路分享
  • 移动端 h5开发相关内容总结(三)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # Apache SeaTunnel 究竟是什么?
  • # Kafka_深入探秘者(2):kafka 生产者
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #define用法
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #pragma once
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (笔试题)合法字符串
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)创业的注意事项
  • (转)一些感悟
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ***详解账号泄露:全球约1亿用户已泄露
  • .chm格式文件如何阅读
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET IoC 容器(三)Autofac