AI大模型探索之路-实战篇6: Function Calling技术调研之详细流程剖析

系列篇章💥

AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践
AI大模型探索之路-实战篇5: Open Interpreter开放代码解释器调研实践


目录

  • 系列篇章💥
  • 一、前言
  • 二、Function Calling详细流程剖析
    • 1、创建OpenAI客户端
    • 2、定义函数
    • 3、创建数据参数对象
    • 4、对象转化
    • 5、函数调用测试
    • 6、定义工具函数
    • 7、发送OpenAI 对话请求测试
    • 8、指定工具函数进行调用
    • 9、存储返回的结果信息
    • 10、查看函数名称和参数
    • 11、调用工具函数
    • 12、将第一次返回的结果合并到消息列表
    • 13、将functiona的信息合并到消息列表
    • 14、第二次OpenAI API调用
  • 三、Function Calling完整样例
  • 四、结语


一、前言

继之前对DB-GPT和Open Interpreter技术的深入调研,本文将转向对OpenAI的Function Calling技术进行回顾与探讨。此次分析的目的旨在为即将到来的智能数据分析平台的顺利落地做好充分的技术储备。通过对Function Calling技术的深度剖析,我们希望建立更加坚实的理论基础,并在此基础上探索其在实际应用中的潜在价值和实施路径。这将不仅有助于我们更好地理解语言模型如何与程序代码交互,而且为未来的开发工作提供指导和灵感。

二、Function Calling详细流程剖析

本章节旨在深入剖析从OpenAI客户端的创建到数据参数的定义,再到函数的定义、调用以及最终结果的整理输出的完整过程。这一详尽的解析将帮助我们深入理解Function Calling技术的每一个细节和实际应用中的操作流程。

1、创建OpenAI客户端

首先,我们需要创建一个有效的OpenAI客户端。这包括获取必要的API密钥和配置环境参数。通过这个过程,我们可以确保在后续步骤中顺畅地与OpenAI的服务器进行通信。

import openai
import os
import numpy as np
import pandas as pd
import json
import io
from openai import OpenAI
import inspect# 从环境变量中获取OpenAI API密钥
openai.api_key = os.getenv("OPENAI_API_KEY")# 使用API密钥创建OpenAI客户端实例
client = OpenAI(api_key=openai.api_key)

2、定义函数

定义了一个名为sunwukong_function的函数,该函数接受一个字符串类型的数据集作为参数,并将其转换为pandas DataFrame对象。然后,它将DataFrame中的每个元素乘以10,并将结果转换为JSON格式的字符串返回。

def sunwukong_function(data):"""孙悟空算法函数,该函数定义了数据集计算过程:param data: 必要参数,表示带入计算的数据表,用字符串进行表示:return:sunwukong_function函数计算后的结果,返回结果为表示为JSON格式的Dataframe类型对象"""data = io.StringIO(data)df_new = pd.read_csv(data, sep='\s+', index_col=0)res = df_new * 10return json.dumps(res.to_string())

3、创建数据参数对象

接下来,我们需要定义数据参数。这些参数将作为输入传递给Function Call函数,以生成相应的输出结果。在本例中,我们将使用一个简单的数学计算任务作为示例。

#创建了一个名为df的DataFrame对象,其中包含两列数据x1和x2。
df = pd.DataFrame({'x1':[1, 2], 'x2':[3, 4]})
df

输出
在这里插入图片描述

4、对象转化

#将df对象转换为字符串类型。

df_str = df.to_string()
df_str

输出
在这里插入图片描述

5、函数调用测试

#将df字符串传递给sunwukong_function函数进行计算。最后,它将计算结果打印出来。

result_json=sunwukong_function(df_str)
result_json

在这里插入图片描述

6、定义工具函数

# 定义一个工具函数
sunwukong={"type": "function","function": {"name": "sunwukong_function","description": "用于执行孙悟空算法函数,定义了一种特殊的数据集计算过程","parameters": {"type": "object","properties": {"data": {"type": "string","description": "执行孙悟空算法的数据集"},},"required": ["data"],},}}
# 放入工具列表
tools = [sunwukong]

7、发送OpenAI 对话请求测试

我们通过大模型的对话请求API进行确认,大模型是否能能正确找到对应的函数工具。

# 这段代码定义了一个名为messages的列表,其中包含两个字典对象。第一个字典对象表示系统角色,其内容为数据集data的描述信息;第二个字典对象表示用户角色,其内容为执行孙悟空算法的请求。
messages=[{"role": "system", "content": "数据集data:%s,数据集以字符串形式呈现" % df_str},{"role": "user", "content": "请在数据集data上执行孙悟空算法"}
]
# 使用OpenAI API中的chat.completions.create方法来生成响应。该方法接受两个参数:model和messages。model参数指定要使用的模型版本,这里使用的是gpt-3.5-turbo模型;messages参数是要发送给API的消息列表,这里传入的是前面定义的messages列表。response =  client.chat.completions.create(model="gpt-3.5-turbo",messages=messages
)
# 从响应中提取出第一个选择的消息,并将其打印出来。这个消息应该是由API根据输入的数据集和请求生成的孙悟空算法的结果。
response.choices[0].message

输出:

ChatCompletionMessage(content='抱歉,我不清楚您指的“孙悟空算法”是什么意思。请问您能提供更多关于该算法的背景或者说明吗?这样我才能帮助您更好地实现您的目标。', role='assistant', function_call=None, tool_calls=None)

当前对话中没有设置工具函数,因此大模型并没有找到自定义的工具函数

8、指定工具函数进行调用

我们再次进行大模型API调用,这一次我们指定功能工具函数tools,设置为自动选择(tool_choice=“auto”,)让模型自己检查判断是否需要调用工具函数。

messages=[{"role": "system", "content": "数据集data:%s,数据集以字符串形式呈现" % df_str},{"role": "user", "content": "请在数据集data上执行孙悟空算法"}
]
# 重新初始化消息列表后,设置tools参数和tool_choice,让大模型自己选择是否使用工具
# 不会直接执行function_call函数。这段代码是调用OpenAI API的chat.completions.create方法,用于生成聊天机器人的回答。其中,model参数指定了使用的模型版本,messages参数传入了要发送给API的消息列表,tools参数传入了工具列表,tool_choice参数指定了选择工具的方式。
response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,tools=tools,tool_choice="auto",  )
# 查看消息结果,返回内容为空,但是找到返回了工具函数
response.choices[0].message

输出:

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')])

从输出结果可以看到,工具配置生效,大模型已经找到了工具函数

9、存储返回的结果信息

将结果信息存储到first_response

# 打印出消息,可以看到消息中已经找到了函数sunwukong_function
first_response = response.choices[0].message
first_response

输出:

ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')])

查看结果信息中的工具信息

response.choices[0].message.tool_calls

输出:

[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')]

10、查看函数名称和参数

将工具函数放入到字典中,再循环获取到工具列表中的每一个函数的名称,参数

#定义了一个名为available_tools的字典,其中包含了可用的工具函数
available_tools =  {"sunwukong_function": sunwukong_function,
}
#从API返回的回答中提取出工具调用信息,并遍历每个工具调用。对于每个工具调用,获取函数名、函数参数,并使用这些信息调用相应的工具函数。
tool_calls = response.choices[0].message.tool_callsfor tool_call in tool_calls:function_name = tool_call.function.namefunction_to_call = available_tools[function_name]function_args = json.loads(tool_call.function.arguments)function_response = function_to_call(**function_args)# 打印出函数名、函数参数和函数响应。
print(function_name)
print(function_args)
print(function_response)

输出:
在这里插入图片描述

11、调用工具函数

#调用工具函数并获取其响应。它首先使用工具函数名和参数调用相应的工具函数,并将返回值存储在名为function_response的变量中。然后打印出这个响应
function_response = function_to_call(**function_args)
function_response

输出:
在这里插入图片描述

12、将第一次返回的结果合并到消息列表

# 追加第一次模型返回结果消息
messages.append(first_response)  
messages

输出:

[{'role': 'system','content': '数据集data:   x1  x2\n0   1   3\n1   2   4,数据集以字符串形式呈现'},{'role': 'user', 'content': '请在数据集data上执行孙悟空算法'},ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')])]

13、将functiona的信息合并到消息列表

# 追加function返回消息
messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,}
)
messages

输出:

[{'role': 'system','content': '数据集data:   x1  x2\n0   1   3\n1   2   4,数据集以字符串形式呈现'},{'role': 'user', 'content': '请在数据集data上执行孙悟空算法'},ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_z16cI8SX4FkoW71SNV95hjIL', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function')]),{'tool_call_id': 'call_z16cI8SX4FkoW71SNV95hjIL','role': 'tool','name': 'sunwukong_function','content': '"   x1  x2\\n0  10  30\\n1  20  40"'}]

14、第二次OpenAI API调用

第二次调用大模型API,让大模型帮忙整理响应信息

# 再次调用,由大模型重新整理工具函数返回的结果信息(主要是将结果信息整理的更加方便可视化)
second_response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,
)print(second_response.choices[0].message.content)

在这里插入图片描述

三、Function Calling完整样例

完整的Function Calling函数使用代码如下

from openai import OpenAI
import jsonopenai.api_key = os.getenv("OPENAI_API_KEY")client = OpenAI(api_key=openai.api_key)# Example dummy function hard coded to return the same weather
# In production, this could be your backend API or an external API
def sunwukong_function(data):"""孙悟空算法函数,该函数定义了数据集计算过程:param data: 必要参数,表示带入计算的数据表,用字符串进行表示:return:sunwukong_function函数计算后的结果,返回结果为表示为JSON格式的Dataframe类型对象"""data = io.StringIO(data)df_new = pd.read_csv(data, sep='\s+', index_col=0)res = df_new['x1'] * 10return json.dumps(res.to_string())df_str=pd.DataFrame({'x1':[1, 2], 'x2':[3, 4]}).to_stringdef run_conversation():# 步骤1:将对话和可用函数发送给模型messages=[{"role": "system", "content": "数据集data:%s,数据集以字符串形式呈现" % df_str},{"role": "user", "content": "请在数据集data上执行孙悟空算法"}  ]tools = [{"type": "function","function": {"name": "sunwukong_function","description": "用于执行孙悟空算法函数,定义了一种特殊的数据集计算过程","parameters": {"type": "object","properties": {"data": {"type": "string","description": "执行孙悟空算法的数据集"},},"required": ["data"],},}}]response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,tools=tools,tool_choice="auto",  # auto is default, but we'll be explicit)response_message = response.choices[0].messagetool_calls = response_message.tool_calls# 步骤2:检查模型是否想要调用函数if tool_calls:# 步骤3:调用函数# 注意:JSON响应可能不总是有效的;确保处理错误available_functions = {"sunwukong_function": sunwukong_function,}  # 这个例子中只有一个函数,但您可以有多个函数messages.append(response_message)  # 将助手的回复扩展到对话中# 步骤4:将每个函数调用和函数响应的信息发送给模型for tool_call in tool_calls:function_name = tool_call.function.namefunction_to_call = available_functions[function_name]function_args = json.loads(tool_call.function.arguments)function_response = function_to_call(**function_args)messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,})  # 将函数响应扩展到对话中second_response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,)  # 从模型获取新的响应,其中可以看到函数响应return second_response
result=run_conversation()
result.choices[0].message.content

输出:
在这里插入图片描述

# 使用StringIO将字符串转换为文件对象
df_str='\\n    x1\\n0  10\\n1  20\\n.'
data = io.StringIO(df_str)# 使用read_csv()函数读取数据,并设置第一列为索引
df_new = pd.read_csv(data, sep='\s+', index_col=0)
df_new

输出:
在这里插入图片描述

四、结语

本文深入探讨了函数调用的全过程,详细阐述了其每一个细节步骤。在回顾函数调用的实践应用中,我们不仅加深了对其运作机制的理解,还体会到了其在编程实践中的强大功能和灵活性。通过逐步剖析与实际操作的结合,本文档旨在为读者提供一个全面而实用的指南,以促进对函数调用概念的掌握及其在实际编程中的应用。希望读者能够借此更好地利用函数调用,优化代码结构,提升开发效率。

在这里插入图片描述

🎯🔖更多专栏系列文章:AIGC-AI大模型探索之路

如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCL 法向量加权的RANSAC拟合分割平面

目录 一、算法原理1、原理概述2、主要函数二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、原理概述

鸿蒙布局List简介

鸿蒙布局List简介 List--常见的布局容器List 创建方式创建方式一,通过Listitem创建方式二,通过ForEach和Listitem创建方式三,通过ListItemGroup List–常见的布局容器 List是在app开发中最常见的一种布局方式,例如通讯录、新闻列…

Wpf 使用 Prism 实战开发Day24

自定义询问窗口 当需要关闭系统或进行删除数据或进行其他操作的时候&#xff0c;需要询问用户是否要执行对应的操作。那么就需要一个弹窗来给用户进行提示。 一.添加自定义询问窗口视图 (MsgView.xaml) 1.首先&#xff0c;添加一个自定义询问窗口视图 (MsgView.xaml) <Use…

域内攻击 ----->约束非约束委派攻击

在域中&#xff0c;除了我们常见的横向移动以外&#xff0c;还有很多攻击&#xff0c;像什么kerberoasting&#xff0c;委派攻击&#xff0c;NTLMrelay啊...... 还有很多&#xff08;暂时只知道这些&#xff09; 以前在一篇公众号看到的一个笑话也荟萃了网安的一些攻击手法&am…

《拯救大学生课设不挂科第二期之Windows11下安装VC6.0(VC++6.0)与跑通Hello World C语言程序教程》【官方笔记】

背景与目标人群&#xff1a; 大学第一次学C语言的时候&#xff0c;大部分老师会选择VC6这个编辑器。 但由于很多人是新手&#xff0c;第一次上大学学C语言。 老师要求VC6.0&#xff08;VC6.0&#xff09;写C语言跑程序可能很多人还是第一次接触电脑。 需要安装VC6这个编辑器…

初识Java--开启我的Java学习之旅

目录 一、JAVA语言概述二、JAVA语言的重要性2.1语言使用广泛程度2.2工作领域2.3在校招岗位的需求2.4 java语言发展简史2.5Java语言特性 三、初识java的main方法四、运行java程序五、【面试题】JDK、JRE、JVM之间的关系&#xff1f; 一、JAVA语言概述 Java是一种优秀的程序设计…

【Apache Doris】周FAQ集锦:第 4 期

【Apache Doris】周FAQ集锦&#xff1a;第 4 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

Redis常见数据类型(6)-set, zset

目录 Set 命令小结 内部编码 使用场景 用户画像 其它 Zset有序集合 普通指令 zadd zcard zcount zrange zrevrange ​编辑 zrangebyscore zpopmax/zpopmin bzpopmax/bzpopmin zrank/zrevrank zscore zrem zremrangebyrank zremrangebyscore Set 命令小结 …

Spring 模拟管理Web应用程序

MVC&#xff1a;Model View Controller 1&#xff09;controller&#xff1a;控制层&#xff08;Servlet是运行服务器端&#xff0c;处理请求响应java语言编写技术&#xff09; 2&#xff09;service&#xff1a;业务层&#xff08;事务&#xff0c;异常&#xff09; 3&#xf…

视频号小店的保证金是多少钱?2024最新收费标准,一篇了解!

哈喽~我是电商月月 现实社会&#xff0c;干什么都需要交钱&#xff0c;就连上班&#xff0c;路费也得掏钱 想要入驻视频号小店&#xff0c;在视频号里卖货赚钱&#xff0c;就要缴纳类目保证金 那到底要缴多少钱呢&#xff1f; 今天&#xff0c;月月就把最新的收费标准分享给…

轻松拿捏C语言——【字符串函数】的使用及模拟实现

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f389;创作不易&#xff0c;请多多支持&#x1f389; &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 感谢 目录 一、…

3D 生成重建013-ProlificDreamer将SDS拓展到VSD算法进行高质量的3D生成

3D 生成重建013-ProlificDreamer将SDS拓展到VSD算法进行高质量的3D生成 文章目录 0论文工作1论文方法2效果 0论文工作 **分数蒸馏采样&#xff08;SDS&#xff09;**通过提取预先训练好的大规模文本到图像扩散模型&#xff0c;在文本到3d生成方面显示出了巨大的前景&#xff0…

Windows VS2022 C语言使用 sqlite3.dll 访问 SQLite数据库

今天接到一个学生C语言访问SQLite数据库的的需求: 第一步,SQLite Download Page下载 sqlite3.dll 库 下载解压,发现只有两个文件: 于是使用x64 Native Tools Command Prompt 终端 生成 sqlite3.lib 和 sqlite3.exp文件 LIB -def:sqlite3.def -out:sqlite3.lib -machin…

广告圈策划大师课:活动策划到品牌企划的深度解析

对于刚接触营销策划的新人来说&#xff0c;在这个知识密集型行业里生存&#xff0c;要学习非常多各种意思相近的概念&#xff0c;常常让人感到头疼&#xff0c;难以区分。 这里对这些策划概念进行深入解析&#xff0c;帮助您轻松理清各自的含义和区别。 1. 活动策划&#xff…

截图工具PixPin(比Snipaste更强大)

PixPin官网链接&#xff1a;https://pixpinapp.com/ 最近新出的一款截图工具PixPin&#xff0c;比Snipaste功能多一些。在Snipaste功能基础上&#xff0c;还支持长截图&#xff0c;截动图&#xff0c;文本识别。

618好物推荐,省心省力省钱包!

一年一度的“618”购物狂欢节又来啦&#xff01;大家都心动了吧&#xff0c;购物车也早就堆满了心仪的好物。别急&#xff0c;别急&#xff0c;让我给你们推荐几款真正值得入手的宝贝&#xff0c;让你们省心、省力还省钱包&#xff01;不管是给自己添置点新装备&#xff0c;还是…

uniapp App去除iOS底部安全区域白边

未设置的情况下&#xff0c;iOS底部安全区域白边 如图&#xff1a; 去除方法&#xff1a; 在 mainfest.json 中加入一下代码&#xff1a; "safearea" : {"bottom" : {"offset" : "none"} }, 去除效果展示&#xff1a;

开放式耳机2024超值推荐!教你如何选择蓝牙耳机!

开放式耳机的便利性让它在我们的日常生活中变得越来越重要。它让我们摆脱了传统耳机的限制&#xff0c;享受到了更多的自由。不过&#xff0c;市面上的开放式耳机种类繁多&#xff0c;挑选一款既实用又实惠的产品确实需要一些小窍门。作为一位对开放式耳机颇有研究的用户&#…