共计 2650 个字符,预计需要花费 7 分钟才能阅读完成。
本文首发自集体博客,获取更多对于 LLM 利用开发实际记录
OpenAI 在 gpt-3.5-turbo-0613 和 gpt-4-0613 两个模型的 chat completion api 中减少了一个叫 Function Calling 的新性能,本篇文章对其性能进行探索,并剖析其作用。
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 的(果然魔法都是有老本的🤡
- 潜在的危险:剖析不精确,呈现无奈命中函数签名形容的状况
参考
- OpenAI Function Calling 个性有什么用
- Function Calling 文档
- openai-cookbook