LangChain 代理 Agent(学习笔记)

原文:LangChain 代理 Agent(学习笔记) - 尘叶心繁的专栏 - TNBLOG

LangChain 代理 Agent(学习笔记)

  • LangChain 代理 Agent(学习笔记)
    • 简介
    • Agent
      • Zero-shot ReAct
      • Structured Input ReAct
      • OpenAI Functions
      • Conversational
      • Self ask with search
      • ReAct document store
      • Plan-and-execute agents
    • Tool
    • Toolkit
    • AgentExecutor
    • 组件实例
      • Tool
        • 1. 通过工具类创建工具实例
        • 2. 通过辅助函数 load_tools 加载
      • Agent
    • 总结
      • 相关文档资料链接:

简介


Agent 也就是代理,它的核心思想是利用一个语言模型来选择一系列要执行的动作。
LangChain 的链将一系列的动作硬编码在代码中。
而在 Agent 中,语言模型被用作推理引擎,来确定应该执行哪些动作以及以何种顺序执行。
这就涉及到几个关键组件:

  • Agent 代理
  • Tool 工具
  • Toolkit 工具包
  • AgentExecutor 代理执行器


接下来我们做逐一介绍。

Agent


Agent 由一个语言模型和一个提示词驱动,决定下一步要采取什么措施的类。
提示词可以包括以下内容:

  • 代理的个性(用于使其以特定方式回应)
  • 代理的背景(用于为其提供更多关于所要执行任务类型的上下文信息)
  • 引导策略(用于激发更好的推理能力)


LangChain 提供了不同类型的代理:

Zero-shot ReAct


利用 ReAct 框架根据工具的描述来决定使用哪个工具,可以使用多个工具,但需要为每个工具提供描述信息。
工具的选择单纯依靠工具的描述信息。
关于 ReAct 框架的更多信息,请参考 ReAct。

Structured Input ReAct


相较于单一字符串作为输入的代理,该类型的代理可以通过工具的参数schema创建结构化的动作输入。

OpenAI Functions


该类型的代理用来与OpenAI Function Call机制配合工作。

Conversational


这类代理专为对话场景设计,使用具有对话性的提示词,利用 ReAct 框架选择工具,并利用记忆功能来保存对话历史。


这类代理利用工具查找问题的事实性答案。

ReAct document store


利用 ReAct 框架与文档存储进行交互,使用时需要提供 Search 工具和 Lookup 工具,分别用于搜索文档和在最近找到的文档中查找术语。

Plan-and-execute agents


代理规划要做的事情,然后执行子任务来达到目标。

这里我们多次提到 “工具”,也就是 Tool,接下来我们就介绍什么是 Tool

Tool


Tool 工具,是代理调用的功能,通常用来与外部世界交互,比如维基百科搜索,资料库访问等。
LangChain 内置的工具列表,请参考 Tools。

Toolkit


通常,在达成特定目标时,需要使用一组工具。
LangChain 提供了 Toolkit 工具包的概念,将多个工具组合在一起。

AgentExecutor


代理执行器是代理的运行时。
程序运行中,由它来调用代理并执行其选择的动作。

组件实例

Tool


LangChain 提供了一系列工具,比如 Search 工具,AWS 工具,Wikipedia 工具等。
这些工具都是 BaseTool 的子类。
通过调用 run 函数,执行工具的功能。
我们以 LangChain 内置的工具 DuckDuckGoSearchRun 为例,来看看如何使用工具。

注:要使用DuckDuckGoSearchRun工具,需要安装以下python包:

 
  1. pip install duckduckgo-search

1. 通过工具类创建工具实例


该类提供了通过 DuckDuckGo 搜索引擎搜索的功能。

 
  1. from langchain.tools import DuckDuckGoSearchRun
  2. search = DuckDuckGoSearchRun()
  3. search.run("Who is winner of FIFA worldcup 2018?")


你应该期望如下输出:

注:限于篇幅,这里对模型的回答文本在本讲中做了截取。

2. 通过辅助函数 load_tools 加载


LangChain 提供了函数 load_tools 基于工具名称加载工具。
先来看看DuckDuckGoSearchRun类的定义:

 
  1. class DuckDuckGoSearchRun(BaseTool):
  2. """Tool that adds the capability to query the DuckDuckGo search API."""
  3. name = "duckduckgo_search"
  4. description = (
  5. "A wrapper around DuckDuckGo Search. "
  6. "Useful for when you need to answer questions about current events. "
  7. "Input should be a search query."
  8. )


name 变量定义了工具的名称。
这正是我们使用 load_tools 函数加载工具时所需要的。
当然,目前比较棘手的是,load_tools 的实现对工具名称做了映射,因此并不是所有工具都如实使用工具类中定义的 name
比如,DuckDuckGoSearchRun 的名称是 duckduckgo_search,但是 load_tools 函数需要使用 ddg-search 来加载该工具。

请参考源代码 load_tools.py 了解工具数据初始化的详情。


用法

 
  1. from langchain.agents import load_tools
  2. tools = load_tools(['ddg-search'])
  3. search = tools[0]
  4. search.run("Who is winner of FIFA worldcup 2018?")


你应该期望与方法1类似的输出。


最后,分享一个辅助函数 get_all_tool_names,用于获取所有工具的名称。

 
  1. from langchain.agents import get_all_tool_names
  2. get_all_tool_names()


当前 LangChain 版本 0.0.235 中,我们应该能看到如下列表:

Agent


Agent 通常需要 Tool 配合工作,因此我们将 Agent 实例放在 Tool 之后。
我们以 Zero-shot ReAct 类型的 Agent 为例,来看看如何使用。代码如下:

 
  1. from langchain.agents import load_tools
  2. from langchain.agents import initialize_agent
  3. from langchain.agents import AgentType
  4. from langchain.llms import OpenAI
  5. import os
  6. os.environ['OPENAI_API_KEY'] = "您的有效openai api key"
  7. llm = OpenAI(temperature=0)
  8. tools = load_tools(["ddg-search", "llm-math"], llm=llm)
  9. agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
  10. agent.run("What is the height difference between Eiffel Tower and Taiwan 101 Tower?")


代码解释:

参考 initialize_agent 的实现,我们会看到它返回的是 AgentExecutor 类型的实例。
这也是代理执行器的常见用法。
请前往源代码 initialize.py 了解更多初始化代理执行器的详情。

 
  1. def initialize_agent(
  2. tools: Sequence[BaseTool],
  3. llm: BaseLanguageModel,
  4. agent: Optional[AgentType] = None,
  5. callback_manager: Optional[BaseCallbackManager] = None,
  6. agent_path: Optional[str] = None,
  7. agent_kwargs: Optional[dict] = None,
  8. *,
  9. tags: Optional[Sequence[str]] = None,
  10. **kwargs: Any,
  11. ) -> AgentExecutor:
  12. """Load an agent executor given tools and LLM.


你应该期望如下输出:

总结


本节课程中,我们学习了什么是 Agent 代理,Tool 工具,以及 AgentExecutor 代理执行器,并学习了它们的基本用法。下一讲我们将学习 Callback 回调。
本节课程的完整示例代码,请参考 08_Agents.ipynb。

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

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

相关文章

【算法与数据结构】前言

算法与数据结构是OI中不可或缺的一部分。 今天,让我们走进算法与数据结构独特世界。 性能 算法与数据结构都是完成任务的方法。 方法就要有性能。 有性能就有描述性能的语言。 这就是复杂度。 复杂度的描述 由于复杂度描述的是大致性能,所以采用的是…

cesium雷达扫描(模糊圆效果)

cesium雷达扫描(模糊圆效果) 1、实现思路 使用ellipse方法加载圆型,修改ellipse中‘material’方法重写自己的glsl来实现当前效果 1、示例源码 index.html <!DOCTYPE html> <html lang="en"><head><!<

场景交互与场景漫游-场景漫游器(6)

场景漫游 在浏览整个三维场景时&#xff0c;矩阵变换是非常关键的&#xff0c;通过适当的矩阵变换可以获得各种移动或者渲染效果。因此&#xff0c;在编写自己的场景漫游操作器时&#xff0c;如何作出符合逻辑的矩阵操作器是非常重要的&#xff0c;但这对初学者来说还是有一定难…

Java集合大总结——List的简单使用

List简单介绍 鉴于Java中数组用来存储数据的局限性&#xff0c;我们通常使用java.util.List替代数组List集合类中元素有序、且可重复&#xff0c;集合中的每个元素都有其对应的顺序索引。JDK API中List接口的实现类常用的有&#xff1a;ArrayList、LinkedList和Vector。 List…

【腾讯云云上实验室-向量数据库】TAI时代的数据枢纽-向量数据库 VectorDB

一、向量数据库的发展历程和时代机遇 回顾向量数据库的发展历程&#xff1a; 2012年开始&#xff0c;深度神经网络的发展催生了向量数据库的发展&#xff1b;2015年至2016年&#xff0c;Google和微软发布了标志性的论文&#xff1b;2017年&#xff0c;Facebook开源了Faiss框架…

生物信息基础:实用Git命令,掌握这些就够了

我发现有搞了几年生信的朋友还不会用Github管理代码&#xff0c;这不免令人意外。我一直强调基础知识的重要性&#xff0c;而这些知识又是可以在短时间内掌握的。Github管理平时写的代码&#xff0c;要用到Git命令。虽然官方Git命令非常多&#xff0c;但我们只要掌握常用的几个…

DRF统一返回格式

DRF中如何统一返回格式 目前在在给科室网站定义DRF的时候&#xff0c;遇到这样的一个问题&#xff0c;就是DRF的原生返回的式样是多样的&#xff0c;例如在访问成功的时候会返回这样的数据{“access”:fkasjfkljgkljgklsjgksjlksjfkljslfjs},但是在序列化器错误的时候&#xf…

PyTorch微调终极指南2:提升模型的准确性

作为一名机器学习从业者&#xff0c;你可能经常会发现自己处于这样一种情况&#xff1a;你正在针对特定任务微调预先训练的模型&#xff0c;但已经达到了无法进一步提高模型准确性的地步。 在本文中&#xff0c;我们将探讨可用于提高模型准确性的各种技术和策略。 这些方法旨在…

Python武器库开发-flask篇之session与cookie(二十六)

flask篇之session与cookie(二十六) 在 Flask 中&#xff0c;可以使用 session 来在不同请求之间存储和传递数据。Session 在客户端和服务器端之间交换&#xff0c;但是数据存储在服务器端。 Session 与 Cookie 的区别 session 和 cookie 都可以用来在不同请求之间存储和传递…

Spring底层原理学习笔记--第十一讲--(aop之proxy增强-jdk及aop之proxy增强-cglib)

AOP实现之proxy 1.jdk动态代理实现及要点 2.cglib代理实现及要点 invoke与invokeSuper区别 jdk动态代理实现及要点 package com.lucifer.itheima.a12;import java.lang.reflect.Proxy;public class JdkProxyDemo {interface Foo{void foo();}//该类可以设置成final类型 //j…

Vue3-readonly(深只读) 与 shallowReadonly(浅只读)

Vue3-readonly(深只读) 与 shallowReadonly&#xff08;浅只读&#xff09; readonly(深只读)&#xff1a;具有响应式对象中所有的属性&#xff0c;其所有值都是只读且不可修改的。shallowReadonly(浅只读)&#xff1a;具有响应式对象的第一层属性值是只读且不可修改的&#x…

使用requests库进行网络爬虫:IP请求错误的解决方法

目录 引言 一、了解requests库 二、遇到的问题 三、解决方法 1、随机化IP地址 2、减少请求频率 3、使用User Agent模拟浏览器行为 4、使用Cookies 四、注意事项 五、使用代理池 六、总结 引言 在利用Python的requests库进行网络爬虫操作时&#xff0c;我们有时会遇…

系列七、JVM的内存结构【堆(Heap)】

一、概述 一个JVM实例只存在一个堆内存&#xff0c;堆内存的大小是可以手动调节的。类加载器读取了类文件后&#xff0c;需要把类、方法、常变量放到堆内存中&#xff0c;保存所有引用类型的真实信息&#xff0c;以方便执行器执行&#xff0c;堆内存分为三个部分&#xff0c;即…

给openlab搭建web网站

1.作业的要求 2.访问www.openlab.com网站 2.1先准备好相关的包和关闭防火墙等操作 mount /dev/sr0 /mnt/ //先挂载 yum install httpd -y //下载htppd systemctl stop firewalld //关闭防火墙 setenforce 02.2然后开始配置文件和仓库 这一步比较关键,之前改了接口…

【OpenCV实现图像:OpenCV进行OCR字符分割】

文章目录 概要基本概念读入图像图像二值化小结 概要 在处理OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;时&#xff0c;利用传统的图像处理方法进行字符切分仍然是一种有效的途径。即便当前计算机视觉领域主导的是卷积神经网络&#xf…

JavaScript垃圾回收机制解析

JavaScript是一种动态语言&#xff0c;拥有自动内存管理。这意味着开发人员不需要手动分配和释放内存。在JavaScript中&#xff0c;垃圾回收器会自动处理不再需要使用的内存&#xff0c;以便重新利用。 1. 标记清除算法 JavaScript使用标记清除算法作为主要的垃圾回收机制。该…

DAO和增删改查通用方法-BasicDao

文章目录 一、BasicDao是什么&#xff1f;二、BasicDao分析三、BasicDao实现&#xff08;1&#xff09;BasicDao&#xff08;2&#xff09;ActorDao&#xff08;3&#xff09;TestDao 四、总结 一、BasicDao是什么&#xff1f; BasicDao:基础的数据对象&#xff0c;可以完成通用…

asp.net智能考试系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 智能考试系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 系统运行视频 https://www.bilibili.com/video/BV1gz4y1A7Qp/ 二、功能介绍 本系统使用Microsoft Visual Studio 201…

掌握键盘快捷键,在没有鼠标的情况下,也还是可以做到游刃有余,甚至可以用数字键来代替鼠标

键盘和鼠标是与计算机交互的重要外围设备。有些人可能会争辩说,你只需要这些设备中的一个,但事实上,只使用其中一个设备的电脑可能非常困难。但是,如果你的鼠标或笔记本电脑的触控板突然停止工作,而你无法修复它或无法使用备用鼠标,该怎么办? 在这种情况下,你可以使用…

树莓派4b编译FFmpeg支持硬件编解码

ffmpeg h264_omx解码器充分发挥树莓派gpu性能 准备 树莓派4b ,64位系统 修改树莓派的启动设置文件(/boot/config.txt)进行如下的调整: gpu_mem=256 framebuffer_depth=16安装依赖 常规依赖: sudo apt update sudo apt upgrade sudo apt -y install autoconf automake …