LLM 中自定义函数的调用

LLM 中自定义函数的调用

调用函数

函数调用是指可靠地连接 LLM 与外部工具的能力。让用户能够使用高效的外部工具、与外部 API 进行交互。

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

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

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

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

在这份指南中,我们展示了如何针对GPT-4和其他开源模型给出提示,以执行不同的函数调用。

使用 GPT-4 进行函数调用

作为一个基本示例,假设我们要求模型检查特定地点的天气。

LLM 本身无法响应此请求。因为它所使用的训练数据集截止至之前的某个日期。解决这个问题的方法是将 LLM 与外部工具结合起来。您可以利用模型的函数调用能力来确定要调用的外部函数及其参数,然后让它返回最终回复结果。以下是一个简单的示例,展示了如何使用 OpenAI API 实现这一点。

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

伦敦的天气如何?

要使用函数调用处理此请求,第一步是定义一个或一组天气函数。您将作为 OpenAI API 请求的一部分传递这些函数:

# Defines a dummy function to get the current weather
def get_current_weather(location, unit="fahrenheit"):
    """Get the current weather in a given location"""
    weather = {
        "location": location,
        "temperature": "50",
        "unit": unit,
    }
 
    return json.dumps(weather)
 
# define a function as tools
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                    "unit": {
                        "type": "string", 
                        "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],
            },
        },   
    }
]
 
# define a list of messages
messages = [
    {
        "role": "user",
        "content": "What is the weather like in London?"
    }
]

get_current_weather 函数能够返回指定位置的天气情况。当您将这个函数定义作为请求的一部分传递时,它实际上并不执行函数,只是返回一个包含调用函数所需参数的 JSON 对象。以下是一些如何实现这一点的代码片段。

您可以如下定义一个完整的函数:

def get_completion(messages, model="gpt-3.5-turbo-1106", temperature=0, max_tokens=300, tools=None):
    response = openai.chat.completions.create(
        model=model,
        messages=messages,
        temperature=temperature,
        max_tokens=max_tokens,
        tools=tools
    )
    return response.choices[0].message

您可以像这样构造用户提问:

messages = [
    {
        "role": "user",
        "content": "伦敦的天气如何?"
    }
]

最后,您可以调用 get_completion 函数,将结果传递给 response 中的 messagestools

response = get_completion(messages, tools=tools)
args = json.loads(response.tool_calls[0].function.arguments)
get_current_weather(**args)

这将输出:'{"location": "London", "temperature": "50", "unit": "celsius"}'

上述代码中 response 的构造如下所示:

ChatCompletionMessage(
    content=None, 
    role='assistant', 
    function_call=None, 
    tool_calls=[
        ChatCompletionMessageToolCall(id='...', 
            function=Function(
                arguments='{"location":"London","unit":"celsius"}', 
                name='get_current_weather'), 
                type='function'
            )
        ]
    )

特别地,arguments 对象包含了模型提取的重要参数,这些参数将被用于完成请求。

然后您可以调用一个外部天气 API 来获取实际的天气信息。一旦您有了天气信息,就可以将其传回模型,随后根据原始用户问题总结出最终回应。

这里有一个 python notebook (opens in a new tab),它提供了一个简单示例,展示了如何使用 OpenAI API 进行函数调用。

使用开源 LLM 进行函数调用

更多使用开源LLM进行函数调用的说明即将推出...

函数调用用例

更多函数调用用例即将推出...