AI系列:大语言模型的function calling(上)

目录

  • 大语言模型(LLM) 的function calling
  • 实验:OpenAI之function calling
    • 序列图:function calling如何工作
    • 详情: 对话内容
    • 参考代码
  • 后续: 使用LangChain实现function calling
  • 参考

大语言模型(LLM) 的function calling

大语言模型(LLM)可以使用自然语言与人类对话。但在使用它完成某项复杂工作时,很多时候必须依赖其他外部工具,这包括但不限于:

  • 训练的知识库和提示词以外的知识。包括某些垂直细分领域以及非公开的数据。
  • 计算任务。相信我,即使它给出的结果看起来很像样,你也不能相信它在计算方面的能力;它无法保证100%的准确性。
  • 实时数据。需要外部工具提供。

能识别需要使用的外部工具,能根据其结果数据完成对话的功能叫做function calling。

实验:OpenAI之function calling

OpenAI的GPT作为LLM的代表作,我们将给它提出如下问题:

问题:一共有3个人,每个人有15个苹果,10个鸭梨,一共有多少苹果?
注: 这个简单的逻辑和算数题只作为实验用途;实际应用中可以扩展到复杂的计算。

我们将给GPT提供两个function/tool。一个是乘法,一个是加法。
注: 其中加法用来迷惑GPT。

我们期待的结果:GPT能判断使用乘法及其参数,并使用乘法function calling给出的结果数据,最终返回正确答案:
三个人一共有45个苹果。

序列图:function calling如何工作

我们的代码和GPT将怎样完成这个过程呢?这里将整个过程描绘在下面的时序图中:

代码 大模型LLM 1. 调用对话接口,告诉LLM提示词+可使用的functions/tools定义 2. 需要调用的functions/tools及调用参数 3. 将步骤2中LLM的回复加入对话 4. 循环执行function calling,并将结果加入对话 5. 调用对话接口,需要以上所有对话信息 6. 最终回答 alt [分支:需要function calling] [分支:不需要function calling] 代码 大模型LLM

详情: 对话内容

以下内容是真实的对话历史,程序和GPT配合按照我们的预想完成了整个过程,并最终给出了正确答案。
注:以下用到的UserMessage, AIMessage, FunctionMessage都是LangChain中的概念;它比较贴切的抽象了不同role的对话项。


步骤1中的对话项:HumanMessage | 向GPT输入对话提示词。

#提示词
{"role": "user","content": "一共有3个人,每个人有15个苹果,10个鸭梨,一共有多少苹果?"
}

另外,在调用GPT接口时,定义了2个function type tools:乘法multiply和加法add。内容参见下一部分的代码部分。


步骤2中的对话项:AIMessage | GPT返回需要调用的functions/tools及其调用参数。

#这里GPT没有给出最终答案,它识别出了需要调用乘法multiply,参数一first_int为3个人,参数二second_int为15个苹果/每人。
{"content": null,"role": "assistant","function_call": null,"tool_calls": [{"id": "call_ZMbo4SiA2iaZUSLJMyX8ZzkP","function": {"arguments": "{\"first_int\":3,\"second_int\":15}","name": "multiply"},"type": "function"}]
}

步骤4中的对话项:FunctionMessage |function calling的调用结果数据。
tool_call_id对应步骤2中的tool_calls元素中的id。content为程序调用function/tool后的结果数据。

#将function calling的结果为3*15=45,设定role为tool,将其加入对话中。
{"tool_call_id": "call_ZMbo4SiA2iaZUSLJMyX8ZzkP","role": "tool","name": "multiply","content": "45"
}

步骤6中的对话项:AIMessage | 程序将以上所有对话项发送给GPT,GPT用自然语言返回最终结论。

#最终结果为:三个人一共有45个苹果。
{"content": "三个人一共有45个苹果。","role": "assistant","function_call": null,"tool_calls": null
}

参考代码

function calling的实现代码如下:

__author__ = 'liyane'import json# 初始化环境和OpenAI
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = OpenAI()#调用GPT大模型
def get_completion(messages, tools, model="gpt-3.5-turbo"):response = client.chat.completions.create(model=model,messages=messages,# tool_choice支持设置 "auto"(由模型决定是否调用tool) 或者 "none" (不调用tool)作为value。 有tools定义时默认由模型决定。# 也可以强制要求必须调用指定的函数,如下所示# tool_choice= {"type": "function", "function": {"name": "multiply"}} ,  tools=tools)return response.choices[0].message#定义function/tool 1: multiply
def multiply(first_int: int, second_int: int) -> int:"""两个整数相乘"""return first_int * second_int#定义function/tool 2: add
def add(first_add: int, second_add: int) -> int:"""两个整数相加"""return first_add + second_add#将function calling的schema格式告诉大模型
tools=[{"type": "function","function": {"name": "multiply","description": "两个整数相乘","parameters": {"type": "object","properties": {"first_int": {"type": "integer","description": "第一个乘数",},"second_int": {"type": "integer","description": "第二个乘数",}},"required": ["first_int", "second_int"],}}},{"type": "function","function": {"name": "add","description": "两个整数相加","parameters": {"type": "object","properties": {"first_add": {"type": "integer","description": "第一个加数",},"second_add": {"type": "integer","description": "第二个加数",}},"required": ["first_add", "second_add"],}}
}]# 调用LLM接口,将LLM回复加入对话上下文
prompt = "一共有3个人,每个人有15个苹果,10个鸭梨,一共有多少苹果?"
messages = [{"role": "user", "content": prompt}
]
response = get_completion(messages, tools)
messages.append(response)  # 如果LLM需要function calling,调用相应的函数,并将函数结果数据加入对话上下文,继续调用LLM。
while (response.tool_calls is not None):for tool_call in response.tool_calls:selected_tool = {"add": add, "multiply": multiply}[tool_call.function.name]args = json.loads(tool_call.function.arguments)tool_output = selected_tool(**args)messages.append({"tool_call_id": tool_call.id,  # 用于标识函数调用的 ID"role": "tool","name": tool_call.function.name,"content": str(tool_output)  # 数值result 必须转成字符串})response = get_completion(messages, tools)messages.append(response)  print("=====最终回复=====")
print(response.content)

后续: 使用LangChain实现function calling

后续更新AI系列:大语言模型的function calling(下)- 使用LangChain:如何使用LangChain实现function calling,LangChain对比原生调用能提供哪些便利。

参考

OpenAI / function calling
LangChain / Tool/function calling

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

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

相关文章

设计模式-抽象工厂模式(Abstract Factory Pattern)结构|原理|优缺点|场景|示例

目录 设计模式(分类) 设计模式(六大原则) 创建型 工厂方法 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个创建一系列相关…

Python之Excel合并

大家好!今天我们要一起探索如何使用Python这个神奇的工具,将一堆Excel文件轻松合并成一个大文件。想象一下,就像是一台高效的Excel数据收割机,让你的工作效率飙升!准备好你的笔记本,跟着我一步步操作吧。 …

【倾诉】我与IT

是的! 今天不想发知识博客了,想谈谈这些年这几年的我和IT 懵懂 2018年,参加了高考,出成绩那天格外闷热。报考志愿的那天脑袋空空的我填了生物、化学、数学这一类志愿,然后勾选了 调剂√ 这样,一个脑袋空…

hexo实现个人博客及涉及的技术学习

一、背景 最近,一直想做一个属于自己的网站.可以从零开始搭建一个网站,顺便可以把日常中学到的技术用于实战,还可以顺便记录自己的所思所感,记录成长的过程. 方案 一开始的方案是从零开始,模仿常见个人博客的设计,基于vueSpringbootMySQL的去实现网站. 新建项目之后,发现vu…

归一化平面和像素坐标系

归一化平面: 归一化的平面(Normalized Plane)在计算机视觉和三维重建领域中指的是一个虚拟的二维平面,用于将三维空间中的点投影到相机的成像平面前的一个中间阶段。这个平面位于相机前方,并且它的坐标系经过特殊处理使…

AMEYA360:兆易创新推出GD32L235系列低功耗MCU新品

兆易创新GigaDevice (股票代码 603986)今日宣布,正式推出GD32L235系列MCU,进一步丰富了低功耗产品的选型和布局。全新GD32L235产品系列紧贴低功耗市场需求,以更优的功耗效率、丰富的接口资源、更高性价比为工业表计、智能门锁、便携式设备、I…

【Python】Python中大文件切割的艺术

淡淡相思 都写在脸上 沉沉离别背在肩上 泪水流过脸庞 所有的话 现在还是没有讲 看那青山 荡漾在水上 看那晚霞吻着夕阳 我用一生的爱 去寻找那一个家 今夜你在何方 转回头 迎着你的笑颜 心事全都被你发现 梦里遥远的幸福 它就在我的身旁 🎵 于…

线上线下交友社区系统 可打包小程序 支持二开 源码交付!

社交网络的普及,人们交友的方式发生了巨大的变化。过去,我们主要通过线下的方式来结识新朋友,比如在学校、工作场所、社交活动或者兴趣小组中。然而,随着移动端软件的发展,线上交友也逐渐变得流行。 方便性&#xff1a…

deepspeed笔记

文章目录 一、deepspeed是什么?二、能训多大的模型,耗时如何?三、RLHF训练流程四、通信策略 一、deepspeed是什么? 传统的深度学习,模型训练并行,是将模型参数复制多份到多张GPU上,只将数据拆分…

java可盈保险合同管理系统的设计与实现(springboot+mysql源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的可盈保险合同管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于Spring Boot的…

[蓝桥杯 | 暴搜] 学会暴搜之路

虽然会调侃蓝桥杯是暴力求解的,但是本弱弱不会搜,不知道如何搜,于是写下这篇碎碎念,记录看到过的,惊艳自己的暴搜。 小总结 题目特征:很复杂的排列组合 说是暴力,其实就是枚举罢了&#xff0…

CTF中常见的四种python逆向

说在前面: 什么是pyc文件? pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高, pyc 文件是 Python 编译过的字节码文…

华为OD机试 - 任务处理、可以处理的最大任务数(Java JS Python C C++)

须知 哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 文章目录 须知题目描述输入描述输出描述解题思路:JS算法源码Java算法源码Python算法源码C算法源码题目描述 在某个项目中有多个任务(用task数组表示)需要你进行处理,其中: t…

大屏数字字体+渐变色

vue数据大屏使用数字字体_vue数字字体-CSDN博客 用css实现文字字体颜色渐变的三种方法_css 字体颜色渐变-CSDN博客

OpenHarmony多媒体-ijkplayer

简介 ijkplayer是OpenHarmony环境下可用的一款基于FFmpeg的视频播放器。 演示 编译运行 1、通过IDE工具下载依赖SDK,Tools->SDK Manager->OpenHarmony SDK 把native选项勾上下载,API版本>9 2、开发板选择RK3568,ROM下载地址. 选择…

美女视频素材无水印哪里找?四个顶级资源站点

寻找高质量的美女视频素材无水印对于制作引人注目的视频内容至关重要。如果你正困惑于“美女视频素材无水印哪里找”,以下是四个提供优秀无水印美女视频素材的网站,可以满足你的各种创作需求。 蛙学网:多样化的美女视频素材 首先推荐的是蛙…

关于pytouch的基本词汇

PyTorch是一个开源的机器学习框架,它提供了丰富的工具和库,用于构建和训练深度学习模型。PyTorch的基本定义如下: 张量(Tensor):PyTorch中的基本数据结构是张量,类似于多维数组。张量可以存储和…

LeetCode第797题: 所有可能的路径

目录 1.问题描述 2.问题分析 1.问题描述 给你一个有 n 个节点的有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)。 graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08…

[论文精读]Masked Autoencoders are scalable Vision Learners

摘要本文证明了掩码自编码器(MAE)是一种可扩展的计算机视觉自监督学习算法。我们的 MAE方法很简单:我们盖住输入图像的随机块并重建缺失的像素。它基于两个核心设计。首先,我们开发了一个非对称编码器-解码器架构,其中一个编码器仅对块的可见子集(没有掩…

现代人如何适应AIGC 时代

随着生成式 AI 技术的蓬勃发展,各行各业正逗‬到了‬不得不‬重新‬看待‬自己的时候‬。一方面,新技术的出现带来了无限商机,另一方面也催生出了诸多新的挑战。 据权威机构统计,到2030年,社会需要的人工智能人才会是…