掘金 人工智能 06月03日
了解Function Calling的原理
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

Function Calling技术将大语言模型的语言理解能力与外部工具功能相结合,使模型能够调用工具完成任务,如获取天气信息、预订机票、执行代码等。文章通过一个二维数组求和计算的例子,详细介绍了ChatGPT如何调用自定义函数,包括定义外部函数、建立函数库、以及与LLM的通信过程。通过两次交互,LLM将自然语言转化为结构化语言,调用函数并最终输出结果,展示了Function Calling在增强模型交互性和功能性方面的强大能力。

💡Function Calling 的核心在于融合大语言模型的理解能力与外部工具。这使得模型能够根据用户意图,调用合适的工具来执行任务,极大地扩展了模型的功能边界。

🛠️通过一个具体的例子——二维数组求和计算,文章详细阐述了ChatGPT调用自定义函数的过程。这包括定义外部函数、建立函数库,以及通过JSON Schema格式定义函数参数,确保模型调用时的数据格式正确。

🔄LLM与外部函数的交互分为两次。第一次交互中,模型识别用户需求并调用函数;第二次交互中,模型利用函数返回的结果生成最终的答案,展示了Function Calling的完整工作流程。

背景

Function Calling 的核心思想:  将大语言模型的语言理解能力与外部工具的功能结合起来,让大语言模型能够理解用户的意图,并调用合适的工具来完成任务。例如,通过 Function Calling,大语言模型可以:

例子:ChatGPT调用 自己定义的函数 实现 二维数组的求和计算

1.建立自定义函数和与LLM的通信

(1)定义:外部函数(自定义函数)

def chen_ming_algorithm(data):  #计算 二维数组的每行的和    '''    陈明算法函数,该函数定义了一种特殊的数据集计算过程    :param data: 必要参数,表示带入计算的数据表,用字符串进行表示    :return: 陈明函数计算后的结果,返回结果为表示为JSON格式的DataFrame类型对象    '''    data = io.StringIO(data)    df_new = pd.read_csv(data, sep='\s+', index_col=0)    res = np.sum(df_new, axis=1) - 1    return json.dumps(res.to_string())

(2)建立外部函数库

字典类型 ,用于方便后面通讯时候查找调用的函数

available_functions = {    "chen_ming_algorithm": chen_ming_algorithm,}

3)通讯 Functions

在 Chat 模型中的 function calling 功能中,functions 参数的作用是定义模型可以调用的函数信息。通过 functions 参数,LLM的Chat 模型可以根据上下文智能选择并调用适当的函数,来完成特定的任务或查询。这种机制在增强模型的交互性和功能性方面非常重要,使得模型能够执行更加复杂和多样化的操作。这些信息包括:

function = {    "name": "chen_ming_algorithm",    "description": "用于执行陈明算法的函数,定义了一种特殊的数据集计算过程",    "parameters": {        "type": "object",        "properties": {            "data": {                "type": "string",                "description": "执行陈明算法的数据表字符串表示"            }        },        "required": ["data"],    },}

2. LLM通讯具体过程

(1)不使用 外部函数 LLM 的response 的例子

# 定义messages列表,其中包含system和user的消息messages = [    {"role": "system", "content": "数据集data: %s, 数据集以字符串形式呈现" % df_str},    {"role": "user", "content": "请在数据data上执行陈明算法"}]# 调用openai接口,生成对话响应response = openai.ChatCompletion.create(    model="gpt-4-0613",    messages=messages)# 提取生成的响应消息response_message = response["choices"][0]["message"]# 检查生成的内容,输出调试print(response_message["content"])

(2)使用外部函数 第一次询问

添加参数:functions=functions, function_call="auto"

# 再次调用openai接口,并指定使用functions和function_callresponse = openai.ChatCompletion.create(    model="gpt-4-0613",    messages=messages,    functions=functions,  # 传递可用的函数字典    function_call="auto"  # 自动执行函数调用)# 提取函数调用信息response_message = response["choices"][0]["message"]function_name = response_message["function_call"]["name"] #functions 提取,并整理的符合参数类型  自然语言转化为结构化语言function_to_call = available_functions[function_name]   #调用函数库

# 提取参数并调用相应函数function_args = json.loads(response_message["function_call"]["arguments"]) function_response = function_to_call(**function_args)  #加载到外部函数中print(function_response)

# 将第一次模型返回的结果消息追加到messages中messages.append(response_message) 

#将函数调用结果作为下一步messages中的一部分,更新消息messages.append({    "role": "function",    "name": function_name,    "content": function_response})

(3)使用外部函数 第二次询问

# 再次调用模型并输出最终结果second_response = openai.ChatCompletion.create(    model="gpt-4-0613",    messages=messages,)# 提取并打印最终生成的消息内容final_message = second_response["choices"][0]["message"]["content"]print(final_message)# 转换为DataFramedf_str = final_message

json schema 格式

判断:判断是否为一个 array 如果是array 则加入item 判断多个 property 否则只有一个property套娃 :可以property 里面 套type 在套 property

Message 4种消息

函数查表

response.choices[0].message['content']

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Function Calling 大语言模型 ChatGPT AI工具
相关文章