Function Call 技术详解
一:Function Call 介绍
随着ChatGPT等通用大模型的出现,它们可以生成令人惊叹的自然语言,使得机器能够更好地理解和回应人类的需求,但在特定领域的任务上仅靠通用问答是无法满足日常工作需要。随着OpenAI推出了Function Call功能,工具调用能力越来越作为开源模型的标配。
那什么是 FunctionCall 呢?顾名思义就是大模型能够判断应该调用哪个Function(API、Method)以及对应的参数,这个极大程度上提升了大模型在特定领域上的知识能力,弥补大模型能力上的不足,比如以下例子:
- 现在北京时间是什么时候?
- 帮我查一下北京现在的天气?帮我查一下昨天百度股票收盘价是多少?
- 在机器空闲的时间请帮我跑一下 LLama 的 CE,并把报告发到飞书群(群号:12345678)中,并艾特 XXX 注意消息内容。 以上例子都是真实能够实现的例子,也是现实生活中接触最多最有价值的例子。
1.1 原理
FunctionCall 会根据用户的 query 判断是否要调用预定义的函数、如何编排这些函数的调用、如何抽取函数之间的输入参数,整体功能介绍图如下所示:
根据上图可以看出,一个完整的FunctionCall 调用的流程当中需要有以下步骤:
- LLM 根据用户的 query 来判断:要调用哪个工具(find_course)以及工具的入参(skill=beginner, product=azure)。
- 调用并执行该工具(find_course)获得输出(AI-900)
- 将用户对话历史和工具调用信息和工具返回结果等关键信息输入给 LLM,得到最终回复结果(I would recommend AI-900)。
当然为了实现这些功能,肯定是需要从训练数据上做一些处理的,这个在下面的章节中会介绍。
基于 OpenAI SDK FunctionCall 的调用示例如下所示:
response = client.chat.completions.create(
model=deployment,
messages=messages,
functions=functions, # 工具定义信息
function_call="auto" # 自动调用某工具
)
print(response.choices[0].message)
如果调用了某工具信息,此时返回的信息如下所示:
{
"role": "assistant",
"function_call": {
"name": "search_courses",
"arguments": "{\n \"role\": \"student\",\n \"product\": \"Azure\",\n \"level\": \"beginner\"\n}"
}
}