使用 openai 和 langchain 调用自定义工具完成提问需求

我们提供了一个函数,接受传入运算的字符串,返回运算的结果。

现在的需求是,我们问 gpt 模型,由于模型计算能力并不好,他要调用计算函数,根据计算结果,回答我们的问题。


使用 openai 实现:

定义函数:

def calculator(expression):return eval(expression)
from openai import OpenAIclient = OpenAI()

把函数作为工具,声明给 openai

tools = [{"type": "function","function": {"name": "calculator","description": "运行加减乘除运算的表达式。","parameters": {"type": "object","properties": {"expression": {"type": "string","description": "需要运行的算术表达式"}}}}
}]

调用大模型,传入我们的问题并告知 openai 可使用的工具:

messages = [{"role": "user", "content": "计算 100*100/400*56 的值?"}]response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages,tools=tools
)response_message = response.choices[0].messagemessages.append(response_message)import json

根据 openai 的指示,包含调用什么工具和工具的传参是什么,我们按照这个调用工具(函数)

tool_calls = response_message.tool_callsif tool_calls:available_functions = {"calculator": calculator,}for tool_call in tool_calls:function_name = tool_call.function.nameif function_name == 'calculator':function_args = json.loads(tool_call.function.arguments)function_response = calculator(function_args.get('expression'))messages.append({"tool_call_id": tool_call.id,"role": "tool","name": function_name,"content": str(function_response),})

我们把消息的上下文,工具的返回结果等信息封装成一条消息,发给大模型,让大模型返回和我们的提问相匹配的回答的文案。

        second_response = client.chat.completions.create(model="gpt-3.5-turbo",messages=messages)print(second_response.choices[0].message.content)

好了,代码到此结束,以下截图是 openai 的返回:


使用 langchain 实现:

引包

from langchain.agents import AgentType, initialize_agent
from langchain.chat_models import ChatOpenAI
from langchain.tools.base import BaseTool

把我们的功能函数声明为一个工具:

class Calculator(BaseTool):name = "Calculator"description = "运行加减乘除运算的表达式"def _run(self, query: str):"""Use the tool."""# 在这里实现您的自定义函数逻辑result = self.custom_function(query)return resultasync def _arun(self, query: str):"""Use the tool asynchronously."""raise NotImplementedError("This tool does not support async")def custom_function(self, expression: str):"""Your custom function logic goes here."""# 示例:将输入文本转换为大写return eval(expression)

把工具实例化后放进工具包中

# 创建工具实例
calculator = Calculator()tools = [calculator]

实例化模型创建智能体(agent)

chat_model = ChatOpenAI()# 初始化代理
agent = initialize_agent(tools, chat_model, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

调用智能体拿结果

response = agent.run("计算 10*10/2")print(response)

好了,代码到此结束,以下截图是 openai 的返回:

整个过程用了 reACt 的思想。




 MyPostMan: MyPostMan 是一款类似 PostMan 的接口请求软件,按照 项目(微服务)、目录来管理我们的接口,基于迭代来管理我们的接口文档,文档可以导出和通过 url 实时分享,按照迭代编写自动化测试用例,在不同环境中均可运行这些用例。

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

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

相关文章

发布NPM包详细流程

制作 首先需要制作一个npm包。 按照以下步骤依次执行。 mkdir my-npm-package cd my-npm-package npm init 相信这一步不需要过多的解释,就是创建了一个文件夹,然后初始化了一下文件夹。 然后在生成的package.json文件夹中更改一下自己的配置&…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中,我们常常会遇到代码冗余的问题,这不仅增加了代码量,还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求,要求立马完…

这两个大龄程序员,打算搞垮一个世界软件巨头!

大家都知道,Adobe是多媒体和数字内容创作者的绝对王者,它的旗下有众多大家耳熟能详的软件:Photoshop、Illustrator、Premiere Pro、After Effects、InDegign、Acrobat、Animate等等。 这些软件使用门槛很高,价格昂贵,安…

遗传算法与深度学习实战——生命模拟及其应用

遗传算法与深度学习实战——生命模拟及其应用 0. 前言1. 康威生命游戏1.1 康威生命游戏的规则1.2 实现康威生命游戏1.3 空间生命和智能体模拟 2. 实现生命模拟3. 生命模拟应用小结系列链接 0. 前言 生命模拟是进化计算的一个特定子集,模拟了自然界中所观察到的自然…

大模型之多模态大模型技术

本文作为大模型综述第三篇,介绍语言大模型多模态技术。 不同于语言大模型只对文本进行处理,多模态大模型将文本、语音、图像、视频等多模态数据联合起来进行学习。多模态大模型融合了多种感知途径与表达形态, 能够同时处理和理解来自不同感知通道(例如视觉、听觉、语言和触…

麒麟系统查看和修改ip

查看ip ifconfig ifconfig enp0s3 192.168.1.110

使用Echarts来实现数据可视化

目录 一.什么是ECharts? 二.如何使用Springboot来从后端给Echarts返回响应的数据? eg:折线图: ①Controller层: ②service层: 一.什么是ECharts? ECharts是一款基于JavaScript的数据可视化图标库,提供直观&…

javaScript中的对象

创建 this指向 命名规则 不符合变量名的命名规则和规范使用数组关联语法获取 遍历对象 使用for(var key in 对象) 删除属性 对象引用关系

Flutter大型项目架构:私有组件包管理

随着项目功能模块越来越多,怎么去管理这些私有组件包是一个不得不面对的问题,特别对于团队开发来讲,一些通用的公共组件往往会在多个项目间使用,多的有几十个,每个组件包都有有自己的版本,组件包之间还有依…

一篇文章带你入门爬虫并编写自己的第一个爬虫程序

一、引言 目前我们处在一个信息快速迭代更新的时代,海量的数据以大爆炸的形式出现在网络之中,相比起过去那个通过广播无线电、书籍报刊等传统媒介获取信息的方式,我们现在通过网络使用搜索引擎几乎可以获得任何我们需要的信息资源。 但与此同…

Vue前端工程

创建一个工程化的vue项目 npm init vuelatest 全默认回车就好了 登录注册校验 //定义数据模型 const registerDataref({username:,password:,rePassword: }) //校验密码的函数 const checkRePassword(rule,value,callback)>{if (value){callback(new Error(请再次输入密…

python基础知识点

最近系统温习了一遍python基础语法,把自己不熟知的知识点罗列一遍,便于查阅~~ python教程 Python 基础教程 | 菜鸟教程 1、python标识符 以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 f…

c++STL容器中vector的使用,模拟实现及迭代器使用注意事项和迭代器失效问题

目录 前言: 1.vector的介绍及使用 1.2 vector的使用 1.2 1 vector的定义 1.2 2 vector iterator(迭代器)的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5vector 迭代器失效问题。 2.vector模拟实现 2.1 std::vect…

大彩触摸屏与单片机通讯

目录: 一、概述 1、触摸屏简介 2、安装软件 1)设置VSPD软件 2)设置VisualTFT软件 3)设置串口软件 二、单片机发送指令给触摸屏 1、发送文本 2、显示与隐藏控件 1)通过指令助手生成指令 2)隐藏…

实现Obsidian PC端和手机端(安卓)同步

步骤 1:在PC端设置Obsidian 安装Obsidian和Git:确保你的PC上已经安装了Obsidian和Git。你可以从Obsidian官网和Git官网下载并安装。 克隆GitHub代码库:在PC上打开命令行(例如Windows的命令提示符或Mac/Linux的终端)&a…

Redis 初步认识

目录 1. 概述 2. 数据结构 3. 使用方式 4. 优势 1. 概述 Redis (Remote Directory Server)是一个开源的基于内存的数据存储系统; 可以用作数据库缓存和消息队列等各种场景,也是目前最热门的 NoSQL 数据库之一; 早…

LeetCode3. 无重复字符的最长子串(java实现)

今天分享的题目是LeetCode3. 无重复字符的最长子串,来看题目描述: 无重复的最长子串,题目有可能有些小伙伴没读太懂,其实就是找到不重复的最长子串,比如eg3,pwwk,那么w出现了两次就不符合要求。…

Spring源码- context:component-scan base-package标签的作用源码解析

1.扫描包路径下所有的类加载解析成bean定义信息 ClassPathBeanDefinitionScanner .doScan方法调用路径 doScan:276, ClassPathBeanDefinitionScanner (org.springframework.context.annotation) parse:95, ComponentScanBeanDefinitionParser (org.springframework.context.a…

C语言第九天笔记

数组的概念 什 么是数组 数组是 相同类型, 有序数据的集合。 数 组的特征 数组中的数据被称为数组的 元素,是同构的 数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类 型的变量空间) 衍生概念&…

ClkLog:开源用户行为分析框架,让数据分析更轻松

ClkLog:开源用户行为分析框架,让数据分析更轻松 在数据驱动的时代,找到一个好用的用户行为分析工具真是难上加难。但是今天你有福了,开源免费的 ClkLog 就是你的不二选择!本文将为你详细介绍 ClkLog 的功能特点、技术架…