langchain Agent代理简介

定义

LLM只提供了最通用的功能,如果想要一些更专业化的功能,比如数学运算、网页搜索等,就需要调用相应的Tool。包装了Tool的LLM会用Agent来进行封装,也就是代理。

代理的类型

一共9种,只列出了4种:

名称描述
zero-shot-react-description(默认)这种代理类型在没有任何先前信息的情况下,直接生成对问题的反应和回答。它依赖于模型本身的通用知识和理解能力来处理问题
react-docstore这种代理类型与文档进行交互。它可以访问一个或多个预先定义的文档库,从中提取相关信息来回答问题。这对于需要引用具体文档或数据的任务非常有用
self-ask-with-search这种代理类型会在回答问题前先进行自我提问,然后使用搜索引擎或其他信息检索工具来寻找答案。这种方法特别适用于需要实时获取信息或处理复杂问题的场景
conversational-react-description这种代理类型在对话上下文中生成反应和回答。它能够记住对话的历史内容,并根据对话的上下文进行更为连贯和相关的回答。这对于持续对话或需要上下文理解的任务非常有效

后四种代理的代码示例如下:

react-docstore
from langchain import OpenAI, Wikipedia
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain.agents.react.base import DocstoreExplorer# 以Wikipedia作为文档进行查询
docstore=DocstoreExplorer(Wikipedia())
# 定义工具
tools = [Tool(name="Search",func=docstore.search,description="useful for when you need to ask with search"),Tool(name="Lookup",func=docstore.lookup,description="useful for when you need to ask with lookup")
]
# 初始化LLM
llm = OpenAI(temperature=0, model_name="text-davinci-002")
# 初始化agent
react = initialize_agent(tools, llm, agent=AgentType.REACT_DOCSTORE, verbose=True)
# 定义prompt
question = "Author David Chanoff has collaborated with a U.S. Navy admiral who served as the ambassador to the United Kingdom under which President?"
react.run(question)
self-ask-with-search
from langchain import OpenAI, SerpAPIWrapper
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType# 初始化LLM
llm = OpenAI(temperature=0)
# 初始化谷歌搜索的装饰器
search = SerpAPIWrapper()
# 把搜索功能集成到tool中
tools = [Tool(name="Intermediate Answer",func=search.run,description="useful for when you need to ask with search")
]
# 定义并运行代理
self_ask_with_search = initialize_agent(tools, llm, agent=AgentType.SELF_ASK_WITH_SEARCH, verbose=True)
self_ask_with_search.run("What is the hometown of the reigning men's U.S. Open champion?")
conversational-react-description
from langchain.agents import Tool
from langchain.agents import AgentType
from langchain.memory import ConversationBufferMemory
from langchain import OpenAI
from langchain.utilities import SerpAPIWrapper
from langchain.agents import initialize_agent
# 一般会用谷歌搜索缝一个搜索功能,应对更复杂的提问
search = SerpAPIWrapper()
tools = [Tool(name = "Current Search",func=search.run,description="useful for when you need to answer questions about current events or the current state of the world"),
]
# 为了节省内存而造的缓冲器
memory = ConversationBufferMemory(memory_key="chat_history")
# 定义LLM
llm=OpenAI(temperature=0)
# 初始化agent
agent_chain = initialize_agent(tools, llm, agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION, verbose=True, memory=memory)#连续调用agent实现连续对话
agent_chain.run(input="hi, i am bob")
agent_chain.run(input="what's my name?")

自定义代理

自己创建一个代理类CustomAgent(),然后继承代理类模板。有两种模板:

名称描述
BaseSingleActionAgent设计用于只需要执行一个动作的任务;通常只需要实现 plan 和 finish 方法。
BaseMultiActionAgent设计用于需要多个步骤才能完成的任务;需要实现 plan, react, 和 finish 方法,并且需要在 plan 和 react 之间进行多次循环。

代码示例如下:

BaseSingleActionAgent
from langchain.agents import BaseSingleActionAgent
from langchain.schema import AgentAction, AgentFinishclass AdditionAgent(BaseSingleActionAgent):def plan(self, inputs: dict) -> AgentAction:num1 = inputs.get('num1')num2 = inputs.get('num2')if num1 is None or num2 is None:raise ValueError("Inputs must include 'num1' and 'num2'.")action = AgentAction(action="addition",action_input={"num1": num1, "num2": num2})return actiondef response(self, action: AgentAction) -> AgentFinish:if action.action != "addition":raise ValueError("Unsupported action. This agent only supports 'addition' action.")num1 = action.action_input['num1']num2 = action.action_input['num2']result = num1 + num2return AgentFinish(return_values={"result": result})# Usage example
agent = AdditionAgent()# Plan the action
inputs = {'num1': 3, 'num2': 5}
action = agent.plan(inputs)# Perform the action and get the response
result = agent.response(action)
print(result.return_values)  # Output: {'result': 8}
BaseMultiActionAgent
from langchain.agents import BaseMultiActionAgent
from langchain.schema import AgentAction, AgentFinishclass AdditionAgent(BaseMultiActionAgent):def plan(self, inputs: dict) -> AgentAction:num1 = inputs.get('num1')num2 = inputs.get('num2')if num1 is None or num2 is None:raise ValueError("Inputs must include 'num1' and 'num2'.")action = AgentAction(action="addition",action_input={"num1": num1, "num2": num2})return actiondef response(self, action: AgentAction) -> AgentFinish:if action.action != "addition":raise ValueError("Unsupported action. This agent only supports 'addition' action.")num1 = action.action_input['num1']num2 = action.action_input['num2']result = num1 + num2return AgentFinish(return_values={"result": result})def react(self, inputs: dict) -> AgentFinish:"""React to inputs by planning and executing an action.Args:inputs (dict): The inputs should include two keys: 'num1' and 'num2'.Returns:AgentFinish: The result of the addition."""action = self.plan(inputs)result = self.response(action)return result# Usage example
agent = AdditionAgent()# React to inputs
inputs = {'num1': 3, 'num2': 5}
result = agent.react(inputs)
print(result.return_values)  # Output: {'result': 8}

工具和工具包

每个工具包含一个单独的功能,工具包中有一堆工具。两者都可以丢进agent中,使用时按需选择。

工具类可以自定义,只需要继承BaseTool类

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

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

相关文章

Flarum 安装和使用教程

随着开源社区的日益繁荣,人们对社区品质的要求也越来越高。传统的 BBS 论坛模式已经难以满足现代用户对美观、便捷、互动性的需求。搭建一个现代化的高品质社区,成为许多网站管理者的迫切需求和共同挑战。 今天就给大家安利一款现代化的、优雅的开源论坛…

立创·天空星开发板-GD32F407VE-Timer

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子,记录学习笔记。 立创天空星开发板-GD32F407VE-Timer 定时器基本定时器示例 定时器 定时器是嵌入式系统中常用的一种外设,它可以产生一定的时间间隔、延时、定时等功能,广泛应用于…

nnUNet-v1虚拟环境安装

1. 深度学习环境配置: https://blog.csdn.net/m0_68239345/article/details/128807483?spm1001.2014.3001.5501 2. nnUNet-v1保姆级教程 nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看)-CSDN博客

网络安全等级保护基本要求 第1部分:安全通用要求

基本要求 第三级 安全物理环境 物理位置选择 a) 机房场地应选择在具有防震、防风和防雨等能力的建筑内; b) 机房场地应避免设在建筑物的顶层或地下室,否则应加强防水和防潮措施 物理访问控制 a) 机房出入口应配置电子门禁系统,控制、鉴…

Java项目:100 springboot共享汽车管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本共享汽车管理系统有管理员和用户。 管理员功能有个人中心,用户管理,投放地区管理,汽车信息管理,汽车…

用 KV 缓存量化解锁长文本生成

很高兴和大家分享 Hugging Face 的一项新功能: KV 缓存量化 ,它能够把你的语言模型的速度提升到一个新水平。 太长不看版: KV 缓存量化可在最小化对生成质量的影响的条件下,减少 LLM 在长文本生成场景下的内存使用量,从而在内存效率和生成速度…

形参和全局变量同名时哪个优先级更高

在JavaScript中,当形参(函数参数)和全局变量同名时,形参的优先级高于全局变量。这是因为当函数被调用时,形参会在函数的作用域内被创建,并且这个作用域会覆盖全局作用域。 具体来说: 函数作用…

基于STM32和人工智能的智能交通管理系统

目录 引言环境准备智能交通管理系统基础代码实现:实现智能交通管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景:智能交通管理与优化问题解决方案与优化收尾与总结 1. 引言 随着城市化进程的加快&#xff0…

算法第六天:力扣第977题有序数组的平方

一、977.有序数组的平方的链接与题目描述 977. 有序数组的平方的链接如下所示:https://leetcode.cn/problems/squares-of-a-sorted-array/description/https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组…

【C++】STL中stack和queue(适配器版)的模拟实现

前言:在此之前我们讲到了stack和queue还有deque的常见的使用方法,并且也在数据结构的时候用C语言去实现过栈和队列,今天我们将进一步的用C去模拟实现stack和queue 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 …

vue 之 vuex

目录 vuex 是什么 Vuex管理哪些状态呢? Vuex 页面刷新数据丢失怎么解决 1. 使用浏览器的本地存储 2. 使用 Vuex 持久化插件 3. 使用后端存储 注意事项 Vuex 为什么要分模块并且加命名空间 vuex 是什么 vuex 是专门为 vue 提供的全局状态管理系统&#xff0c…

【应用案例】如何解决无人驾驶车辆的动力转向问题

埃尔朗根-纽伦堡大学名称为高能赛车运动队(High-Octane Motorsports e.V.)的学生方程式车队都设计、构建和制造具有创新意义且独特的赛车。然后,他们将参加三种不同类别的大学生方程式比赛;该项赛事中的参赛队伍来自于世界各地。 电动、无人驾驶和燃油车…

Windows 11 24H2版首发体验!附详细更新升级安装教程

Windows 11 24H2 版首发体验!这是微软2024年的大版本更新,新增超多新功能,以下会给你细细道来。这个版本目前小编亲测,使用非常流畅,没有什么明显问题。系统是已经集成了VB6/VC2005/VC2008/VC2010/VC2012/VC2013/VC201…

Dorkish:一款针对OSINT和网络侦查任务的Chrome扩展

关于Dorkish Dorkish是一款功能强大的Chrome扩展工具,该工具可以为广大研究人员在执行OSINT和网络侦查任务期间提供强大帮助。 一般来说,广大研究人员在执行网络侦查或进行OSINT信息收集任务过程中,通常会使用到Google Dorking和Shodan&…

2024年高考:计算机相关专业还值得选择吗?

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 行业竞争现状 市场饱和与新兴技术的影响 如何保持竞争力 专业与个人的匹配度判断 专业核心课程与技术能力 个人兴趣与职业…

使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)

目录 1、使用场景 2、压缩包的创建 3、压缩包的解压 4、CloseZipZ和CloseZipU两接口的区别 5、开源zip.cpp和unzip.cpp文件的下载 VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排…

【C语音 || 数据结构】二叉树--堆

文章目录 前言堆1.1 二叉树的概念1.2 满二叉树和完美二叉树1.3 堆的概念1.4 堆的性质1.4 堆的实现1.4.1堆的向上调整算法1.4.1堆的向下调整算法1.4.1堆的接口实现1.4.1.1堆的初始化1.4.1.2堆的销毁1.4.1.3堆的插入1.4.1.4堆的删除1.4.1.4堆的判空1.4.1.4 获取堆的数据个数 前言…

单体架构改造为微服务架构之痛点解析

1.微服务职责划分之痛 1.1 痛点描述 微服务的难点在于无法对一些特定职责进行清晰划分,比如某个特定职责应该归属于服务A还是服务B? 1.2 为服务划分原则的痛点 1.2.1 根据存放主要数据的服务所在进行划分 比如一个能根据商品ID找出商品信息的接口,把…

随手记:uniapp图片展示,剩余的堆叠

UI效果图&#xff1a; 实现思路&#xff1a; 循环图片数组&#xff0c;只展示几张宽度就为几张图片边距的宽度&#xff0c;剩下的图片直接堆叠展示 点击预览的时候传入当前的下标&#xff0c;如果是点击堆叠的话&#xff0c;下标从堆叠数量开始计算 <template><…

力扣每日一题(2024-06-13)2813. 子序列最大优雅度

基于官方题解&#xff0c;进行补充说明 给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_…