OpenAI Function Calling特性示例详解

2023-12-05 0 613
目录
  • Function Calling使用
    • show me code
    • 接口调用说明
    • LLM分析结果
    • AI记账应用设想
    • 存在问题

Function Calling使用

OpenAI 在gpt-3.5-turbo-0613 和 gpt-4-0613两个模型的chat completion api中增加了一个叫Function Calling的新功能,本篇文章对其功能进行探究,并分析其作用。

我认为这是一种比Plugin更优雅的方式,给开发者提供了更多的自由度,一方面识别出何时需要调用函数来对输出格式化,一方面设定具体的格式化数据有助于接入后续业务逻辑。达到尽可能保证(注意这里,是根据你的函数描述最大可能保证,不能100%)LLM输出可控的基础上,来增强自己业务的目的。

show me code

下面以记账应用为例,告诉AI:“今天喝奶茶花了6元”,正常思路来说,交互流程应该是这样的:

  • 用户输入prompt
  • AI进行语义分析
  • 返回结构化的数据(每个子项是什么,花费是多少)
  • 拿到数据进行下一步操作

借助Function Calling,微调后的模型可以检测何时应该调用函数并使用符合函数签名的 JSON 进行响应,下面看代码例子👇

import openai
import json
from enum import Enum
class BaseTool(Enum):
Bookkeeping = \”record_price\”
RecordingTask = \”record_task\”
def record_price(category, price):
print(category, price)
# 记账应用 API
print(\”记账成功!\”)
def funtion_call_conversation():
response = openai.ChatCompletion.create(
model=\”gpt-3.5-turbo-0613\”,
messages=[
{\”role\”: \”user\”, \”content\”: \”今天喝奶茶花了6元\”},
],
temperature=0,
functions=[
{
\”name\”: BaseTool.Bookkeeping.value,
\”description\”: \”bookkeeping assistant\”,
\”parameters\”: {
\”type\”: \”object\”,
\”properties\”: {
\”category\”: {
\”type\”: \”string\”,
\”description\”: \”类目\”,
},
\”price\”: {\”type\”: \”string\”, \”description\”: \”金额\”},
},
\”required\”: [\”category\”, \”price\”],
},
}
],
function_call=\”auto\”,
)
message = response[\”choices\”][0][\”message\”]
if(message.get(\”function_call\”)):
function_name = message[\”function_call\”][\”name\”]
if function_name == BaseTool.Bookkeeping.value:
arguments = json.loads(message[\”function_call\”][\”arguments\”])
record_price(arguments.get(\’category\’), arguments.get(\’price\’))

接口调用说明

  • name字段表示要调用的函数名,description表示函数描述,paramters是一个符合JSON Schema格式的对象,用来描述这个函数的入参信息(让 LLM 读得懂的工具函数说明)

record_price是用来给Function Calling调用的函数,这个函数接收两个必填的参数,category类目(string类型),price金额(string类型)

functions=[
{
\”name\”: BaseTool.Bookkeeping.value,
\”description\”: \”bookkeeping assistant\”,
\”parameters\”: {
\”type\”: \”object\”,
\”properties\”: {
\”category\”: {\”type\”: \”string\”,\”description\”: \”类目\”},
\”price\”: {\”type\”: \”string\”, \”description\”: \”金额\”},
},
\”required\”: [\”category\”, \”price\”],
},
}
],

LLM分析结果

LLM 分析后命中了函数签名描述,就会返回给我们 function_call 这个字段以及函数签名中我们预定义的相关信息:

{
\”role\”: \”assistant\”,
\”content\”: null,
\”function_call\”: {
\”name\”: \”record_price\”,
\”arguments\”: \”{\\n \\\”category\\\”: \\\”\\u5976\\u8336\\\”,\\n \\\”price\\\”: \\\”6\\u5143\\\”\\n}\”
}
}

  • category返回给我们了类目是奶茶
  • price识别出了金额是6元

接下来拿到参数,调用 record_price 进行记账的操作即可;如果没有命中函数签名描述,就不会返回function_call字段,也就不需要进行任何操作:

if(message.get(\”function_call\”)):
function_name = message[\”function_call\”][\”name\”]
if function_name == BaseTool.Bookkeeping.value:
arguments = json.loads(message[\”function_call\”][\”arguments\”])
record_price(arguments.get(\’category\’), arguments.get(\’price\’))

按照这种思路,可以扩展自己的外部工具,比如发邮件,记录待办清单,让LLM变成私人管家。

AI记账应用设想

LLM 加持的记账应用设想,不需要打开记账软件写类目记金额👇:

  • 直接对照Siri说“今天喝奶茶花了6元”
  • 然后利用STT,转换为文本
  • 利用上述程序提取类目和金额,调用记账API,记录成功

存在问题

  • 函数描述是会被计入token的(果然魔法都是有成本的🤡
  • 潜在的风险:分析不准确,出现无法命中函数签名描述的情况

参考

  • Function Calling 文档
  • openai-cookbook

以上就是OpenAI Function Calling特性作用详解的详细内容,更多关于OpenAI Function Calling的资料请关注悠久资源网其它相关文章!

您可能感兴趣的文章:

  • OpenAI 函数调用示例及功能入门教程
  • openaicreateChatCompletion函数使用实例
  • OPENAI API 微调 GPT-3 的 Ada 模型
  • 176万!GPT-4发布详解如何查看OpenAI的下载量
  • OpenAI发布GPT-4支持图像文本输入处理中文准确度大幅提升
  • OpenAI的Whisper模型进行语音识别使用详解
  • 人工智能深度学习OpenAI baselines的使用方法

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 Python OpenAI Function Calling特性示例详解 https://www.u-9.cn/jiaoben/python/99634.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务