【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾

系列篇章💥

No.文章
1【GLM-4开发实战】Function Call进阶实战:外部函数调用回顾
2【GLM-4开发实战】Function Call进阶实战:常见挑战之意图识别处理
3【GLM-4开发实战】Function Call进阶实战:常见挑战之海量函数处理
4【GLM-4开发实战】Function Call进阶实战:常见挑战之并发调用处理

目录

  • 系列篇章💥
  • 引言
  • 一、概述
  • 二、Function Call调用详细流程
    • 1、定义模型客户端
    • 2、定义工具函数
    • 3、定义数据对象
    • 4、数据转换为String类型
    • 5、函数调用测试
    • 6、定义函数的说明
    • 7、大模型调用测试(不带工具函数)
    • 8、大模型调用测试(携带工具函数)
    • 9、查看结果中的tool_calls属性
    • 10、构建字段格式函数列表
    • 11、获取执行函数并执行
    • 12、第二次调用大模型
    • 13、查看最终执行结果
  • 三、Function Call函数调用封装
  • 结语


引言

在人工智能领域,Function Call是大模型能力扩展的核心。它不仅在Retrieval-Augmented Generation(RAG)中扮演着重要角色,也是Agent智能体架构设计中不可或缺的一部分。本文将深入探讨GLM-4模型中Function Call的进阶应用,通过实战案例,回顾并总结外部函数调用的技巧与经验。

一、概述

Function Call作为模型与外部世界交互的桥梁,其重要性不言而喻。本章节旨在通过GLM-4模型的Function Call功能,为大家提供一个全面的使用回顾,帮助大家更高效地利用这一功能。

二、Function Call调用详细流程

1、定义模型客户端

首先,需要构建一个客户端,用于与GLM-4模型进行通信。

import os
import openai
from openai import OpenAI
import shutilimport numpy as np
import pandas as pdimport json
import io
import inspect
import requests
import re
import random
import string## 初始化客户端
api_key = os.getenv("ZHIPU_API_KEY")
## pip install zhipuaifrom zhipuai import ZhipuAI
client = ZhipuAI(api_key=api_key)

2、定义工具函数

定义了一个大模型里面肯定没有的算法工具函数

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、定义数据对象

创建数据对象,为函数调用提供必要的数据支持。

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

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

4、数据转换为String类型

与大模型进行配合调用的时候,尽可能的让调用的函数参数和返回值都用String表示。

df_str = df.to_string()
df_str

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

5、函数调用测试

进行初步的函数调用,测试其基本功能。

result_json=sunwukong_function(df_str)
result_json

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

6、定义函数的说明

方便大模型识别函数自动完成调用,注意格式为:JSON Schema的格式

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

定义工具列表

tools = [sunwukong]

7、大模型调用测试(不带工具函数)

在没有外部函数工具的情况下测试大模型的第一次调用并执行孙悟空算法

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

输出:

CompletionMessage(content='抱歉,但似乎有一些混淆。"孙悟空算法"并不是一个公认的数据处理或机器学习算法。孙悟空是中国古典文学作品《西游记》中的虚构人物,以其变化无常和神通广大著称。\n\n然而,根据您提供的数据集(以字符串形式表示),如果您是想要进行某种形式的数据处理或分析,下面是一个用Python实现的对给定字符串形式的数据集进行解析的简单示例:\n\n```python\n# 这是您提供的数据集字符串\ndata_str = """\nx1  x2\n0   1   3\n1   2   4\n"""\n\n# 将字符串分割成行\nlines = data_str.strip().split("\\n")\n\n# 解析标题和值\nheader = lines[0].split()\nvalues = [line.split() for line in lines[1:]]\n\n# 转换数据为字典形式\ndata_dict = {h: [] for h in header}\nfor row in values:\n    for i, value in enumerate(row):\n        data_dict[header[i]].append(int(value))\n\n# 输出字典形式的数据集\nprint(data_dict)\n\n# 如果需要转换为Pandas DataFrame(如果适用的话)\nimport pandas as pd\n\ndf = pd.DataFrame(data_dict)\nprint(df)\n```\n\n当运行这段代码时,它将输出以下字典形式的数据集:\n\n```\n{\'x1\': [0, 1], \'x2\': [1, 2]}\n```\n\n然后,它将创建一个Pandas DataFrame,如下所示:\n\n```\n   x1  x2\n0   0   1\n1   1   2\n```\n\n请注意,这段代码假设每行数据的列数是相同的,并且所有值都可以转换为整数。\n\n如果您有一个具体的任务或算法想要应用到这个数据集上,请详细描述,我将尽力提供帮助。', role='assistant', tool_calls=None)

8、大模型调用测试(携带工具函数)

第一次调用大模型,测试Funcation call流程,本次调用时,设置工具函数tools和tool_choice(由大模型自己判断选择是否需要调用外部工具函数)

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

输出:

CompletionMessage(content='', role='assistant', tool_calls=[CompletionMessageToolCall(id='call_8822099358575188366', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function', index=0)])

输出结果可以看到,模型识别正确识别出来需要调用的函数,并且正确解析了参数 将第一次调用结果放入变量first_response中

first_response = response.choices[0].message
first_response

输出:

CompletionMessage(content=None, role='assistant', tool_calls=[CompletionMessageToolCall(id='call_8730210251242354639', function=Function(arguments='{"data":"x1  x2\\n0   1   3\\n1   2   4"}', name='sunwukong_function'), type='function', index=0)])

9、查看结果中的tool_calls属性

分析函数调用的结果,特别是tool_calls属性,了解函数调用的细节。

response.choices[0].message.tool_calls

输出:

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

10、构建字段格式函数列表

构建字典形式的函数调用列表,key为函数名,value为函数体

available_tools =  {"sunwukong_function": sunwukong_function,
}

11、获取执行函数并执行

根据大模型的返回值中获取到函数调用需要到的:函数名,参数,函数体,并且执行函数。

tool_calls = response.choices[0].message.tool_callsfor tool_call in tool_calls:## 函数名function_name = tool_call.function.name## 根据函数名获取到函数体function_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)

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

查询执行函数,执行效果

function_response = function_to_call(**function_args)
function_response

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

12、第二次调用大模型

把结果给到大模型,大模型进行增强生成
在第一次调用的基础上,进行第二次调用,观察是否有性能提升或结果优化。

messages.append(response.choices[0].message.model_dump())
for 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)messages.append({"role": "tool","content": function_response,"tool_call_id": tool_call.id,}) 
## 第二次调用模型
second_response = client.chat.completions.create(model="glm-4",messages=messages,tools=tools) 
# 获取最终结果
final_response = second_response.choices[0].message.content

13、查看最终执行结果

分析第二次调用的结果,评估Function Call的整体表现和可能的改进空间。

final_response

输出:

'根据孙悟空算法执行结果,数据集data经过计算后的结果为:\n```\n   x1  x2\n0  10  30\n1  20  40\n```'

三、Function Call函数调用封装

Function Call相关业务逻辑整体封装调用;封装Function Call不仅可以提高代码的可读性和可维护性,还可以在不同场景下复用函数调用逻辑。本部分将对Function Call相关使用代码进行封装,将Function Call封装为可复用的模块,以及如何通过封装提高开发效率。

from openai import OpenAI
import json## 步骤1:构建函数
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())available_tools =  {"sunwukong_function": sunwukong_function,
}df_str=pd.DataFrame({'x1':[1, 2], 'x2':[3, 4]}).to_stringdef run_conversation():# Step 1: send the conversation and available functions to the modelmessages=[{"role": "system", "content": "数据集data:%s,数据集以字符串形式呈现" % df_str},{"role": "user", "content": "请在数据集data上执行孙悟空算法"}  ]## 步骤2:函数说明  JSON Schema格式tools = [{"type": "function","function": {"name": "sunwukong_function","description": "用于执行孙悟空算法函数,定义了一种特殊的数据集计算过程","parameters": {"type": "object","properties": {"data": {"type": "string","description": "执行孙悟空算法的数据集"},},"required": ["data"],},}}]## 步骤3:第一次调大模型response = client.chat.completions.create(model="glm-4",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# Step 2: check if the model wanted to call a functionif tool_calls:messages.append(response.choices[0].message.model_dump())for 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)messages.append({"role": "tool","content": f"{json.dumps(function_response)}","tool_call_id":tool_call.id})## 步骤四:第二次调用大模型second_response = client.chat.completions.create(model="glm-4",  # 填写需要调用的模型名称messages=messages,tools=tools,)return second_responseresult=run_conversation()

查看调用结果

result.choices[0].message.content

输出:

'根据您的请求,我已经在数据集data上执行了孙悟空算法。执行结果如下:\n\n"   x1  x2\n0  10  30\n1  20  40"\n\n这是数据集经过孙悟空算法处理后的结果。如果您还有其他问题或需要进一步的帮助,请随时告诉我。'

结语

Function Call作为连接人工智能模型与外部世界的纽带,其应用广泛且深入。通过本文的深入分析与实战回顾,我们希望能够为读者提供Function Call使用的宝贵经验和策略,助力开发者们在AI领域的进一步探索和实践。随着技术的不断进步,Function Call的应用也将更加多样化和高效,期待与大家共同见证这一领域的未来发展。

在这里插入图片描述

🎯🔖更多专栏系列文章:AI大模型提示工程完全指南AI大模型探索之路(零基础入门)AI大模型预训练微调进阶AI大模型开源精选实践AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑

😎 作者介绍:我是寻道AI小兵,资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索。
📖 技术交流:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,加入技术交流群,开启编程探索之旅。
💘精心准备📚500本编程经典书籍、💎AI专业教程,以及高效AI工具。等你加入,与我们一同成长,共铸辉煌未来。
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!

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

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

相关文章

黑马头条vue2.0项目实战(五)——首页—频道编辑

目录 1. 使用页面弹出层 1.1 页面弹出层简单使用 1.2 创建频道编辑组件 1.3 页面布局 2. 展示我的频道 3. 展示推荐频道列表 3.1 获取所有频道 3.2 处理展示推荐频道 4. 添加频道 5. 编辑频道 5.1 处理编辑状态 5.2 切换频道 5.3 让激活频道高亮 5.4 删除频道 6.…

基于RK3588+AI支持能源在线监测系统应用的AIOT产品方案

支持能源在线监测系统应用的AIOT产品方案 近年来,智慧能源行业受益于国家政策扶持、市场需求拉动和先进技术支撑呈现出了蓬勃发展态势。助推智慧能源发展,打造了支持能源在线监测系统应用的AIOT产品方案。 能源在线监测系统的市场潜力 随着社会经济的飞…

Python | Leetcode Python题解之第319题灯泡开关

题目: 题解: class Solution:def bulbSwitch(self, n: int) -> int:return int(sqrt(n 0.5))

C++商店管理系统

代码中使用了C11的特性 后面有些输出(cout输出的)的提示文本是英文,因为懒得敲中文 源码在最后面 文末投票参与一下谢谢 商品数据保存在 items.txt 用户数据保存在 users.txt 实现功能 1.添加商品(商品ID,商品名,库存数量,价格&a…

分享一个基于人脸识别的小区物业管理系统Spring Boot(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

Liunx 小程序之进度条

Liunx 小程序之进度条 效果前提条件回车和换行缓冲区倒计时 进度条纯进度条模拟下载的进度条Progressbar.hProgressbar.cmain.cmakefile 效果 先来看效果,这其实是一个动态的进度条,后有源码,运行即可: 前提条件 在制作之前有两…

数论基础知识(上)

目录 数学符号 整除与约数 最大公约数(gcd)和最小公倍数(lcm) 质数 (素数) 算术基本定理(唯一分解定理) 约数个数 约数之和 分解质因数(枚举法) 试除法求约数(枚举法) 数学…

RTSP系列四:RTSP Server/Client实战项目

RTSP系列: RTSP系列一:RTSP协议介绍-CSDN博客 RTSP系列二:RTSP协议鉴权-CSDN博客 RTSP系列三:RTP协议介绍-CSDN博客 RTSP系列四:RTSP Server/Client实战项目-CSDN博客 目录 一、RTSP Server实战项目 1、准备 2、…

F4Pan网盘解析获取下载链接的工具系统源码

F4Pan网盘解析获取下载链接的工具系统源码,F4Pan(下称本项目)使用的接口全部来自于官方,无任何破坏接口的行为,本项目所有代码全部开源,仅供学习参考使用,请遵守相关的法律法规,禁止商用,若无视…

java+springboot+mysql校园二手书销售平台设计与实现00895-计算机毕业设计项目选题推荐(附源码)

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对校园二手书销售平台等问题,对校…

快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型FAQ

序言 之前已经介绍了在超算互联网平台SCNet上使用异构加速卡AI 显存64GB PCIE,私有化部署Llama3模型,并对 Llama3-8B-Instruct 模型进行 LoRA 微调、推理和合并 ,详细内容请参考另一篇博客:快速体验LLaMA-Factory 私有化部署和高…

计算机网络基础 - 计算机网络和因特网(2)

计算机网络基础 计算机网络和因特网Internet 结构和 ISP分组延时、丢失和吞吐量四种分组延时分组丢失吞吐量 协议层次及其服务模型概念数据单元(DU)协议栈TCP/IP 协议各层次的协议数据单元IOS/OSI 参考模型 计算机网络和因特网的历史早期计算机网路&…

自动驾驶的六个级别是什么?

自动驾驶汽车和先进的驾驶辅助系统(ADAS)预计将帮助拯救全球数百万人的生命,消除拥堵,减少排放,并使我们能够在人而不是汽车周围重建城市。 自动驾驶的世界并不只由一个维度组成。从没有任何自动化到完整的自主体验&a…

偷懒神器:auto 的讲解

1. auto 的定义 在c/c11之前,auto用来修饰局部变量,表明该变量是一个自动变量,函数结束后该变量销毁   c11中,赋予auto全新的含义。其中表示:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来…

熊海1.0cmsPHP代码审计

熊海1.0cmsPHP代码审计 环境搭建 下载之后直接使用phpstduy搭建就好了 工具使用 比如使用seay审计系统 sql大多数是存在的,但是没有文件上传,这个就是需要自己去验证 漏洞审计 SQL注入 有点多,随便拿一个举例子 就比如我们的登录页面…

Ceres Cuda加速

文章目录 一、简介二、准备工作三、实现代码四、实现效果参考资料一、简介 字Ceres2.2.1版本之后,作者针对于稠密矩阵的分解计算等操作进行了Cuda加速,因此这里就基于此项改动测试一下效果。 二、准备工作 1、首先是需要安装Cuda这个英伟达第三方库,https://developer.nvidi…

日企的“目标式招聘”到底什么意思?

看到篇文章称:日企的目标式招聘,高效率招聘。这是什么意思呢?小编今天来跟大家讲一讲。 首先,日企的目标式招聘,其实企业也是迫不得已。一个大型企业的招聘负责人说:“以前我们都是认真地考察每一位应聘者&…

Vue 使用elementUI-plus el-calendar加 公历转农历 是否节假日 等

效果图: 1. 使用到自定文件 calendar.js /*** 1900-2100区间内的公历、农历互转* charset UTF-8* Author Jea杨(JJonlineJJonline.Cn)* Time 2014-7-21* Time 2016-8-13 Fixed 2033hex、Attribution Annals* Time 2016-9-25 Fixed lunar LeapMonth Param…

浏览器事件循环详解

1. 浏览器的进程模型 1.1. 何为进程? 程序运行需要有它自己的专属内存空间,可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 1.2. 何为线程&#xff1f…

NodeJS的安装【windows】

文章目录 1 安装包下载2 下载过程3 测试 1 安装包下载 Node.js中文网:https://nodejs.cn 2 下载过程 3 测试