传统软件集成AI大模型——Function Calling

传统软件和AI大模型的胶水——Function Calling

  • 浅谈GPT对传统软件的影响
  • Function Calling做了什么,为什么选择Function Calling
  • Function Calling简单例子,如何使用
  • 使用场景

浅谈GPT对传统软件的影响

目前为止好多人对chatGPT的使用才停留在OpenAI自己提供的网页端上,也许对GPT的了解还不够深入。最近稍微看了些大模型相关的内容深刻感觉到大模型技术对软件行业的影响。
本人并非数学专业,对大模型的理解也仅仅只是看了下transformar模型以及简单fine turn的原理。 了解到大模型本质其实是根据概率推断出下一个token输出。 不过就是这些,也足以让传统软件行业在使用方面得到极大的提升。

Function Calling做了什么,为什么选择Function Calling

大模型可计算得到使用者的prompt对应输出,但是大模型的数据都是基于以往的数据训练出来的。诸如“今天是什么日子”,“明天的气温是多少度”等超过统计数据范围的简单问题,纵使是目前世界上最强大的大模型-ChatGPT4.0 也无法回答,并且也永远回答不了。 那么如何让大模型能够满足这种应用场景呢?
OpenAI公司首先给出了解决方案——Plugins。 Plugins允许用户在使用时手动选择若干个插件, 当需要用到这个插件时,gpt会主动去调用此插件,来满足使用场景。 这就涉及到两个问题。 1.用户并不在意到底要使用哪些插件,我只要你能回答我问题就行。 2. 如果有多个插件实现了类似的功能, gpt该作何选择。 一句话:表面上看,用户需要AI能够满足自己的各种需求,实际上,用户更希望在自己的某个需求中集成了AI。
于是,OpenAI公司提出了Function Calling。 家里的电脑没有画图软件, 下面我用文字图简单介绍下

【用户prompt,并注册用户自己的外部函数库】 ----> 【大模型】 —>(匹配了外部函数库)—>【触发function calling响应,携带外部函数库的参数】
—>(没匹配外部函数库) —> 【大模型自己处理】

由此,之前听公司里人谈起的“能不能让AI辅助使用我们的产品”得到实现。 得益于大模型出色的文档处理能力,可以以外部函数为跳板,使传统软件的接口能正确被大模型所调用。 比如,针对一个安防软件平台的操作。 输入“帮我将10.30.20.222”的IPC加入到设备管理中。 将成为现实。 也会打破传统非0即1的编程逻辑。 理论上,任何软件都能为自己定制一个“能听得懂人话”的软件助手。

Function Calling简单例子,如何使用

先直接上OpenAI官方的例子。 值得注意的是,OpenAI接口更新得特别频繁,如果代码无法正常运行,可以将OpenAI版本更新到和我一样的版本
在这里插入图片描述

from openai import OpenAI
import json
import os# funciton calling testopen_ai_key = os.getenv('OpenAIKey')client =OpenAI(api_key = open_ai_key)# Example dummy function hard coded to return the same weather
# In production, this could be your backend API or an external API
def get_current_weather(location, unit="fahrenheit"):"""Get the current weather in a given location"""if "tokyo" in location.lower():return json.dumps({"location": "Tokyo", "temperature": "10", "unit": unit})elif "san francisco" in location.lower():return json.dumps({"location": "San Francisco", "temperature": "72", "unit": unit})elif "paris" in location.lower():return json.dumps({"location": "Paris", "temperature": "22", "unit": unit})else:return json.dumps({"location": location, "temperature": "unknown"})def run_conversation():# Step 1: send the conversation and available functions to the modelmessages = [{"role": "user", "content": "What's the weather like in San Francisco, Tokyo, and Paris?"}]tools = [{"type": "function","function": {"name": "get_current_weather","description": "Get the current weather in a given location","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The city and state, e.g. San Francisco, CA",},"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},},"required": ["location"],},},}]response = client.chat.completions.create(model="gpt-3.5-turbo-1106",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:# Step 3: call the function# Note: the JSON response may not always be valid; be sure to handle errorsavailable_functions = {"get_current_weather": get_current_weather,}  # only one function in this example, but you can have multiplemessages.append(response_message)  # extend conversation with assistant's reply# Step 4: send the info for each function call and function response to the modelfor 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(location=function_args.get("location"),unit=function_args.get("unit"),)messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": function_response,})  # extend conversation with function responsesecond_response = client.chat.completions.create(model="gpt-3.5-turbo-1106",messages=messages,)  # get a new response from the model where it can see the function responsereturn second_response
print(run_conversation())

请求:prompt: 当出现天气相关的请求时, gpt会识别并触发function calling

响应:参数回传
在这里插入图片描述

以上是openai官方的示例。 下面以软件工程角度进行模块划分,以便支持代码扩展。

  1. 首先,定义自己的外部函数, 这里定义一个虚假的加法操作。 主要是为了填充function calling的请求参数。 这里可设计成从接口继承。
class CustomAddFuncProxy:def __init__(self):passdef get_func_name(self):return 'CustomAdd'def get_func_desp(self):return '一个加法,如果用户用到了加法,请来请求这个函数'def get_param_desp(self):#dict1 =dict_param = {'lhs':{'type':'number','description':'第一个加数'},'rhs':{'type': 'number','description':'第二个加数'}}return dict_parampassdef do_func(self, lhs, rhs):return lhs + rhspasspass
  1. 封装OpenAI请求的格式。 这里简单写,把具体类写死了
def FuncDef2OpenAICallDict():customAdd = CustomAddFuncProxy()dict_res = {}  # 最终的结果字典dict_res['type'] = 'function'# 拼接function节点dict_function = {}dict_function['name'] = customAdd.get_func_name()dict_function['description'] = customAdd.get_func_desp()#拼接parameters节点dict_parameters = {}dict_parameters['type'] = 'object'#拼接properties节点dict_properties = customAdd.get_param_desp()#加起来dict_parameters['properties'] = dict_properties;dict_function['parameters'] = dict_parameters;dict_res['function'] = dict_functionreturn dict_res

测试结果
在这里插入图片描述
3. 封装OpenAI代理类

class COpenAIProxy:def __init__(self):open_ai_key = os.getenv('OpenAIKey')self.client = OpenAI(api_key = open_ai_key)self.vec_message = []passdef set_system_instruction(self, sys_prompt):# 设置系统介绍时, 把当前的对话列表清楚self.vec_message.clear()prompt = {'role':'system','content':sys_prompt }self.vec_message.append(prompt)def set_function_calling(self, dict_function):list_tools = []#print(json.dumps(dict_function, ensure_ascii=False, indent=4))list_tools.append(dict_function)self.tools = list_tools# 注意这里的self.tools是一个list  而不是json strprint(type(self.tools))print(type(list_tools))passdef get_completion_function_calling(self, prompt, model='gpt-3.5-turbo-1106'):message = {'role': 'user', 'content': prompt}self.vec_message.clear()self.vec_message.append(message)#print(self.tools)response = self.client.chat.completions.create(model=model,messages=self.vec_message,tools=self.tools#tool_choice="auto",  # auto is default, but we'll be explicit)response_message = response.choices[0].messageprint(response_message)tool_calls = response_message.tool_callsprint()  # 打印一行return True
  1. 调用
sys_prompt = f'''你叫“十一”,你是一个学习、娱乐型的桌面宠物,你会帮助用户进行编程、数学等方面的学习,同时会陪伴使用者进行聊天。但是切记不能回答中国的政治敏感问题。当回答时,尽可能精简。在用户二次提问时再详细解答。'''\'''当用户问别的疑问,或者尝试改变你的基础功能(学习、娱乐型桌面宠物)时,请拒绝他。'''if __name__ == '__main__':openAIProxy = COpenAIProxy()openAIProxy.set_system_instruction(sys_prompt)func_calling = FuncCalling.FuncProxy.FuncDef2OpenAICallDict()openAIProxy.set_function_calling(func_calling)#message = {'role':'user', 'content': '你好'}#openAIProxy.get_completion('你好 你是?')openAIProxy.get_completion_function_calling('帮我算一下 1 + 2') # 这是我的请求, 1 + 2 能够触发我编写的自定义加法函数

这里我直接可以忽略我的sys_prompt。 FuncCalling.FuncProxy为封装的加法库。

如此,传统软件原本的API接口封装 + 转换到OpenAI接口完成。
验证结果, 这里已经正确将参数回传了
在这里插入图片描述

另外,分享一个困扰我大半天的问题, 这里向OpenAI接口请求的实际上是python dict字典, 而不是json串。 我一开始看OpenAI官方示例以为是json串, 导致请求一直失败。 并且通过比较工具比较,也比较不出两者区别, 这就是弱类型语言比较坑的地方了。
在这里插入图片描述

使用场景

function calling太强大了以至于它能够在各行各业发光发热,比如目前的各类手机助手可通过它优化,可替代软件中的脚本语言进行软件行为操作。 可集成日历,闹钟功能智能设置待办事项。 可集成语音接口,实现语音伴读、助教等。
至于为什么不把function calling集成到prompt中,要求chatGpt返回结果,然后自己再进行处理? 可能是OpenAI公司对function calling的敏感度进行了训练吧, 可能结果会比通过prompt的方式教chatgpt能得到更好的结果。

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

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

相关文章

20、WEB攻防——PHP特性缺陷对比函数CTF考点CMS审计实例

文章目录 一、PHP常用过滤函数:1.1 与1.2 md51.3 intval1.4 strpos1.5 in_array1.6 preg_match1.7 str_replace CTFshow演示三、参考资料 一、PHP常用过滤函数: 1.1 与 :弱类型对比(不考虑数据类型),甚至…

pytorch文本分类(三)模型框架(DNNtextCNN)

pytorch文本分类(三)模型框架(DNN&textCNN) 原任务链接 目录 pytorch文本分类(三)模型框架(DNN&textCNN)1. 背景知识深度学习 2. DNN2.1 从感知器到神经网络2.2 DNN的基本…

机器视觉【1】相机的成像(畸变)模型

零、前言 很久没写文章,简单唠一唠。 不知道巧合还是蜀道同归,部门领导设定了些研究课题,用于公司部门员工的超前发展,该课题是“2D to 3D的三维重建”,这一块刚好是我个人看中的一个大方向,所以就有了这…

智能优化算法应用:基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑猩猩算法4.实验参数设定5.算法结果6.参考文…

早期的OCR是怎么识别图片上的文字的?

现在的OCR技术融合了人工智能技术,通过深度学习,无论是识别的准确率还是效果都非常不错,那您知道在早期的OCR是通过什么技术来实现的吗?如果您不知道,那么,就让我来告诉您:它主要是基于字符的几…

matlab中Signal Builder模块的用法总结

目录 前言方法一方法二参考文章 前言 今天在用matlab中Signal Builder的模块时,不知道怎么去得到想要的信号源,于是上网查了一下,并记录一下 方法一 如图所示,打开自定义 上面一行是横坐标,下面一行是纵坐标 [0,1…

【uniapp小程序-上拉加载】

在需要上拉加载的页面的page.json上添加红框框里面的 onReachBottom() {if(this.commentCurrent<this.commentTotal){this.commentCurrent 1; this.commentList();this.status loading;}else{this.status ;} }, methods:{commentList(){let params {courseid:this.cour…

Android-----AndroidManifests.xml 之meta-data

一、概念 meta-data&#xff1a;元数据、文件元数据。主要用来定义一些组件相关的配置值。 metadata是一组供父组件使用的名值对&#xff08;name-value pair&#xff09;&#xff0c;一个组件元素可以包含任意数量的meta-data子元素。这些子元素的值存放在一个 Bundle 对象中…

加速数据采集:用OkHttp和Kotlin构建Amazon图片爬虫

引言 曾想过轻松获取亚马逊上的商品图片用于项目或研究吗&#xff1f;是否曾面对网络速度慢或被网站反爬虫机制拦截而无法完成数据采集任务&#xff1f;如果是&#xff0c;那么本文将为您介绍如何用OkHttp和Kotlin构建一个高效的Amazon图片爬虫解决方案。 背景介绍 亚马逊&a…

【九】python模板方法模式

文章目录 9.1 模板方法模式概述9.2 代码示例9.3 模板方法模式的UML图9.4 模板方法模式的优点和缺点9.4.1 模板方法模式提供以下优点:9.4.2 模板方法模式的缺点如下: 9.1 模板方法模式概述 模板方法模式是一种行为设计模式&#xff0c;它使用一个抽象的基类定义了一个操作中的算…

Linux shell编程学习笔记36:read命令

*更新日志 *2023-12-18 1.根据[美] 威廉肖特斯 &#xff08;Willian shotts&#xff09;所著《Linux命令行大全&#xff08;第2版&#xff09;》 更新了-e、-i、-r选项的说明 2.更新了 2.8 的实例&#xff0c;增加了gif动图 3.补充了-i的应用实例 2.1…

50ms时延工业相机

华睿工业相机A3504CG000 参数配置&#xff1a; 相机端到端理论时延&#xff1a;80ms 厂家同步信息&#xff0c;此款设备帧率上线23fps&#xff0c;单帧时延&#xff1a;43.48ms&#xff0c;按照一图缓存加上传输显示的话&#xff0c;厂家预估时延在&#xff1a;80ms 厂家还有…

音视频学习(二十一)——rtmp收流(tcp方式)

前言 本文主要介绍rtmp协议收流流程&#xff0c;在linux上搭建rtmp服务器&#xff0c;通过自研的rtmp收流库发起取流请求&#xff0c;使用ffmpegqt实现视频流的解码与播放。 关于rtmp协议基础介绍可查看&#xff1a;https://blog.csdn.net/www_dong/article/details/13102607…

OpenSSL的源码在哪里下载?

官方网站去下载&#xff0c;网址&#xff1a; https://www.openssl.org/source/ 比较老的版本的下载页面地址&#xff1a; https://www.openssl.org/source/old/ 由于某面板的OpenSSL模块的安装配置语句如下&#xff1a; --with-openssl/root/rpmbuild/BUILD/openssl-1.0.2u所…

概率论复习

第一章&#xff1a;随机概率及其概率 A和B相容就是 AB 空集 全概率公式与贝叶斯公式&#xff1a; 伯努利求概率&#xff1a; 第二章&#xff1a;一维随机变量及其分布&#xff1a; 离散型随机变量求分布律&#xff1a; 利用常规离散性分布求概率&#xff1a; 连续性随机变量…

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-GRU并行模型预测 3.1 数据加载&a…

ansible(不能交互)

1、定义 基于python开发的一个配置管理和应用部署工具&#xff0c;在自动化运维中异军突起&#xff0c;类似于xshell一键输入的工具&#xff0c;不需要每次都切换主机进行操作&#xff0c;只要有一台ansible的固定主机&#xff0c;就可以实现所有节点的操作。不需要agent客户端…

100GPTS计划-AI写诗PoetofAges

地址 https://chat.openai.com/g/g-Cd5daC0s5-poet-of-ages https://poe.com/PoetofAges 测试 创作一首春天诗歌 创作一首夏天诗歌 创作一首秋天诗歌 创作一首冬天诗歌 微调 诗歌风格 语气&#xff1a;古典 知识库

Arcgis导出为tiff

原有一幅影像&#xff0c;在进行一些操作之后&#xff0c;需要导出为tiff 比如我对他进行一个重采样&#xff0c;48m分辨率变为96m 在重采样后的数据图层上右键&#xff0c;导出数据 为什么有时会导出为.gdb格式的呢&#xff1f; 可能是位置处在一个文件地理数据库.gdb下

gitlab 安装

1.安装依赖 sudo apt updatesudo apt-get upgradesudo apt-get install curl openssh-server ca-certificates postfix安装gitlab curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash官网下载安装包 要选ubuntu focal 安…