AI大模型探索之路-实战篇7:Function Calling技术实战:自动生成函数

系列篇章💥

AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研
AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研
AI大模型探索之路-实战篇6:掌握Function Calling的详细流程


目录

  • 系列篇章💥
  • 一、前言
  • 二、Function Calling函数封装
    • 1、定义客户端
    • 2、API调用测试
    • 3、定义函数
    • 4、定义参数数据格式
    • 5、定义一个标准的funcation call函数
    • 6、取出注释说明信息
    • 7、生成JSON Schema对象
    • 8、清理返回对象的特殊字符
    • 9、转换为JSON格式
    • 10、查看悟空函数信息
    • 11、调用API生成JSON格式函数信息
    • 12、输出原始函数对比
  • 三、定义自动输出function 参数的函数
    • 1、自动输出funcation的函数
    • 2、自动生成funcation函数调用测试
    • 3、定义参数数据
    • 4、调用API测试
    • 5、定义第二个函数
    • 6、两个函数生成测试
    • 7、两个工具函数一起调用API测试
  • 四、结语


一、前言

继前文对Function Calling操作流程的详细回顾之后,本文将进一步探讨OpenAI的Function Calling技术在实际应用中的表现。通过利用大型模型的强大能力自动生成function函数,我们旨在提升代码的通用性与扩展性。这一深入分析的核心目标是为智能数据分析平台的顺利部署打下坚实的技术基础。

这种基于人工智能的Function Calling技术探索是未来软件开发和维护领域的重要发展方向,它不仅能提高开发效率,还能大幅降低维护成本,提高软件的适应性和灵活性。通过本文的深入分析,我们希望为读者提供更全面的了解和应用视角,促进技术的进一步发展和应用。

二、Function Calling函数封装

在本章节中,我们将继续深入探索大模型自动生成function函数的全过程。此技术不仅体现了人工智能领域的前沿进展,还具有实际应用的重要可行性。我们将通过具体的步骤和实践案例,分析这一技术的具体工作原理及其在实际应用中的执行效果。
1)获取函数的注释说明
首先,为了有效利用大模型生成function函数,我们需要从已有的代码中获取目标函数的注释说明。这些注释将提供函数的目的、输入参数以及预期输出等关键信息。精确而详尽的注释是确保大模型能正确理解并生成符合需求的函数定义的前提。
2)将注释说明提供给大模型,由大模型生成相应的JSON Schema
获得注释后,我们将其提供给大模型。模型将根据这些注释自动生成一个对应的JSON Schema。这一步骤是自动化过程中的关键,因为它直接关系到最终生成的function函数是否能满足实际的业务需求。
3) 对大模型生成的JSON Schema进行检查和补充
虽然大模型能够根据注释生成JSON Schema,但手动检查和补充这一环节仍然不可或缺。我们需确保生成的JSON Schema与手工创建的完全一致,包括所有细节和特定条件。这一过程可能需要开发者与模型之间的多次迭代,直到达到最优的输出结果。

通过这一系列的步骤,我们将能够有效地利用大模型自动生成function函数,从而提升开发效率并减少人为错误。

1、定义客户端

import openai
import os
import numpy as np
import pandas as pd
import json
import io
from openai import OpenAI
#获取API KEY
openai.api_key = os.getenv("OPENAI_API_KEY")
#创建客户端
client = OpenAI(api_key=openai.api_key)

2、API调用测试

response = client.chat.completions.create(
  #model="gpt-4-0613",
  model="gpt-3.5-turbo",# 这里最好使用gpt4
  messages=[
    {"role": "user", "content": "什么是JSON Schema?"}
  ]
)

response.choices[0].message.content

输出:

'JSON Schema是一种用于描述和验证JSON数据结构的规范。它定义了数据的类型、格式、约束和关系,使得可以对JSON数据进行验证和验证。通过JSON Schema,开发人员可以确保数据的完整性、准确性和一致性,以及在不同应用程序和平台之间的数据交换的有效性。JSON Schema可以被用来验证输入数据、生成文档和测试数据等各种用途。'

3、定义函数

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 * 10
    return json.dumps(res.to_string())

4、定义参数数据格式

# 创建一个DataFrame
df = pd.DataFrame({'x1':[1, 2], 'x2':[3, 4]})

df_str = df.to_string()

data = io.StringIO(df_str)

df_new = pd.read_csv(data, sep='\s+', index_col=0)

5、定义一个标准的funcation call函数

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

#定义工具函数字典
available_tools =  {
    "sunwukong_function": sunwukong_function,
}

6、取出注释说明信息

import inspect
# 取出注释信息
print(inspect.getdoc(sunwukong_function))

输出:

孙悟空算法函数,该函数定义了数据集计算过程
:param data: 必要参数,表示带入计算的数据表,用字符串进行表示
:return:sunwukong_function函数计算后的结果,返回结果为表示为JSON格式的Dataframe类型对象

7、生成JSON Schema对象

取出注释信息,调用大模型API生成JSON Schema对象

function_description = inspect.getdoc(sunwukong_function)
response = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "以下是孙悟空函数的函数说明:%s" % function_description},
    {"role": "user", "content": "请帮我编写一个JSON Schema对象,用于说明孙悟空函数的参数输入规范。输出结果要求是JSON Schema格式的JONS类型对象,不需要任何前后修饰语句。"}
  ]
)
# 使用gpt3.5发现有时候生成正确,但是有时候生成的json信息还是有些缺少,gpt.4会更稳定
response.choices[0].message.content

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

8、清理返回对象的特殊字符

# 将变量 response.choices[0].message.content 中的字符串中的 "" 和 "json" 替换为空字符串
r=response.choices[0].message.content.replace("```","").replace("json","")

9、转换为JSON格式

json.loads(r)

输出:

{'type': 'object',
 'required': ['data'],
 'properties': {'data': {'type': 'string',
   'description': 'Represents the data table to be calculated'}}}

10、查看悟空函数信息

# 打印悟空函数的json格式,与上面模型生成的json对比
sunwukong

输出:

{'type': 'function',
 'function': {'name': 'sunwukong_function',
  'description': '用于执行孙悟空算法函数,定义了一种特殊的数据集计算过程',
  'parameters': {'type': 'object',
   'properties': {'data': {'type': 'string', 'description': '执行孙悟空算法的数据集'}},
   'required': ['data']}}}
#打印参数信息
sunwukong['function']['parameters']

输出:

{'type': 'object',
 'properties': {'data': {'type': 'string', 'description': '执行孙悟空算法的数据集'}},
 'required': ['data']}

11、调用API生成JSON格式函数信息

system_prompt = '以下是某的函数说明:%s' % function_description
user_prompt = '根据这个函数的函数说明,请帮我创建一个JSON格式的字典,这个字典有如下5点要求:\
               1.字典总共有三个键值对;\
               2.第一个键值对的Key是字符串name,value是该函数的名字:%s,也是字符串;\
               3.第二个键值对的Key是字符串description,value是该函数的函数的功能说明,也是字符串;\
               4.第三个键值对的Key是字符串parameters,value是一个JSON Schema对象,用于说明该函数的参数输入规范。\
               5.输出结果必须是一个JSON格式的字典,且不需要任何前后修饰语句' % function_name
response = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": user_prompt}
  ]
)
response.choices[0].message.content

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

清理特殊字符后,转化JSON格式输出

json_function_description=json.loads(response.choices[0].message.content.replace("```","").replace("json",""))
json_function_description

输出:

{'name': 'sunwukong_function',
 'description': '孙悟空算法函数,该函数定义了数据集计算过程',
 'parameters': {'type': 'object',
  'properties': {'data': {'type': 'string',
    'description': '必要参数,表示带入计算的数据表,用字符串进行表示'}},
  'required': ['data']}}

12、输出原始函数对比

# 输出悟空函数,和生成的函数信息对比
sunwukong

输出:

{'type': 'function',
 'function': {'name': 'sunwukong_function',
  'description': '用于执行孙悟空算法函数,定义了一种特殊的数据集计算过程',
  'parameters': {'type': 'object',
   'properties': {'data': {'type': 'string', 'description': '执行孙悟空算法的数据集'}},
   'required': ['data']}}}

补充缺少的部分信息

# 补充缺少的部分信息
json_str={"type": "function","function":json_function_description}
json_str

输出:

{'type': 'function',
 'function': {'name': 'sunwukong_function',
  'description': '孙悟空算法函数,该函数定义了数据集计算过程',
  'parameters': {'type': 'object',
   'properties': {'data': {'type': 'string',
     'description': '必要参数,表示带入计算的数据表,用字符串进行表示'}},
   'required': ['data']}}}

再次输出悟空函数,进行对比,基本上已经一摸一样了

三、定义自动输出function 参数的函数

继前文的探讨和实验验证了利用大模型自动生成function参数的函数的可行性之后,本章节将专注于如何有效地封装这一功能,并通过提供多个函数工具,进行具体的调用测试来展示其实用性。

1、自动输出funcation的函数

def auto_functions(functions_list):
    """
    Chat模型的functions参数编写函数
    :param functions_list: 包含一个或者多个函数对象的列表;
    :return:满足Chat模型functions参数要求的functions对象
    """
    def functions_generate(functions_list):
        # 创建空列表,用于保存每个函数的描述字典
        functions = []
        # 对每个外部函数进行循环
        for function in functions_list:
            # 读取函数对象的函数说明
            function_description = inspect.getdoc(function)
            # 读取函数的函数名字符串
            function_name = function.__name__

            system_prompt = '以下是某的函数说明:%s' % function_description
            user_prompt = '根据这个函数的函数说明,请帮我创建一个JSON格式的字典,这个字典有如下5点要求:\
               1.字典总共有三个键值对;\
               2.第一个键值对的Key是字符串name,value是该函数的名字:%s,也是字符串;\
               3.第二个键值对的Key是字符串description,value是该函数的函数的功能说明,也是字符串;\
               4.第三个键值对的Key是字符串parameters,value是一个JSON Schema对象,用于说明该函数的参数输入规范。\
               5.输出结果必须是一个JSON格式的字典,且不需要任何前后修饰语句' % function_name

            response = client.chat.completions.create(
                              model="gpt-3.5-turbo",
                              messages=[
                                {"role": "system", "content": system_prompt},
                                {"role": "user", "content": user_prompt}
                              ]
                            )
            json_function_description=json.loads(response.choices[0].message.content.replace("```","").replace("json",""))
            json_str={"type": "function","function":json_function_description}
            functions.append(json_str)
        return functions
    ## 最大可以尝试4次
    max_attempts = 4
    attempts = 0

    while attempts < max_attempts:
        try:
            functions = functions_generate(functions_list)
            break  # 如果代码成功执行,跳出循环
        except Exception as e:
            attempts += 1  # 增加尝试次数
            print("发生错误:", e)
            if attempts == max_attempts:
                print("已达到最大尝试次数,程序终止。")
                raise  # 重新引发最后一个异常
            else:
                print("正在重新运行...")
    return functions

定义函数列表

functions_list = [sunwukong_function]

2、自动生成funcation函数调用测试

tools = auto_functions(functions_list)

查看生成后的工具函数

tools
 'description': '孙悟空算法函数,该函数定义了数据集计算过程',
   'parameters': {'type': 'object',
    'properties': {'data': {'type': 'string',
      'description': '表示带入计算的数据表,用字符串进行表示'}},
    'required': ['data']}}}]

3、定义参数数据

df_str = pd.DataFrame({'x1':[1, 2], 'x2':[3, 4]}).to_string()
df_str

在这里插入图片描述

4、调用API测试

使用自动生成的funcation call函数,调用OpenAI测试,看大模型能否找到函数

messages=[
    {"role": "system", "content": "数据集data:%s,数据集以字符串形式呈现" % df_str},
    {"role": "user", "content": "请在数据集data上执行孙悟空算法"}
]
response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        tools=tools,
        tool_choice="auto",  
    )
response.choices[0].message

输出:从输出结构中可以看到,已经正常找到生成的工具函数
在这里插入图片描述

5、定义第二个函数

#在定义一个工具函数,一起测试
def tangseng_function(data):
    """
    唐僧算法函数,该函数定义了数据集计算过程
    :param data: 必要参数,表示带入计算的数据表,用字符串进行表示
    :return:tangseng_function函数计算后的结果,返回结果为表示为JSON格式的Dataframe类型对象
    """
    data = io.StringIO(data)
    df_new = pd.read_csv(data, sep='\s+', index_col=0)
    res = df_new * 1000000
    return json.dumps(res.to_string())
#两个函数一起放入工具列表
functions_list=[sunwukong_function,tangseng_function]

6、两个函数生成测试

# 使用gpt3.5发现有时候生成正确,但是有时候生成的json信息还是有些缺少,gpt.4会更稳定
tools = auto_functions(functions_list)
tools

输出:

[{'type': 'function',
  'function': {'name': 'sunwukong_function',
   'description': '孙悟空算法函数,该函数定义了数据集计算过程',
   'parameters': {'type': 'object',
    'properties': {'data': {'type': 'string', 'description': '表示带入计算的数据表'}},
    'required': ['data']}}},
 {'type': 'function',
  'function': {'name': 'tangseng_function',
   'description': '唐僧算法函数,该函数定义了数据集计算过程',
   'parameters': {'type': 'object',
    'properties': {'data': {'type': 'string',
      'description': '必要参数,表示带入计算的数据表,用字符串进行表示'}},
    'required': ['data']}}}]

7、两个工具函数一起调用API测试

messages=[
    {"role": "system", "content": "数据集data:%s,数据集以字符串形式呈现" % df_str},
    {"role": "user", "content": "请在数据集data上执行唐僧算法函数"}
]
response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        tools=tools,
        tool_choice="auto", 
    )
response.choices[0].message

输出:根据输出可以看到,已经成功找到工具函数
在这里插入图片描述

四、结语

在本文的探讨和实践过程中,我们深入探索了利用大规模语言模型的生成能力来自动构建function函数的可能性和方法。通过精心设计的实验和不断的调优,我们成功实现了利用这些先进模型自动生成高质量的function函数,这不仅大大提高了开发效率,还为函数的多样性和创新性打开了新的大门。
此外,我们还专注于提高这些自动生成的函数在实际应用中的通用性和扩展性。这意味着所开发的函数不仅适用于当前的特定任务,还能在不同的应用环境和项目中轻松调整和扩展,从而保证长远的可用性和持续的价值。这一目标的实现显著增强了代码的复用性和适应性,为软件开发行业带来了新的工作效率和创新思路。

在这里插入图片描述

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos修改系統語言

一、使用命令行修系统语言 1、显示系统当前语言环 [rootkvm-suma ~]# localectl System Locale: LANGen_US.utf8 VC Keymap: cn X11 Layout: cn 2、查看系统支持字符集 [rootkvm-suma ~]# locale -a 2、设置系统语言环境 [rootkvm-suma ~]# localectl set-locale LANGz…

Gradio 搭建yolov8 分类系统

代码 import gradio as gr import pandas as pd from ultralytics import YOLO from skimage import data from PIL import Imagemodel YOLO(yolov8n-cls.pt) def predict(img):logging.info("Gradio 调用开始")result model.predict(sourceimg)logging.info("…

机器学习预测-CNN手写字识别

介绍 这段代码是使用PyTorch实现的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用于在MNIST数据集上进行图像分类。让我一步步解释&#xff1a; 导入库&#xff1a;代码导入了必要的库&#xff0c;包括PyTorch&#xff08;torch&#xff09;、神经网络模块&#xff0…

【Linux】Linux的安装

文章目录 一、Linux环境的安装虚拟机 镜像文件云服务器&#xff08;可能需要花钱&#xff09; 未完待续 一、Linux环境的安装 我们往后的学习用的Linux版本为——CentOs 7 &#xff0c;使用 Ubuntu 也可以 。这里提供几个安装方法&#xff1a; 电脑安装双系统&#xff08;不…

LeetCode热题100——矩阵

73.矩阵清零 题目 给定一个 *m* x *n* 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例…

OpenAI撤回有争议的决定:终止永久性非贬损协议

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Docker提示某网络不存在如何解决,添加完网络之后如何删除?

Docker提示某网络不存在如何解决&#xff1f; 创建 Docker 网络 假设现在需要创建一个名为my-mysql-network的网络 docker network create my-mysql-network运行容器 创建网络之后&#xff0c;再运行 mysqld_exporter 容器。完整命令如下&#xff1a; docker run -d -p 9104…

力扣刷题---2283. 判断一个数的数字计数是否等于数位的值【简单】

题目描述 给你一个下标从 0 开始长度为 n 的字符串 num &#xff0c;它只包含数字。 如果对于 每个 0 < i < n 的下标 i &#xff0c;都满足数位 i 在 num 中出现了 num[i]次&#xff0c;那么请你返回 true &#xff0c;否则返回 false 。 示例 1&#xff1a; 输入&a…

机器人物理引擎

机器人物理引擎是用于计算并模拟机器人及其交互环境在虚拟世界中运动轨迹的组件。 MuJoCo&#xff08;Multi-Joint Dynamics with Contact&#xff09;&#xff1a; 基于广义坐标和递归算法&#xff0c;专注于模拟多关节系统如人形机器人。采用了速度相关的算法来仿真连接点力…

AI菜鸟向前飞 — LangChain系列之十四 - Agent系列:从现象看机制(上篇)

上一篇介绍了Agent与LangGraph的基础技能Tool的必知必会 AI菜鸟向前飞 — LangChain系列之十三 - 关于Tool的必知必会 前面已经详细介绍了Promp、RAG&#xff0c;终于来到Agent系列&#xff08;别急后面还有LangGraph&#xff09;&#xff0c;大家可以先看下这张图&#xff1…

网络模型-路由策略

一、路由策略 路由策略(Routing Policy)作用于路由&#xff0c;主要实现了路由过滤和路由属性设置等功能&#xff0c;它通过改变路由属性(包括可达性)来改变网络流量所经过的路径。目的:设备在发布、接收和引入路由信息时&#xff0c;根据实际组网需要实施一些策略&#xff0c…

C++:关联容器及综合运用:

关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。关联容器因此相比与顺序容器支持高效的关键字查找和访问。 其底层数据结构&#xff1a;顺序关联容器 ->红黑树&#xff0c;插入…

Redis离线安装(单机)

目录 1-环境准备1-1下载redis-4.0.11.tar.gz1-2gcc环境 2-上传解压3-编译安装(需要gcc环境)4-配置redis5-启动Redis6-开启防火墙(root)7-添加开机启动脚本8-设置权限9-设置开机启动10-测试redis服务11-检查是否安装成功12-创建redis命令软连接13-测试redis14-必要时设置防火墙 …

禅道密码正确但是登录异常处理

禅道密码正确&#xff0c;但是登录提示密码错误的异常处理 排查内容 # 1、服务器异常&#xff0c;存储空间、数据库异常 # 2、服务异常&#xff0c;文件丢失等异常问题定位 # 1、df -h 排查服务器存储空间 # 2、根据my.php排查数据库连接是否正常 # 3、修改my.pho,debugtrue…

外企也半夜发布上线吗?

0 别把问题想得太复杂 如果有灰度发布的能力&#xff0c;最好白天发布&#xff1b;如果没有灰度发布&#xff0c;只能在半夜发布。 即使有灰度发布能力&#xff0c;也不要沾沾自喜&#xff0c;好好反思一下你们的灰度发布是否真的经得起考验&#xff0c;还是仅仅是装装样子。…

区块链技术和应用二

前言 学习长安链的一些基本原理 官网&#xff1a;长安链开源文档 b站课程&#xff1a;区块链基础与应用 一、共识算法 1.1 POW工作量证明 最长链共识&#xff0c;没听明白 1.2 51%攻击 二、区块链的发展 2.1 区块链1.0到3.0 2.2 共有链、联盟链、私有链 2.3 发展趋势 2.4 扩…

Spring Boot Interceptor(拦截器使用及原理)

之前的博客中讲解了关于 Spring AOP的思想和原理&#xff0c;而实际开发中Spring Boot对于AOP的思想的具体实现就是Spring Boot Interceptor。在 Spring Boot 应用程序开发中&#xff0c;拦截器&#xff08;Interceptor&#xff09;是一个非常有用的工具。它允许我们在 HTTP 请…

Unity修改Project下的Assets的子文件的图标

Unity修改文件夹的图标 示例&#xff1a; 在右键可以创建指定文件夹。 github链接 https://github.com/SeaeeesSan/SimpleFolderIconCSDN资源的链接 https://download.csdn.net/download/GoodCooking/89347361 去GitHub下载支持原作者哦。重要的事情 截图来自GitHub 。 U…

文件编码格式查看和转换

1、查看文件编码格式 记事本&#xff1a;打开文件后&#xff0c;点击“文件”--“另存为”&#xff0c;可查看文件的编码格式。**Notepad**&#xff1a;打开文件后&#xff0c;即可在右下角查看文件的编码格式。vim&#xff1a;打开文件后&#xff0c;输入“:set fileencoding…