AI 大模型咋都是对话框
自2023年3月,OpenAI公司的GPT-4模型诞生以来,市面上的AI大模型如雨后春笋一般涌现出来。
无论是国外ChatGPT、Claude、Gemini,还是国内的DeepSeek、通义千问、文心一言,都是智能水平非常高的AI模型,用户可以向这些AI模型提出五花八门的问题,并且获得高质量的回答。
不过,尽管这些AI模型都很强大,但用户好像也就只能在小小的聊天窗口里和它们进行对话。比如用户让AI写一篇文章,AI写出文章以后,用户需要手工把文章复制粘贴到本地或者自媒体平台,并且手动发布;再比如用户让AI写一段代码,AI生成代码以后,用户需要手工把代码复制粘贴到本地的IDE,并手工调试和执行。
Function Calling 来了
而 Function Calling 则是OpenAI公司于2023年6月推出的一项技术,它允许AI模型在对话过程中识别用户请求中的特定需求,并"调用" 预设 的 外部函数或工具 来获取 更准确的信息或执行特定任务。简单来说,它让AI从"只能回答问题"进化到"可以实际操作工具"。
它其实就是个技术方案。2024 年流行的各种智能体(Agent),大多都是基于 Function Caliing 方案实现的。
具体来说,其实就是说 AI 大模型的特长是在 语言层面,它能像人一样理解语言中的意图并做出语言回应,但问题是只是“能说会道”可不行,人类除了可以用语言交流,在漫长的进化过程中还有最重要的一步就是 “使用工具”。
也就是说,现在模型已经精通语言部分了,下一步就是使用工具了。当然,这个工具已经有很多早都放在那里了(程序员在之前的互联网发展历程中,已经开发了很多比较优秀且稳定的工具、接口 等等...) ,现在就等着模型根据用户的意图去选择能解决用户问题的 最趁手的工具了。
Function calling 方案如何帮助 AI 模型 “使用工具”
应用开发人员结合公司的运营特点,将一些能够提高用户体验的一些功能点 整理成一份清单,其实就类似一份接口文档;
然后将这份清单告诉我们将要接入的 AI 大模型,也就是告诉模型我们现在有哪些工具可以供它使用,假如我们的用户在和模型交流中有想使用这些工具的意图时,模型就可以从这份清单中选出用户要用的接口,然后告诉我们的应用程序,用户程序负责真正执行功能,然后将结果返回给模型,模型再整理并理解后,将最终信息返回给用户。
Function calling 格式需根据模型特制
之所以说 Function calling 只是个技术方案,就是因为具体实现起来,各家的细节可就千差万别了,因为各家的模型在训练模型时,用的训练数据都是特定格式(针对识别用户 Function calling (“接口文档”) 所用的训练数据的格式可能都不太一样)。因此,你的 function calling 不能自己随便定义,你需要根据你所使用的 AI 模型文档中提供的 function calling 的格式,这样模型才能更好的识别你的清单。
# 这些结构是模型强制的"语法"
{
"name": "xxx", # ✅ 必须叫name
"description": "xxx", # ✅ 必须叫description
"parameters": { # ✅ 必须叫parameters(或input_schema)
"type": "object", # ✅ 必须有type
"properties": { # ✅ 必须有properties
"param_name": {
"type": "string", # ✅ 必须有type
"description": "xxx"
}
},
"required": ["xxx"] # ✅ 必须有required
}
}
# 这些结构是模型强制的,不能改变
# ❌ 不能把name改成function_name
# ❌ 不能把description改成purpose
# ❌ 不能把parameters改成args
# ❌ 不能省略type, properties, required等结构字段
functions = [
{
"name": "search_products", # ✅ 函数名随便起
"description": "搜索电商平台商品", # ✅ 描述随便写
"parameters": {
"type": "object",
"properties": {
"keyword": { # ✅ 参数名随便起
"type": "string",
"description": "搜索关键词" # ✅ 参数描述随便写
},
"category": {
"type": "string",
"enum": ["electronics", "clothing", "books"] # ✅ 枚举值自定义
}
},
"required": ["keyword"] # ✅ 哪些参数必填自己决定
}
}
]
所以,如果你的应用用到了多个模型,那你的 function calling 的格式可能要适配多个模型。
AI 模型没有记忆
由于 AI 模型其实没有什么记忆力,因此每次用户在与模型进行问答时,都需要把我们按照模型规定的格式所制定的 Function calling 清单一起作为 prompt 发送给模型,模型如果在用户的提问中识别到了用户的意图要用到我们 function calling 清单中的哪个接口,就会返回这个接口的具体信息给应用程序,然后我们的应用程序就可以真正调用这个接口,并返回具体执行结果。
不过这里可以做些优化,比如:用户每次在向模型提问前,应用程序可以先简单识别用户的关键字,假设识别到用户有可能会调用到我们的某些函数时,才将 function calling 清单和用户的提问一起作为 prompt 发送给 AI 模型,并且我们的 function calling 清单也可以按照类型分为很多份,每次可以只根据用户提问中的关键字发送合适的 function calling 清单即可。... 当然,优化方案可以更丰富