🚀 掌握 Prompt Engineering 和在我们的新课程中构建 AI Agents!使用 PROMPTING20 可享 8 折优惠 ➜ 立即报名
函数调用

LLMs 的函数调用

开始使用函数调用

函数调用是可靠地将 LLMs 连接到外部工具的能力,以便有效使用工具并与外部 API 交互。

像 GPT-4 和 GPT-3.5 这样的 LLMs 经过微调,能够检测何时需要调用函数,然后输出包含调用函数所需参数的 JSON。通过函数调用来调用的函数将作为您 AI 应用中的工具,并且您可以在单个请求中定义多个函数。

函数调用是构建 LLM 驱动的聊天机器人或 Agents 的一项重要能力,这些聊天机器人或 Agents 需要为 LLM 检索上下文,或者通过将自然语言转换为 API 调用来与外部工具交互。

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

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

本指南中,我们将演示如何引导像 GPT-4 和开源模型这样的模型进行不同用例的函数调用。

使用 GPT-4 进行函数调用

作为一个基本示例,假设我们要求模型查询给定位置的天气。

仅凭 LLM 自身无法响应此请求,因为它是在具有截止点的数据集上训练的。解决此问题的方法是将 LLM 与外部工具结合。您可以利用模型的函数调用能力来确定要调用的外部函数及其参数,然后让它返回最终响应。下面是使用 OpenAI API 如何实现此功能的一个简单示例。

假设用户向模型询问以下问题

What is the weather like in London?

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

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"],
            },
        },   
    }
]

代码块中的 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": "What is the weather like in London?"
    }
]

最后,您可以调用上面的 get_completion 函数,并传递 messagestools

response = get_completion(messages, tools=tools)

代码块中的 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 获取实际天气信息。一旦获取了天气信息,您可以将其传回模型,让模型根据原始用户问题总结最终响应。

Notebooks

🎓

在我们的新 AI 课程中了解更多关于函数调用的内容。立即加入!(在新标签页中打开) 使用代码 PROMPTING20 额外享受 8 折优惠。

这里有一个 Notebook,其中包含一个简单示例,演示了如何使用 OpenAI API 进行函数调用。

使用开源 LLMs 进行函数调用

关于使用开源 LLMs 进行函数调用的更多说明即将发布。

函数调用用例

以下是可受益于 LLMs 函数调用能力的一些用例:

  • 对话 Agents:函数调用可用于创建复杂的对话 Agents 或聊天机器人,通过调用外部 API 或外部知识库来回答复杂问题,并提供更相关和有用的响应。

  • 自然语言理解:它可以将自然语言转换为结构化的 JSON 数据,从文本中提取结构化数据,并执行诸如命名实体识别、情感分析和关键词提取等任务。

  • 数学问题求解:函数调用可用于定义自定义函数,以解决需要多个步骤和不同类型高级计算的复杂数学问题。

  • API 集成:可用于将 LLMs 与外部 API 有效集成,以获取数据或根据输入执行操作。这有助于构建 QA 系统或创意助手。总的来说,函数调用可以将自然语言转换为有效的 API 调用。

  • 信息提取:函数调用可有效用于从给定输入中提取特定信息,例如从文章中检索相关新闻报道或参考文献。

参考资料