关于python:OpenAI-Function-Calling-特性有什么用

9次阅读

共计 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 加持的记账利用构想,不须要关上记账软件写类目记金额👇:

  1. 间接对照 Siri 说“明天喝奶茶花了 6 元”
  2. 而后利用 STT,转换为文本
  3. 利用上述程序提取类目和金额,调用记账 API,记录胜利

存在问题

  1. 函数形容是会被计入 token 的(果然魔法都是有老本的🤡
  2. 潜在的危险:剖析不精确,呈现无奈命中函数签名形容的状况

参考

  • OpenAI Function Calling 个性有什么用
  • Function Calling 文档
  • openai-cookbook
正文完
 0