当前位置: 首页 > news >正文

LangChain入门教程 - 使用代理Agent

对于大模型,比如某些场景,需要数学计算,或者需要从某些网站获取参考资料,就必须使用专门的代理来完成任务。这里我们使用langchain提供的数学工具来实现一个最简单的例子,下一篇我们会讲如何自己实现代理。

首先创建一个对话模型,记得自己设置环境变量QIANFAN_AKQIANFAN_SK

from langchain_community.chat_models import QianfanChatEndpointchatModel = QianfanChatEndpoint(model='ERNIE-Bot',endpoint='completions'
)

组装代理

我们使用lc库提供的数学包LLMMathChain组装数学代理,负责数学相关的计算工作。这里简单解释一下代理的工作原理,不完全正确,但大概原理是没跑的:大模型在收到问题后,和工具的描述匹配一下,决定使用哪些工具。然后把问题理解后生成合适的参数调用工具并返回结果。这里面是个大黑盒,怎么理解和拆分问题并匹配工具都是由大模型自己决定的,你只能通过提示词给出参考。对于百度的千帆,测试中发现对于数学问题用英文提问比较好,如果是中文理解就问有问题,没法正确调用工具。

from langchain import LLMMathChain
from langchain.agents import AgentType, initialize_agent
from langchain.tools import BaseTool, Tool
from pydantic import BaseModel, Fieldtools = []class CalculatorInput(BaseModel):question: str = Field()llm_math_chain = LLMMathChain(llm=chatModel, verbose=True)tools.append(Tool.from_function(func=llm_math_chain.run,name='牛逼的计算器',description='用于回答数学问题',args_schema=CalculatorInput)
)# ZERO_SHOT_REACT_DESCRIPTION代表根据工具的描述进行选择
agent = initialize_agent(tools, chatModel, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)

 这里args_schema参数用于构造输入参数,CalculatorInut的写法参考pydantic的文档:pydantic · PyPI

提问

# 使用英文便于大模型理解
agent.run('What is the result of 5.85 raised to the 2.16 power?'
)"""输出
> Entering new AgentExecutor chain...This is a mathematical question that requires raising a number to a specific power.Action: 牛逼的计算器
Action Input: Calculate 5.85 raised to the power of 2.16> Entering new LLMMathChain chain...
Calculate 5.85 raised to the power of 2.16```text
5.85**2.16
```
...numexpr.evaluate("5.85**2.16")...Answer: 45.400085499141575
> Finished chain.Observation: Answer: 45.400085499141575
Thought:I now know the result of 5.85 raised to the 2.16 power.Final Answer: 5.85 raised to the 2.16 power is equal to 45.400085499141575.> Finished chain.
"""

代理是如何执行的?

前面我们在构造tool时,func参数设置为llm_math_chain.run。那么这个函数支持哪些参数,被调用时传进来的参数又是什么样的呢?一种方法是找源码,那个比较费事,我们可以inspect库提供的方法查看信息,然后自己在run函数外面包一层,就能看到想要看的信息了。

使用inspect函数查看信息,我们可以看到run有哪些参数和参数的默认值。

import inspectsig = inspect.signature(llm_math_chain.run)for name, para in sig.parameters.items():print(name, para.default)'''输出
args <class 'inspect._empty'>
callbacks None
tags None
metadata None
kwargs <class 'inspect._empty'>
'''

我们在这里只关心第一个参数args,我们自己定义一个函数打印传了什么参数进来。

from langchain import LLMMathChain
from langchain.tools import BaseTool, Tool
from pydantic import BaseModel, Fieldtools = []class CalculatorInput(BaseModel):question: str = Field()llm_math_chain = LLMMathChain(llm=chatModel, verbose=True)def my_math_func(*args):print('输入参数', args)return llm_math_chain.run(*args)tools.append(Tool.from_function(func=my_math_func,name='牛逼的计算器',description='用于回答数学问题',args_schema=CalculatorInput)
)'''
我们可以看到以下输出:Action: 牛逼的计算器Action Input: Calculate 5.85 raised to the 2.16 power.
输入参数 ('Calculate 5.85 raised to the 2.16 power.\n',)
'''

相关文章:

LangChain入门教程 - 使用代理Agent

对于大模型&#xff0c;比如某些场景&#xff0c;需要数学计算&#xff0c;或者需要从某些网站获取参考资料&#xff0c;就必须使用专门的代理来完成任务。这里我们使用langchain提供的数学工具来实现一个最简单的例子&#xff0c;下一篇我们会讲如何自己实现代理。 首先创建一…...

windows驱动开发-内核编程技术汇总(五)

使用安全字符串函数 和应用层不一样的是&#xff0c;windows内核完全使用Unicode字符串&#xff0c;许多支持AsciiC的windowsAPI&#xff0c;是在应用层完成项Unicode的切换的。许多系统安全问题是由缓冲区处理不善和生成的缓冲区溢出引起的。 糟糕的缓冲区处理通常与字符串操…...

Java中的optional类是啥和例子

Optional 是 Java 8 引入的一个容器对象&#xff0c;用于表示值存在或不存在。这是一个可以为 null 的容器对象&#xff0c;但使用 Optional 比直接使用 null 更安全&#xff0c;因为 Optional 类提供了许多有用的方法&#xff0c;以便更优雅地处理可能存在或不存在的值。 使用…...

AI大模型探索之路-训练篇16:大语言模型预训练-微调技术之LoRA

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…...

mysql事务锁排查

-- mysql show full PROCESSLIST; -- 查看哪些表在锁。 show open tables where IN_use>0; -- 正在执行的事务&#xff1a; SELECT * FROM information_schema.INNODB_TRX;-- 8.0之前 查看正在锁的事务 select * from information_schema.innodb_locks;-- 查看等待锁的事务 …...

ChatGPT变懒原因:正在给自己放寒假!已被网友测出

ChatGPT近期偷懒严重&#xff0c;有了一种听起来很离谱的解释&#xff1a; 模仿人类&#xff0c;自己给自己放寒假了&#xff5e; 有测试为证&#xff0c;网友Rob Lynch用GPT-4 turbo API设置了两个系统提示&#xff1a; 一个告诉它现在是5月&#xff0c;另一个告诉它现在是1…...

C#标签设计打印软件开发

1、新建自定义C#控件项目Custom using System; using System.Collections.Generic; using System.Text;namespace CustomControls {public class CommonSettings{/// <summary>/// 把像素换算成毫米/// </summary>/// <param name="Pixel">多少像素…...

Springboot+vue+小程序+基于微信小程序的在线学习平台

一、项目介绍    基于Spring BootVue小程序的在线学习平台从实际情况出发&#xff0c;结合当前年轻人的学习环境喜好来开发。基于Spring BootVue小程序的在线学习平台在语言上使用Java语言进行开发&#xff0c;在数据库存储方面使用的MySQL数据库&#xff0c;开发工具是IDEA。…...

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...

ubuntu与redhat的不同之处

华子目录 什么是ubuntu概述 ubuntu版本简介桌面版服务器版 安装部署部署后的设置设置root密码关闭防火墙启用允许root进行ssh登录更改apt源安装所需软件 安装nginx安装apache网络配置Netplan概述配置详解配置文件DHCP静态IP设置设置 软件安装方法apt安装软件作用常用命令配置ap…...

三岁孩童被家养大型犬咬伤 额部撕脱伤达10公分

近期&#xff0c;一名被家养大型犬咬伤了面部的3岁小朋友&#xff0c;在被家人紧急送来西安国际医学中心医院&#xff0c;通过24小时急诊门诊简单救治后&#xff0c;转至整形外科&#xff0c;由主治医师李世龙为他实施了清创及缝合手术。 “患者额部撕脱伤面积约为10公分&…...

@click=“handleClick()“不会传递默认事件参数

当你使用click"handleClick()"这种形式绑定事件处理器时&#xff0c;Vue会将它视为一个函数调用&#xff0c;而不是一个事件监听器。在这种情况下&#xff0c;Vue不会自动传递原生事件对象作为默认参数。 如果你想让Vue自动传递原生事件对象作为默认参数&#xff0c…...

KVM安装Ubuntu24.04简要坑点以及优点

本机环境是ubuntu22.04的环境&#xff0c;然后是8核16线程 ssd是500的 目前对于虚拟机的选择&#xff0c;感觉kvm确实会更加流畅&#xff0c;最重要的一点是简洁&#xff0c;然后实际安装效果也比较的好&#xff0c;如果对于速度方面希望快一点&#xff0c;并且流畅一点的话这…...

QT_day1

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//修改窗口标题this->setWindowTitle("4.6.0");//修改窗口图标this->setWindowIcon(QIcon("C:\\Users\\zj\\Desktop\\yuanshen\\icon"));//修改窗口大小this…...

AWS宣布推出Amazon Q :针对商业数据和软件开发的生成性AI助手

亚马逊网络服务&#xff08;AWS&#xff09;近日宣布推出了一项名为“Amazon Q”的新服务&#xff0c;旨在帮助企业利用生成性人工智能&#xff08;AI&#xff09;技术&#xff0c;优化工作流程和提升业务效率。这一创新平台的推出&#xff0c;标志着企业工作方式的又一次重大变…...

C++:多继承虚继承

在C中&#xff0c;虚继承&#xff08;Virtual Inheritance&#xff09;是一种特殊的继承方式&#xff0c;用于解决菱形继承&#xff08;Diamond Inheritance&#xff09;问题。菱形继承指的是一个类同时继承自两个或更多个具有共同基类的类&#xff0c;从而导致了多个实例同一个…...

Linux进程间通信

每个进程的用户空间都是独立的&#xff0c;不能相互访问。 所有进程的内核空间(32位系统3G-4G)都是共享的 应用场景 作为缓冲区&#xff0c;处理速度不同的进程之间的数据传输资源共享&#xff1a;多个进程之间共享同样的资源&#xff0c;一个进程对共享数据的修改&#xff0c…...

【二叉树算法题记录】222. 完全二叉树的节点个数

题目描述 给你一棵 完全二叉树 的根节点root &#xff0c;求出该树的节点个数。 完全二叉树的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位…...

每日新闻掌握【2024年5月6日 星期一】

2024年5月06日 星期一 农历三月廿八 大公司/大事件 多个品牌黄金优惠后价格重回600元/克以下 “五一”假期期间&#xff0c;记者走访调研黄金消费市场发现&#xff0c;受国际金价回落及“五一”假期促销等多重因素影响&#xff0c;终端黄金价格出现了较为明显的回落。包括周大…...

谈谈Tcpserver开启多线程并发处理遇到的问题!

最近在学习最基础的socket网络编程&#xff0c;在Tcpserver开启多线程并发处理时遇到了一些问题&#xff01; 说明 在linux以及Windows的共享文件夹进行编写的&#xff0c;所以代码中有的部分使用 #ifdef WIN64 ... #else ... #endif 进入正题&#xff01;&#xff01;&…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...