近年来大模型发展过程中面临的几个核心挑战:静态知识的局限性、执行能力的缺失、与外部系统的割裂。为了应对这些挑战,推动大模型从单纯的语言生成工具演变为真正的任务执行引擎,Function calling 诞生了,已经成为大模型一项不可或缺的核心能力。
1. 什么是 Function calling
Function calling 使开发者能够将语言模型连接到外部数据和系统。您可以定义一组函数作为模型可访问的工具,并根据对话历史在适当的时候使用它们。然后在应用端执行这些函数,并将结果反馈给模型。
Function calling 其实并不是 LLM 模型本身独立的能力,而是依赖 LLM 模型对函数描述的理解和生成调用参数的能力。因此模型本身需要经过特殊训练来支持这一功能,再结合由开发者或平台在 LLM 周围实现的外部机制,来让模型与外界进行互动
LLM本质上是一个生成文本,接受 prompt 输入后会生成对应的文本回应。而通过附加的中间层(如 API 或应用层的开发设计),可以引导模型识别出需要调用 Function 的情境,并让其生成 Function Calling 所需要的信息,例如 函数名称、参数。
而实际执行函数的环境不是在 LLM 模型内部,是在外部系统,这些外部系统通常是 AI 服务平台提供的程序运行时环境或开发者构建的环境(例如依赖 LangChain 等),这样就能形成 LLM 模型可以通过自然语言输出的方式间接控制外部 Function 的执行,看起来就像 LLM 模型会自己调用并执行 Function 一样。
2. 使用场景
- 获取数据 :在回复用户之前,从内部系统检索数据。
- 执行动作 :允许大模型根据对话触发操作,如安排会议或启动订单退货。
- 构建丰富的工作流程 :允许大模型执行多步骤工作流程,如数据提取管道或内容个性化。
- 与应用程序 UI 交互 :使用 Function calling 根据用户输入更新用户界面,例如在地图上渲染一个标记或导航网站。
3. 生命周期
当您使用 OpenAI API 进行函数调用时,模型本身永远不会执行函数 - 相反,它只是生成可以用来调用您的函数的参数。然后由代码负责处理函数的调用。
处理步骤如下:
-
Code:将function描述和要求发送给 LLM
-
LLM:LLM 来确定是直接给答复,还是需要调用 function
-
LLM:如何要调用function,则返回需要调用的 function 名称以及调用 function 所需要的参数
-
Code:程序收到 LLM 返回后,根据 LLM 的返回信息,执行 function
-
Code:将function执行后得到的结果,以及prompt提示词发送给 LLM
-
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)
程序执行日志:
如何学习AI大模型?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓