AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


人工智能小白到高手:大模型通过 Function calling 沟通外部世界
发布日期:2025-01-04 23:15:49 浏览次数: 1588 来源:AI取经路



1. 什么是 Function calling

2. 使用场景

3. 生命周期

4. 是不是每个 LLM 模型都支持 Function calling 

5. 通过图和代码举例说明 Function calling 过程

近年来大模型发展过程中面临的几个核心挑战:静态知识的局限性、执行能力的缺失、与外部系统的割裂。为了应对这些挑战,推动大模型从单纯的语言生成工具演变为真正的任务执行引擎,Function calling 诞生了,已经成为大模型一项不可或缺的核心能力。

大模型见:一文说清楚什么是AI大模型

1. 什么是 Function calling

Function calling 使开发者能够将语言模型连接到外部数据和系统。您可以定义一组函数作为模型可访问的工具,并根据对话历史在适当的时候使用它们。然后在应用端执行这些函数,并将结果反馈给模型。

Function calling 其实并不是 LLM 模型本身独立的能力,而是依赖 LLM 模型对函数描述的理解和生成调用参数的能力。因此模型本身需要经过特殊训练来支持这一功能,再结合由开发者或平台在 LLM 周围实现的外部机制,来让模型与外界进行互动

LLM本质上是一个生成文本,接受 prompt 输入后会生成对应的文本回应。而通过附加的中间层(如 API 或应用层的开发设计),可以引导模型识别出需要调用 Function 的情境,并让其生成 Function Calling 所需要的信息,例如 函数名称、参数。

实际执行函数的环境不是在 LLM 模型内部,是在外部系统,这些外部系统通常是 AI 服务平台提供的程序运行时环境或开发者构建的环境(例如依赖 LangChain 等),这样就能形成 LLM 模型可以通过自然语言输出的方式间接控制外部 Function 的执行,看起来就像 LLM 模型会自己调用并执行 Function 一样。

具体见第5章的示例

2. 使用场景

  • 获取数据 :在回复用户之前,从内部系统检索数据。

  • 执行动作 :允许大模型根据对话触发操作,如安排会议或启动订单退货。

  • 构建丰富的工作流程 :允许大模型执行多步骤工作流程,如数据提取管道或内容个性化。

  • 与应用程序 UI 交互 :使用 Function calling 根据用户输入更新用户界面,例如在地图上渲染一个标记或导航网站。

3. 生命周期

当您使用 OpenAI API 进行函数调用时,模型本身永远不会执行函数 - 相反,它只是生成可以用来调用您的函数的参数。然后由代码负责处理函数的调用。

处理步骤如下:

  1. Code:将function描述和要求发送给 LLM
  2. LLM:LLM 来确定是直接给答复,还是需要调用 function
  3. LLM:如何要调用function,则返回需要调用的 function 名称以及调用 function 所需要的参数
  4. Code:程序收到 LLM 返回后,根据 LLM 的返回信息,执行 function
  5. Code:将function执行后得到的结果,以及prompt提示词发送给 LLM
  6. LLM:LLM 产生最终回答

4. 是不是每个 LLM 模型都支持 Function calling ?

对于 OpenAI 来说,Function calling 是在 2023 年 6 月 13 日发布的gpt-4-turbo 中引入的。在此日期之后发布的所有gpt-* 型号都支持功能调用。在此次日期之前发布的旧版模型未经过训练以支持 Function calling。

通常来说,Function calling 的能力取决于模型本身的设計以及针对的训练,这也意味着并不是所有的LLM模型都具有适合函数调用的特性。最主要的原因在于这一类的LLM模型必须具有能理解对Function calling的识别,并能具体从聊天消息中提取参数值等信息的能力。

当使用的模型并不是针对 Function Calling 而特别调整过的模型时,整合 LangChain 框架有机会实现 Function Calling 的效果,但有可能在精确度上会有落差,例如明明应该要调用 Function 却发现模型本身并未察觉,而未能生成实现 Function Calling 所需要的信息,因此还是会建议选择已经实现 Function Calling 的模型会比较好。

开源模型是否支持,需要查看模型的说明

5. 通过图和代码举例说明 Function calling 过程

我们将以订单配送助手为例,分析如何将Function calling集成到应用程序中。

5.1.函数定义:

定义一个供模型调用的函数 get_delivery_date ,用于获取订单的交货日期

创建一个“function definition”,向模型描述该函数get_delivery_date 。这个定义描述了函数的功能(以及可能何时调用它)以及调用函数所需的参数

import json
from datetime import datetime

import openai, os

os.environ['OpenAI_API_KEY'] = 'hk-iwte427'

from openai import OpenAI

client = OpenAI(
    base_url="https://api.openai-hk.com/v1"
)

# 1.函数定义:
# 定义一个供模型调用的函数,get_delivery_date 用于获取订单的交货日期
# 这是我们希望模型能够调用的函数(function)
def get_delivery_date(order_id: str) -> datetime:
# 连接数据库或其他数据源,查询订单的交货日期
# 返回查到的订单的交货日期
return datetime.now() 

# 创建一个“function definition”,向模型描述该函数。这个定义描述了函数的功能(以及可能何时调用它)以及调用函数所需的参数
tools = [
  {
      "type""function",
      "function": {
          "name""get_delivery_date",
          "description""获取客户订单的交货日期。每当您需要知道订单的交货日期时,例如当客户询问“我的包裹在哪里”时,请调用此函数",
          "parameters": {
              "type""object",
              "properties": {
                  "order_id": {
                      "type""string",
                      "description""客户的order ID.",
                  },
              },
              "required": ["order_id"],
              "additionalProperties"False,
          },
      }
  }
]

2.发送提示词

准备发送给模型的消息列表,表示用户和 assistant 的交互过程。

# 2.发送提示词
# 准备发送给模型的消息列表,表示用户和 assistant 的交互过程。
# 这里第一个消息是系统消息,第二个消息是用户消息。
messages = [
  {
      "role""system",
      "content""您是一位乐于助人的客户服务助理。使用提供的 tools 来帮助用户."
  }
]

# 模拟用户输入
user_message = {
      "role""user",
      "content""你好,你能告诉我订单的交货日期吗?"
}

messages.append(user_message)

# 模拟 assistant 回复
messages.append({"role""assistant""content""你好!您能提供您的订单 ID 吗?"})
# 模拟用户输入订单号
messages.append({"role""user""content""订单ID是: order_12345"})

3.调用大模型

调用 OpenAI API 的 chat completions 端点,向模型发送消息列表,获取模型的回复。

# 3.调用大模型
# 调用 OpenAI API 的 chat completions 端点,向模型发送消息列表,获取模型的回复。
response = client.chat.completions.create(
  model="gpt-4o-mini",
  messages=messages,
  tools=tools,
)

# 4. 大模型回复需要调用函数
print("模型回复 : 需要调用函数 \n",response)

4.大模型回复需要调用函数

大模型的响应消息:

ChatCompletion(   
id='chatcmpl-AfloNPlEu0PNtPkB8dthksW1dJQ0X',  # 此处是ChatCompletion请求的唯一 ID
choices=[    # 表示从模型返回的选择列表
Choice(
    finish_reason='tool_calls',  # 表示完成Completion的原因是调用了工具
    index=0
    logprobs=None, 
    message=ChatCompletionMessage(  # 当前Choice返回的消息内容
     content=None,      # 文本内容为空,因为调用了工具(function call)
     refusal=None,      # 拒绝信息为空(表示未拒绝提供答案)
     role='assistant',  # 消息的角色(此处为助手 assistant)
     audio=None,        # 音频内容为空(未生成音频)
     function_call=None,    # 已启用,现在主要用tool
     tool_calls=[
      ChatCompletionMessageToolCall( # 工具调用的具体对象
       id='call_q6JSU89b0J5eqJ2lhhxRpIyH',  # 工具调用的唯一 ID
       function=Function(arguments='{"order_id":"order_12345"}', name='get_delivery_date'), # 调用的函数信息,包括函数名和传递的参数
       type='function' # 工具调用的类型(此处为函数调用)
      )
     ]
    )
)
], 
created=1734518599
model='gpt-4o-mini-2024-07-18', 
object='chat.completion', 
。。。。
)
)

5.函数调用(执行)

提取模型的回复中的 function_call 结果,并调用 get_delivery_date 函数。

# 5.函数调用
# 提取模型的回复中的 function call 结果,并调用 get_delivery_date 函数。
# 从模型的响应中提取 get_delivery_date 的调用参数
function_call_message = response.choices[0].message
tool_call = function_call_message.tool_calls[0]
tool_call_id=tool_call.id
#tool_call_id=tool_call['id']
arguments = json.loads(tool_call.function.arguments)
print("tool_call_id : ",tool_call_id)
print("函数调用参数 : ",arguments)

order_id = arguments.get('order_id')

# 使用提取的 order_id 调用 get_delivery_date 函数
delivery_date = get_delivery_date(order_id)
print(f"订单 {order_id} 的交货日期是 {delivery_date}")

6.发送函数调用结果

创建包含 function call 结果的消息, 并将其添加到历史消息列表中,调用大模型

# 6.发送函数调用结果
# 创建包含 function call 结果的消息, 并将其添加到历史消息列表中,调用大模型
function_call_result_message = {
"role""tool",
"content": json.dumps({
      "order_id": order_id,
      "delivery_date": delivery_date.strftime('%Y-%m-%d %H:%M:%S')
  }),
"tool_call_id": tool_call_id
}

# 准备发送给模型的消息列表
#   "messages": [
#       {"role": "system", "content": "您是一位乐于助人的客户服务助理。使用提供的 tools 来帮助用户."},
#       {"role": "user", "content": "你好,你能告诉我订单的交货日期吗?"},
#       {"role": "assistant", "content": "你好!您能提供您的订单 ID 吗?"},
#       {"role": "user", "content": "订单ID是: order_12345"},
#       function_call_message,
#       function_call_result_message
#   ]
# 历史消息加上 function call 过程中的消息
messages.append(function_call_message)
messages.append(function_call_result_message)
print(messages)

# 用 OpenAI API 的 chat completions 端点将工具调用结果发送回模型
response = client.chat.completions.create(
  model="gpt-4o-mini",
  messages=messages
)

# 7.大模型回复
print("大模型回复 : ",response.choices[0].message.content)

程序执行日志:


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询