人工智能学习与实训笔记(十四):Langchain Agent

0、概要

Agent是干什么的? Agent的核心思想是使用语言模型(LLM)作为推理的大脑,以制定解决问题的计划、借助工具实施动作。在agents中几个关键组件如下:

  • Agent:制定计划和思考下一步需要采取的行动。
  • Tools:解决问题的工具
  • Toolkits:用于完成特定目标所需的工具组。一个toolkit通常包含3-5个工具。
  • AgentExecutor:AgentExecutor是agent的运行时环境。这是实际调用agent并执行其选择的动作的部分。

1、Agent整体架构

代理(Agents)涉及LLM做出决策以确定要采取哪些行动,执行该行动,查看观察结果并重复执行步骤直到完成。LangChain为代理提供了标准接口,一系列可供选择的代理和端到端代理的示例。

在LLM驱动的自主代理系统中,LLM充当代理的大脑,并辅以几个关键功能:

  • 规划
    • 子目标拆解解:agent将大型任务拆解为小型的、可管理的子目标,从而能够高效处理复杂任务。
    • 反思和改进:agent可以从过去的行为中进行自我批评和自我反省。这种从错误中吸取教训,并对未来的步骤进行改进的思维可以有效提高最终结果。真种思维方式来自ReAct,其大致格式为:Thought: ...Action: ...Observation: ... (Repeated many times)。

ReAct

  • 记忆
    • 短期记忆:上下文学习是利用模型的短期记忆来学习的。
    • 长期记忆:通过利用外部向量存储和快速检索,agen可以实现长时间保留和回忆(无限)信息的能力。

  • 工具使用
    • 代理学习调用外部 API 以获取模型权重中缺少的额外信息(通常在预训练后很难更改),包括当前时讯、代码执行能力、对私有信息源的访问等。自然可以自定义工具使用,如本地向量数据库查找。

自定义工具方法

2、langchain中agent实现

langchain中agent有两种主要类型:

  • 动作代理人(Action agents):在每个时间步上,使用所有先前动作的输出决定下一个动作。
  1. 接收用户输入
  2. 决定是否使用任何工具以及工具输入
  3. 调用工具并记录输出(也称为“观察结果”)
  4. 使用工具历史记录、工具输入和观察结果决定下一步
  5. 重复步骤 3-4,直到确定可以直接回应用户
agent types
zero-shot-react-description代理使用ReAct框架,仅基于工具的描述来确定要使用的工具.此代理使用 ReAct 框架确定使用哪个工具 仅基于工具的描述。缺乏 会话式记忆。
conversational-react-description这个代理程序旨在用于对话环境中。提示设计旨在使代理程序有助于对话。 它使用ReAct框架来决定使用哪个工具,并使用内存来记忆先前的对话交互。
react-docstore

这个代理使用ReAct框架,必须提供两个工具:一个Search工具和一个Lookup工具

自问自答,会使用Google搜索工具。
self-askwith-search代理使用一个被命名为Intermediate Answer的工具。根据需要执行搜索和提问步骤,以获得最终答案。
chat-zero-shot-react-descriptionzero-shot意味着代理 (Agents) 仅在当前操作上起作用——它没有 记忆
chat-conversational-react-description该代理被设计用于会话设置。提示的目的是使代理具有帮助和会话性。它使用ReAct框架来决定使用哪个工具,并使用内存来记住以前的会话交互。
structured-chat-zero-shot-react-description能够使用多输入工具,结构化的参数输入。
openai-functions某些OpenAI模型(如gpt-3.5-turbo-0613和gpt-4-0613)已经明确地进行了微调,如果使用这些模型,可以考虑使用OpenAI Functions 的AgentType。
openai-multi-functions某些OpenAI模型(如gpt-3.5-turbo-0613和gpt-4-0613)已经明确地进行了微调,如果使用这些模型,可以考虑使用OpenAI Functions 的AgentType。
  • 计划执行代理人(Plan-and-execute agents):预先决定所有动作的完整顺序,然后按照计划执行,而不更新计划。
  1. 接收用户输入
  2. 规划要执行的全部步骤序列
  3. 按顺序执行步骤,将过去步骤的输出作为未来步骤的输入

动作代理人适用于小任务,而计划执行代理人适用于复杂或长时间运行的任务,这些任务需要保持长期目标和重点。

3、Agent业务实现逻辑

 

demo code:

from langchain.agents import initialize_agent, Tool
from langchain_wenxin.chat_models import ChatWenxin

WENXIN_APP_Key = "你自己的KEY"
WENXIN_APP_SECRET = "用你自己的"
#创建LLMChain的大模型,这里我们用的是文心大模型
llm = ChatWenxin(
    temperature=0.4,
    model="ernie-bot-turbo",
    baidu_api_key = WENXIN_APP_Key,
    baidu_secret_key = WENXIN_APP_SECRET,
    verbose=True,
    )
 
# 模拟问关于订单
def search_order(input:str) ->str:
  return "订单状态:已发货;发货日期:2023-09-15;预计送达时间:2023-09-18"
 
# 模拟问关于推荐产品
def recommend_product(input:str)->str:
  return "红色连衣裙"
 
# 模拟问电商faq
def faq(input:str)->str:
  return "7天无理由退货"
 
# 创建了一个 Tool 对象的数组,把这三个函数分别封装在了三个 Tool 对象里面
# 并且定义了描述,这个 description 就是告诉 AI,这个 Tool 是干什么用的,会根据描述做出选择
tools=[
    Tool(
        name="Search Order",func=search_order,
        description="useful for when you need to answer questions about customers orders"
    ),
    Tool(
        name="Recommend Product",func=recommend_product,
        description="useful for when you need to answer questions about product recommendations"
    ),
    Tool(
        name="FAQ",func=faq,
        description="useful for when you need to answer questions about shopping policies, like return policy, shipping policy, etc."
    ),
]
# 指定使用tools,llm,agent则是zero-shot"零样本分类",不给案例自己推理
# 而 react description,指的是根据你对于 Tool 的描述(description)进行推理(Reasoning)并采取行动(Action)
agent=initialize_agent(tools,llm,agent="zero-shot-react-description", verbose=True)


question = "我想买一件衣服,但是不知道哪个款式好看,你能帮我推荐一下吗?"
result=agent.run(question)
print(result)

result:

Action: Recommend Product
Action Input: 顾客询问衣服款式推荐

Observation: 我将根据顾客的需求和喜好推荐几个款式。

Action: 开始搜索并筛选出几个符合顾客需求的款式。

Observation: 这些款式都是比较受欢迎的,并且符合顾客的喜好。

...

Thought: 我已经找到了几个合适的款式,现在可以给出最终推荐了。

Final Answer: 根据顾客的需求和喜好,我推荐了以下几款衣服,您可以根据自己的喜好进行选择。

Final Answer: 推荐款式为:款式A、款式B和款式C。

Observation: 顾客可以根据我的推荐去选择自己喜欢的款式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H12-821_44

44.如图所示的网络,R1设备配置路由渗透,那么R1设备把Level-2的LSP发送给R3,使R3可以获知全网路由。 A.正确 B.错误 答案:B 注释: 感觉题目描述有两个问题: 1. R3是Level-1-2路由器,本来就可以学习到Level-2的路由。题目中的R3应该…

会声会影支持哪些视频格式 会声会影2024软件下载 会声会影序列号在哪里购买

时常有朋友遇到这样的烦恼,就是从网络上下载下载来的视频,不能够导入到会声会影里面。这到底是怎么回事,到底支持哪些视频格式呢?下面小编将来给大家介绍一下。 还没有下载会声会影2024的朋友可以通过这个链接下载:ht…

mysql 执行update操作 记录未修改

问题 mysql 执行update操作 记录未修改 详细问题 笔者进行SpringBootMybatis项目开发,确认执行update操作 控制台内容如下 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession3cbe9459] was not registered for sync…

【c++】list详细讲解

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉list库 > 毒鸡汤:你的脸上云淡…

OpenAI Sora是世界模型?

初见Sora,我被OpenAI的野心震撼了。 他们不仅想教会AI理解视频,还要让它模拟整个物理世界!这简直是通用人工智能的一大飞跃。 但当我深入了解后,我发现Sora比我想象的更复杂、更强大。 Sora不是简单的创意工具,而是…

【BBuf的CUDA笔记】十四,OpenAI Triton入门笔记二

0x0. 前言 接着【BBuf的CUDA笔记】十三,OpenAI Triton 入门笔记一 继续探索和学习OpenAI Triton。这篇文章来探索使用Triton写LayerNorm/RMSNorm kernel的细节。 之前在 【BBuf的CUDA笔记】十二,LayerNorm/RMSNorm的重计算实现 这篇文章我啃过Apex的La…

Caffeine本地缓存

Caffeine本地缓存 Caffine简介 简单说,Caffine 是一款高性能的本地缓存组件,由下面三幅图可见:不管在并发读、并发写还是并发读写的场景下,Caffeine的性能都大幅领先于其他本地开源缓存组件 常见的缓存淘汰算法 FIFO 它…

电源管理芯片是指在电子设备系统中,负责对电能的变换、分配、检测等进行管理的芯片

萨科微半导体宋仕强介绍说,电源管理芯片是指在电子设备系统中,负责对电能的变换、分配、检测等进行管理的芯片,其性能和可靠性直接影响电子设备的工作效率和使用寿命,是电子设备中的关键器件。萨科微slkor(www.slkormi…

wps使用方法(包括:插入倒三角符号,字母上面加横线,将word中的所有英文设置为time new roman)

倒三角符号 字母上面加横线 将word中的所有英文设置为time new roman ctrla选中全文

人工智能学习与实训笔记(四):神经网络之自然语言处理

目录 六、自然语言处理 6.1 词向量 (Word Embedding) 6.1.1 词向量的生成过程 6.1.2 word2vec介绍 6.1.3 word2vec:skip-gram算法的实现 6.2 句向量 - 情感分析 6.2.1 LSTM (Long Short-Term Memory)介绍 6.2.2 基于飞桨实现的情感分析模型 6.3 BERT 六、自…

使用Taro开发鸿蒙原生应用——快速上手,鸿蒙应用开发指南

导读 本指南为开发者提供了使用 Taro 框架开发鸿蒙原生应用的快速入门方法。Taro,作为一个多端统一开发框架,让开发者能够使用一套代码同时适配多个平台,包括鸿蒙系统。文章将详细介绍如何配置开发环境,以及如何利用 Taro 的特性…

MATLAB知识点:datasample函数(★★☆☆☆)随机抽样的函数,能对矩阵数据进行随机抽样

讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第三…

.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2

前言 很多同学都不愿给电脑设动态壁纸,其中有个重要原因就是嫌它占资源过多。今天大姚分享一个.NET开源、免费(MIT license)的一个小而快并且功能强大的 Windows 动态桌面软件,支持视频和网页动画播放:DreamScene2。 …

Android 车载应用开发之SystemUI 详解

一、SystemUI SystemUI全称System User Interface,直译过来就是系统级用户交互界面,在 Android 系统中由SystemUI负责统一管理整个系统层的 UI,它是一个系统级应用程序(APK),源码在/frameworks/base/packages/目录下,而不是在/packages/目录下,这也说明了SystemUI这个…

【C语言】模拟实现库函数qsort

qsort的头文件是stdlib.h 他的四个参数分别是要进行排序的数组base的首地址,base数组的元素个数,每个元素的大小,以及一个函数指针,这个函数指针指向了一个函数,这个函数的参数是两个void*类型的指针,返回类…

读十堂极简人工智能课笔记04_计算机视觉

1. 仙女蜂 1.1. Megaphragma mymaripenne 1.2. 一种微小的蜂类 1.3. 人类已知第三小的昆虫 1.4. 大脑仅由7400个神经元组成,比大型昆虫的大脑小了好几个数量级 1.5. 微小的身体里没有空间容纳这些神经元,所以在生长的最后阶段,它把每个神…

JDBC查询操作

目录 加载驱动获取连接创建会话发送SQL处理结果关闭资源测试 加载驱动 // 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");获取连接 // 获取连接String url "jdbc:mysql://127.0.0.1:3306/book";String username "root" …

让每次生成的随机数都相同np.random.seed()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 让每次生成的随机数都相同 np.random.seed() 选择题 关于以下代码输出的结果说法正确的是? import numpy as np np.random.seed(0) print(【执行】print(np.random.rand(3))) prin…

[ai笔记9] openAI Sora技术文档引用文献汇总

欢迎来到文思源想的ai空间,这是技术老兵重学ai以及成长思考的第9篇分享! 这篇笔记承接上一篇技术文档的学习,主要是为了做一个记录,记录下openai sora技术介绍文档提到的一些论文,再此特地记录一下! 1 原文…

2024 年 11 款最佳 iPhone 数据恢复软件和应用程序

数据丢失是任何人都无法承受的,因为它对每个人都至关重要。但导致数据丢失的原因有很多,一些常见的原因是意外删除数据、设备被盗、iOS 越狱、硬件损坏、病毒感染等。我们列出了 iOS 的顶级恢复工具,其中包括:将帮助您方便地恢复数…