随着人工智能技术的不断发展,大模型在企业中的应用也越来越广泛。然而,在实际应用中,企业仍然面临着一些挑战,尤其是在与外部环境的交互上。本文将探讨这些挑战,并介绍一种有效的解决方案——OpenAI Function Calling。
一、大模型在企业中应用的挑战
-
获取实时信息:大模型在处理静态数据时表现出色,但在获取和处理实时信息方面,仍存在一定困难。
-
使用企业数据:大模型需要访问企业内部数据,这些数据往往分散在不同的系统中,如何高效地整合和利用这些数据是一个挑战。
-
多模态应用:企业应用往往需要处理多种类型的数据,如文本、图像、音频等,多模态应用要求模型具备更强的处理能力。
-
理解复杂的实际场景:企业业务场景复杂多变,大模型需要具备强大的理解和推理能力,才能应对各种复杂情况。
-
在实际环境中执行动作:将模型的预测和决策应用到实际操作中,确保其在真实环境中有效执行,是一个关键挑战。
二、OpenAI Function Calling 简介
为了解决上述挑战,OpenAI 推出了 Function Calling 功能。通过这个功能,可以将方法(工具)说明随用户请求一起放在 Prompt 中传给 GPT,GPT 返回要调用的方法名及参数值,然后在外部运行该方法获得结果,再将调用结果及前面的对话历史一起放回 Prompt,再次调用 GPT。
三、OpenAI Function Calling 实践与实现思路
1、为了在实际应用中实现 Function Calling
-
构建一个 dict 对象存储方法:例如,{"方法1": 方法1, "方法2": 方法2, …}。
-
在 Prompt 中加入方法定义:将方法的定义和用途描述放在 Prompt 中,传递给 GPT。
-
根据 LLM 的返回,决定是否调用函数:如果返回信息中含有 "function_call",则调用指定函数,否则直接返回信息给用户。
-
调用函数并再次调用 LLM:如需调用函数,则执行 LLM 指定的函数,并将结果及调用的函数一起放在 Prompt 中,再次调用 LLM,获取最终结果。
2、如何使用 OpenAI Function Calling
-
方法用途描述:在定义方法时,需要详细描述其用途,让模型能够准确理解该方法的功能。
-
参数描述:清晰描述每个参数的作用和类型,确保模型能够正确生成参数值。
-
-
-
-
通过 {"name": "my_function"} 强制模型调用指定函数
默认值为 "auto",意味着模型在大多数情况下会自动选择是否调用函数。
import openai
import os
import json
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
openai.api_key = os.getenv('OPENAI_API_KEY')
openai.api_base = os.getenv('OPENAI_API_URL')
model = os.getenv('OPENAI_API_MODEL')
def get_current_cluster_state(cluster_name):
print(f"cluster:{cluster_name}")
return"""ERROR: Failed to pull image "tanjp/docker/dsp:latest"""
funcs = {"get_current_cluster_state": get_current_cluster_state}
def run(input):
msg=[{"role":"user","content":input}]
ret = run_conversation(msg)
return ret["content"]
def run_conversation(msg):
response = openai.ChatCompletion.create(
model=model,
messages=msg,
temperature=0,
functions=[
{
"name": "get_current_cluster_state",
"description": "Get the current state in a given cluster",
"parameters": {
"type": "object",
"properties": {
"cluster_name": {
"type": "string",
"description": "the name of the cluster",
},
},
"required": ["cluster_name"],
},
}
],
function_call="auto",
)
message =response["choices"][0]["message"]
print("----- message ----")
print(message)
print("----- message ----")
if not message.get("function_call"):
return message
function_name = message["function_call"]["name"]
function_args = json.loads(message["function_call"]["arguments"])
print(function_args)
res = funcs[function_name](function_args["cluster_name"])
message["content"]=None
msg.append(message)
msg.append({
"role": "function",
"name": function_name,
"content": res,
})
return run_conversation(msg)
if __name__ == "__main__":
print(run("What's wrong with the cluster 'DSP'? And if there's an error, give me some suggestion. "))
在这个例子中,我们定义了一个名为 get_current_cluster_state 的函数,并在 Prompt 中包含了方法的用途描述和参数描述。模型会根据用户的输入决定是否调用该函数,并返回结果。
结论
通过 OpenAI Function Calling 功能,企业可以更高效地应用大模型,解决获取实时信息、使用企业数据、多模态应用、理解复杂场景和在实际环境中执行动作等挑战。我们期待这一技术能够在更多实际应用中发挥重要作用,助力企业实现智能化转型。