OpenAI
引入函数调用(function calling
)功能是为了增强其语言模型的能力,使其能够执行更复杂、更具体的任务。
通过函数调用,模型可以与外部软件、数据库或其他服务进行交互,从而执行计算、查询信息、执行操作等。
以下是函数调用的一些潜在好处:
- 扩展能力:函数调用允许模型执行超出其预训练知识范围的任务,例如实时数据检索、执行复杂计算等。
- 实时数据:模型可以访问最新的数据,而不是仅仅依赖于训练时所学的知识。
- 定制化服务:通过调用特定函数,用户可以根据自己的需求定制模型的行为,使其更好地适应特定的应用场景。
- 安全性与隐私:在某些情况下,函数调用可以提供更安全的数据处理方式,例如在本地执行敏感数据的操作,而不是将数据发送到外部服务器。
- 效率提升:对于需要大量计算的任务,函数调用可以利用外部服务的高效计算能力,而不是仅仅依赖于模型的内部处理。
- 灵活性:函数调用使得模型可以与各种外部系统集成,从而提供更加灵活和多样化的服务。
总之,函数调用是 OpenAI 为了提高其语言模型的实用性和灵活性而采取的一种策略,它使得模型能够更好地与外部世界交互,执行更复杂的任务,并为用户提供更加定制化和高效的服务。
函数调用的流程
- 将使用方法(工具)说明随用户请求一起放在
Prompt
中传给 GPT。 - GPT 返回要调用的方法名及参数值,然后在外部运行该方法获得结果。
- 将调用结果及前面的对话历史一起放入
Prompt
,再次调用 GPT。
函数调用实现基本思路
- 构建一个
dict
对象存储方法名及其对应的函数。 - 在
Prompt
中加入方法定义 - 根据 LLM 的返回,决定是否调用函数(返回信息中含有 "function_call"),还是直接返回信息给用户
- 如需调用函数,则调用 LLM 指定函数,并将结果及调用的函数一起放在
Prompt
中再次调用 LLM。
示例
下面的示例中:
query_weather
是查询天气的函数,写死了返回值。在实际应用中可以调用天气 API 来获取实时天气信息。query
是我们要询问 LLM 的方法。
1 | import json |
说明:
query_weather
是一个查询天气的函数,接收一个问题参数,返回天气信息。例子中写死了。- 我们需要使用
OpenAI.chat.completions.create
方法来做有function calling
的操作。 - 使用了
gpt-4
模型,因为gpt-3.5-turbo
并不能根据我的问题来推理出需要查询广州的天气。 - 在函数调用之后,我们会将函数调用的结果及函数名一起放入
Prompt
中再次调用 LLM。 - 最终 LLM 能根据我们的问题,以及函数调用的结果,告诉我们广州今天的天气适合穿什么。
实际过程其实是,我们告诉了 GPT 一些可以使用的工具,然后 GPT 可以推理出什么时候以及用什么参数来调用这些工具,从而得到我们想要的结果。 如果需要 GPT 精确地调用某个函数,我们需要在
create
方法中传递参数地时候就描述清除方法在什么时候调用,以及函数地目的是什么,参数是什么,参数的作用是什么等。
应用:让 LLM 帮助我们实时搜索
我们可以使用前面文章提到过的 GoogleSerperAPIWrapper
来帮助我们完成搜索任务。
1 | import json |
这个例子跟上面的例子差不多,只是这个例子中,我们做了实时的搜索,而不是写死了返回值。
输出:
1 | calling function. |
我们可以问一下实时性更强的问题:
1 | res1 = query([{'role': 'user', 'content': '2024 欧洲杯冠军是哪个国家?'}]) |
输出:
1 | calling function. |
可以看到,我们可以通过 LLM 来实时搜索一些信息。 通过这种方式,我们就等于在一定程度上拓展了 LLM 的能力,因为它获取信息的渠道不只是之前训练时用的数据了。
总结
函数调用是 OpenAI 为了提高其语言模型的实用性和灵活性而采取的一种策略, 它使得模型能够更好地与外部世界交互,执行更复杂的任务,并为用户提供更加定制化和高效的服务。