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

news2025/5/25 5:31:25

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

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


使用 openai 实现:

定义函数:

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

client = 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].message

messages.append(response_message)

import json

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

tool_calls = response_message.tool_calls

if tool_calls:
    available_functions = {
        "calculator": calculator,
    }
    for tool_call in tool_calls:
        function_name = tool_call.function.name
        if 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 result

    async 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.coloradmin.cn/o/1968156.html

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

相关文章

资源|Python入门必看书籍,适合零基础小白,附PDF

小编为初学Python的朋友们汇总了7本零基础入门书籍,包括Python三剑客等,都是在编程届多年畅销的书籍,也是众多从业者的选择,全文详细介绍了书籍主要内容,有需要的宝子根据自身情况自取 需要书籍PDF的宝子评论区留言哦 …

Java每日一练_模拟面试题1(死锁)

一、死锁的条件 死锁通常发生在两个或者更多的线程相互等待对方释放资源,从而导致它们都无法继续执行。死锁的条件通常被描述为四个必要条件,也就是互斥条件、不可剥夺条件、占有并等待条件和循环等待条件。 互斥条件:资源不能被共享&#x…

MindMaster的学习(一)建立项目生成思维导图

MindMaster主要是用来做思维导图,当然也能直接生成PPT和甘特图,使用起来非常方便,简单分享下。 1.安装软件,这个随便搜一个破解版,有的就免安装,直接打开就能用。 2.我们新建一个导图,有空白模版…

认证!云起无垠成为人工智能产业发展联盟AIIA成员单位

近日,经人工智能产业发展联盟(AIIA)严格审核,云起无垠正式成为联盟成员单位。这一荣誉不仅肯定了云起无垠在技术方面的实力,更显示了对其未来发展的高度期待。 AIIA在国家发改委、科技部、工信部和网信办的指导下,由中国信息通信…

【iOS】iOS内存五大分区

iOS内存五大分区 总揽 iOS中,内存主要分为五大区域:栈区,堆区,全局区/静态区,常量区和代码区。总览图如下。 这个图我觉得更好记,因为下面是低地址,上面是高地址,是比较符合日常…

idea 2024 中文最新版破解激活永久(图文详细讲解教程)超级简单(亲测可用)

1.官网下载:下载地址 2.点击下载完成之后,找到下载路径,双击运行exe文件,进行安装 3.安装完成后,在桌面找到idea快捷方式,双击运行 4.此时是没有激活的,点击关闭窗口,然后退出程序 5…

nginx代理设置时能获取到源IP地址的方法

nginx通过http_x_forwarded_for限制来访IP示例_ngnix 根据header的x-forwarded-for限制接入-CSDN博客 名称ip客户端地址10.0.23.90nginx服务器地址110.0.202.48:18888,代理到10.0.204.82:8888nginx服务器地址210.0.204.82:8888,代理到10.0.204.82:8887后…

充电宝买多少毫安的好?选充电宝这几个关键点必看!

在如今这个电子设备不离手的时代,充电宝成为了我们生活中的必备品。然而,面对市场上琳琅满目的充电宝,选择合适容量的充电宝却让许多人感到困惑。充电宝买多少毫安的好?这可不是一个简单的问题。容量太小,无法满足我们…

20240802 每日AI必读资讯

🌐太离谱!曝GPT-4o mini没做安全测试就开庆功会! - OpenAI曾向美国政府承诺,将严格对其前沿的突破性技术进行安全测试,以确保AI不会造成损害,比如教用户制造生化武器或帮助黑客开发新型网络攻击。 - Open…

canvas根据图片生成粒子动画

canvas根据图片生成粒子动画 效果展示: canvas根据图片生成粒子动画效果 注意: js和css的引入 id: cartoonDot-img对应的是被 拷贝的图像,后期要替换的 粒子图像就在这 min.js 地址 HTML代码块 <!DOCTYPE html> <html><head><meta charset=&quo…

面向对象编程在Python中的应用

引言 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种程序设计范式&#xff0c;它使用“对象”来设计软件。在Python中&#xff0c;OOP提供了一种结构化的方式来组织代码&#xff0c;使得程序更加易于理解和维护。本文将介绍一些基本的面向对象编…

洗地机哪个品牌好用?智能洗地机品牌排行榜揭晓

在追求家居清洁智能化的今天&#xff0c;洗地机品牌众多&#xff0c;选择一款好用且智能的洗地机成了许多家庭的关注点。本文精心揭晓智能洗地机品牌排行榜&#xff0c;为大家精选出市场上性能卓越、用户口碑极佳的品牌&#xff0c;如滴水、以内、希亦等&#xff0c;它们凭借创…

电池数据巡检时发现的数据问题处置措施

电池监控系统在日常使用中需要关注电压不均告警和内阻不均告警&#xff0c;对偏差大的单体电池核实处理。 一、电池单体电压偏差 出现电池单体电压偏差有两种情况&#xff0c;一种是电池故障&#xff0c;另一种是电池单体采集模块故障。现场需要用万用表对异常单体电压进行测量…

轻松入门Linux—CentOS,直接拿捏 —/— <5>

一、Linux常用工具 1、tar打包命令详解 当 tar 命令用于打包操作时&#xff0c;该命令的基本格式为&#xff1a; tar [选项] 源文件或目录 常用选项&#xff1a; 1.1 打包文件 例如&#xff0c;我有几个文件&#xff0c;将他们打包成一个文件&#xff0c;以tar结尾的后缀名 …

新手小白,如何新建一个springboot的web项目?

第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选择java8版本 ④选择jar包类型 如果不知道或者找不到配置8版本&…

【JVM】类加载器和双亲委派模型

什么是类加载器 如果想要了解什么是类加载器就需要清楚一个Java文件是如何运行的。我们可以看下图&#xff1a; 首先要知道操作系统是不能直接运行Java文件的&#xff0c;所以就需要通过JVM将Java文件转换为操作系统可以运行的文件类型&#xff0c;步骤如下&#xff1a; 类加…

lua学习(1)

1. lua 字符串 单个引号和双引号都可变量的定义默认是全局的删除一个变量将其赋值为nil即可 如&#xff1a; bnilnil还可以对表中的数据进行删除&#xff0c;也可删除一个表只要变量不是nil&#xff0c;变量即存在标识符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后&am…

网安加·百家讲坛 | 高明:模糊测试技术在车联网安全性评估中的应用

作者简介&#xff1a;高明&#xff0c;信息安全硕士&#xff0c;10年以上软件安全开发和产品架构设计经验。成功主导多个模糊测试和车联网安全相关的产品研发与项目实施&#xff0c;并参与网络安全产品相关行业标准的编写。擅长产品规划和敏捷项目管理&#xff0c;持有PMP、PgM…

SFP-8636 QSFP光模块解析学习

对于QSFP 100G模块,我们参考SFF-8636协议文档,暂时访问的寄存器一般位于page0, 此时0x7f写0即可, 1,状态静态数据 -->iic read 1 0 a0 80 Read i2c_bus[1] dev_addr[0xa0] reg[0x80] success, r_data[0xd] -->iic read 1 0 a0 82 Read i2c_bus[1] dev_addr[0x…

如何实现AI无人带货直播间?

在数字化时代&#xff0c;直播电商已成为推动商品销售的重要力量&#xff0c;随着人工智能(AI)技术的不断发展&#xff0c;AI无人带货直播间作为一种创新的商业模式正逐渐崭露头角。 这种直播间通过集成先进的AI技术&#xff0c;如自然语言处理、图像识别、机器学习等&#xf…