LangChain之Agent代理(上)

news2024/11/25 15:30:28

LangChain之Agent代理

  • Agent代理
    • 概述
    • 分类
  • Agent的基本使用
    • 准备操作
    • 定义工具
      • 1.Tavily在线搜索
      • 2.创建检索器
      • 3.得到工具列表
    • 初始化大模型
    • 创建Agent
    • 运行Agent
    • 添加记忆

Agent代理

概述

Agent代理的核心思想是使用语言模型来选择要采取的一系列动作。在链中,动作序列是硬编码的。在代理中,语言模型用作推理引擎来确定要采取哪些动作以及按什么顺序进行。

因此,在LangChain中,Agent代理就是使用语言模型作为推理引擎,让模型自主判断、调用工具和决定下一步行动。

Agent代理像是一个多功能接口,能够使用多种工具,并根据用户输入决定调用哪些工具,同时能够将一个工具的输出数据作为另一个工具的输入数据。

分类

根据几个维度对所有可用的代理进行分类:

模型类型:代理适用于那类模型。Chat(接收消息,输出消息)、LLM(接收字符串,输出字符串)

聊天历史: 代理是否支持聊天历史。如果支持,这意味着它可以用作聊天机器人。如果不支持,那么它更适合单一任务。

多输入工具:  代理是否支持具有多个输入的工具。如果一个工具只需要单个输入,那么LLM通常更容易知道如何调用它。

并行函数调用: 让LLM同时调用多个工具可以大大提高代理的效率

所需模型参数: 代理是否需要模型支持任何其他参数。某些代理类型利用了OpenAI 函数调用等功能,这些功能需要其他模型参数。如果不需要,则意味着一切都通过提示完成
代理名称模型类型聊天历史多输入工具并行函数调用所需模型参数描述Agent
OpenAI toolsChattoolsOpenAI将调用单个函数的能力称为 函数,将调用一个或多个函数的能力称为工具。create_openai_tools_agent
OpenAI functionsChatxfunctions使用Op0nAl函数集合的代理。已弃用转而使用OpenAI toolscreate_openai_functions_agent
XML AgentLLMxx某些语言模型(例如 Anthropic 的 Claude)特别擅长推理/编写 XML。create_xml_agent
Structured chatChatx使用结构化工具集的代理create_structured_chat_agent
JSON Chat AgentChatxx代理使用 JSON 来格式化其输出,旨在支持聊天模型。create_json_chat_agent
ReActLLMxx推理和执行,推理后决定调用工具或者根据工具返回结果确定完成任务create_react_agent
Self-ask with searchLLMxxx通过追问和中间答案,引导发现最终答案create_self_ask_with_search_agent

Agent的基本使用

构建一个具有两种工具的代理:一种用于在线查找,另一种用于查找加载到索引中的特定数据。

准备操作

在LangChain中有一个内置的工具,可以方便地使用Tavily搜索引擎作为工具。

访问Tavily(用于在线搜索)注册账号并登录,获取API 密钥

设置OpenAI和TAVILY的API密钥

import os
os.environ["OPENAI_BASE_URL"] = "https://xxx.com/v1"
os.environ["OPENAI_API_KEY"] = "sk-BGFnOL9Q4c99B378Bxxxxxxxxxxxxxxxx13bc437B82c2"
os.environ["TAVILY_API_KEY"] = 'tvly-Scx77cTxxxxxxxxxxxxx3rmxRIM8'

定义工具

首先需要创建想要使用的工具。这里使用两个工具:

Tavily(用于在线搜索)

创建的本地索引的检索器

1.Tavily在线搜索

# 加载所需的库
from langchain_community.tools.tavily_search import TavilySearchResults

# 查询 Tavily 搜索 API 并返回 json 的工具
search = TavilySearchResults()
# 执行查询
res = search.invoke("目前市场上苹果手机15的平均售价是多少?")
print(res)

执行查询结果如下:
在这里插入图片描述

2.创建检索器

根据上述查询结果中的某个URL中,获取一些数据创建一个检索器。

这里使用一个简单的本地向量库FAISS,使用FAISS的CPU版本,需要安装FAISS库:

pip install faiss-cpu
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 加载HTML内容为一个文档对象
loader = WebBaseLoader("https://www.ithome.com/0/718/713.htm")
docs = loader.load()
# 分割文档
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200).split_documents(docs)
# 向量化
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
# 创建检索器
retriever = vector.as_retriever()
# 测试检索结果
print(retriever.get_relevant_documents("iPhone 15平均销售价格是多少?")[1])

检索结果如下:
在这里插入图片描述

3.得到工具列表

from langchain.tools.retriever import create_retriever_tool
# 创建一个工具来检索文档
retriever_tool = create_retriever_tool(
    retriever,
    "iPhone_price_search",
    "搜索有关 iPhone 15 的价格信息。对于iPhone 15的任何问题,您必须使用此工具!",
)

# 创建将在下游使用的工具列表
tools = [search, retriever_tool]

初始化大模型

选择将驱动代理的LLM,为了模型回答更严谨,设置temperature=0

from langchain_openai import ChatOpenAI

# 初始化大模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

创建Agent

这里使用LangChain中一个叫OpenAI functions的代理,然后得到一个AgentExecutor代理执行器。

AgentExecutor是代理执行器,它实际上调用代理,执行其选择的操作,将操作输出传回代理,然后重复。

from langchain import hub

# 获取要使用的提示
prompt = hub.pull("hwchase17/openai-functions-agent")
# 打印Prompt
print(prompt)

# 使用OpenAI functions代理
from langchain.agents import create_openai_functions_agent

# 构建OpenAI函数代理:使用 LLM、提示模板和工具来初始化代理
agent = create_openai_functions_agent(llm, tools, prompt)

from langchain.agents import AgentExecutor
# 将代理与AgentExecutor工具结合起来
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

运行Agent

注意:目前这些都是无状态查询

# 执行代理
agent_executor.invoke({"input": "目前市场上苹果手机15的平均售价是多少?如果我在此基础上加价5%卖出,应该如何定价??"})

执行部分日志记录如下:

> Entering new AgentExecutor chain...

Invoking: `iPhone_price_search` with `{'query': 'iPhone 15 average selling price'}`


苹果 iPhone 15/Pro系列国行价格出炉,5999 元起 - IT之家





根据搜索结果,苹果 iPhone 15 系列的国行价格从 5999 元起售。如果您想在此基础上加价5%,您可以按照以下方式定价:

- iPhone 155999+ 5% = 6298.95- iPhone 15 Plus:6999+ 5% = 7348.95- iPhone 15 Pro:7999+ 5% = 8398.95- iPhone 15 Pro Max:9999+ 5% = 10498.95 元

您可以根据以上价格定价出售您的苹果手机 15 系列产品。希望这可以帮助到您!

> Finished chain.

添加记忆

目前代理是无状态的,这意味着它不记得以前的交互。为了给它记忆,需要传入chat_history

注意:

chat_history是正在使用提示符中的一个变量,因此需要调用它。如果使用不同的提示,可能需要更改变量名称

具体Prompt提示模板内容如下:
在这里插入图片描述
记忆测试:

# 加载所需的库
from langchain_community.tools.tavily_search import TavilySearchResults

# 查询 Tavily 搜索 API 并返回 json 的工具
search = TavilySearchResults()

# 创建将在下游使用的工具列表
tools = [search]

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

from langchain import hub

# 获取要使用的提示
prompt = hub.pull("hwchase17/openai-functions-agent")

# 使用OpenAI functions代理
from langchain.agents import create_openai_functions_agent

# 创建使用 OpenAI 函数调用的代理
agent = create_openai_functions_agent(llm, tools, prompt)

from langchain.agents import AgentExecutor

# 得到代理工具执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 执行代理
# 传入一个空的消息列表给chat_history,因为它是聊天中的第一条消息
res = agent_executor.invoke({"input": "hi! my name is bob", "chat_history": []})
print(res)

from langchain_core.messages import AIMessage, HumanMessage

agent_executor.invoke(
    {
        "chat_history": [
            HumanMessage(content=res['input']),
            AIMessage(content=res['output']),
        ],
        "input": "what's my name?",
    }
)

执行日志如下,代理明显有了记忆

> Entering new AgentExecutor chain...
Hello Bob! How can I assist you today?

> Finished chain.
{'input': 'hi! my name is bob', 'chat_history': [], 'output': 'Hello Bob! How can I assist you today?'}


> Entering new AgentExecutor chain...
Your name is Bob! How can I assist you today, Bob?

> Finished chain.

自动跟踪这些消息,可以将其包装在RunnableWithMessageHistory中

from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

message_history = ChatMessageHistory()

agent_with_chat_history = RunnableWithMessageHistory(
    agent_executor,
    lambda session_id: message_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)

agent_with_chat_history.invoke(
    {"input": "hi! I'm bob"},
    config={"configurable": {"session_id": "<foo>"}},
)

agent_with_chat_history.invoke(
    {"input": "what's my name?"},
    config={"configurable": {"session_id": "<foo>"}},
)

执行日志如下:

> Entering new AgentExecutor chain...
Hello Bob! How can I assist you today?

> Finished chain.


> Entering new AgentExecutor chain...
Your name is Bob! How can I assist you, Bob?

> Finished chain.

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

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

相关文章

IP地址在字符串形式、数字形式和byte数组中的转换

IP地址 ip地址,我们以ipv4为例,字符串形式为:“192.168.0.1”,可以转换成dword类型的数据: on key a {char ipv4AddrStr[16] = "192.168.0.1";//16进制:c0.a8.0.1dword ipv4AddrNum;ipv4AddrNum = ipGetAddressAsNumber(ipv4AddrStr);write("ipv4AddrNu…

Linus Torvalds把控着linux内核开发审核,他去世之后linux内核会怎样?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; Linus Torvalds 是 Linux…

【算法】模拟算法——替换所有的问号(easy)

题解&#xff1a;替换所有的问好(模拟算法) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 纯模拟。从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就⽤ a ~ z 的每⼀个字符去尝试替换即可。 3.参考代码 class Solution { pu…

下载安装nvm,使用nvm管理node.js版本

目录 一、下载安装nvm&#xff08;windows&#xff09; 二、使用nvm管理node.js版本 &#xff08;1&#xff09;nvm命令行 &#xff08;2&#xff09; 使用nvm管理node.js版本 ①查看nvm版本 ②显示活动的node.js版本 ③列出可供下载的node.js版本 ④安装node.js指定版本 ⑤列出…

36个JavaScript特效教程,学完即精通

课程目录 &#x1f9d1;‍&#x1f4bb;36个JavaScript特效教程&#xff0c;学完即精通 &#x1f381;【更多好课】资源仓库&#xff0c;海量资源&#xff0c;无偿分享√ 本站所有素材均来自于互联网&#xff0c;版权属原著所有&#xff0c;如有需要请购买正版。如有侵权&…

【测试】linux快捷指令工具cxtool

简介 登录linux时,我们经常需要重复输入一些指令. 这个工具可以把这些指令预置,需要的时候鼠标一点,会自动按预置的字符敲击键盘,敲击出指令. 下载地址 https://download.csdn.net/download/bandaoyu/89379371 使用方法 1,编辑配置文件&#xff0c;自定义自己的快捷指令。 2…

2024年最具性价比宠物空气净化器推荐!小米、希喂、安德迈真实测评

一款理想的宠物空气净化器应该具备去除浮毛和异味等基本功能&#xff0c;但要找到一款既满足个人需求、性能出色且性价比高的产品&#xff0c;这需要一定的选择技巧。 遗憾的是&#xff0c;许多人在购买时由于对相关术语的不熟悉或缺乏挑选经验&#xff0c;可能会买到不适合自…

资深开发推荐的IDEA 插件

开发如虎添翼 工欲善其事&#xff0c;必先利其器。想要提升编程开发效率&#xff0c;必须选择一款顺手的开发工具&#xff0c;插件不在多&#xff0c;而在精&#xff0c;作为从业10年的程序员&#xff0c;我目前用到这十几个插件&#xff0c;在平时开发&#xff0c;代码review…

一文简述「低代码」到底是什么?

低代码是什么&#xff1f;低代码原理是什么&#xff1f;低代码的组成要素有哪些&#xff1f;低代码应用场景有哪些&#xff1f;低代码的优势是什么&#xff1f;低代码开发平台与传统开发方法的区别&#xff1f;本文是本人和团队从业十年来的经验结晶&#xff0c;全文3000&#…

【stm32/CubeMX、HAL库】swjtu嵌入式实验七 ADC 实验

相关电路与IO引脚 注意&#xff1a;串口打印重定向后使用printf打印需要在keil里勾选 Use MicroLIB &#xff0c;否则会卡住。 参看&#xff1a;https://zhuanlan.zhihu.com/p/565613666 串口重定向&#xff1a; /* USER CODE BEGIN Includes */#include <stdio.h>//…

Django admin后台创建密文密码

Django admin后台创建密文密码 如题现在有一张用户表User # user/models.py from django.db import models from django.contrib.auth.models import AbstractUserclass User(AbstractUser):SEX_CHOICES [(0, 男),(1, 女),]sex models.IntegerField(choicesSEX_CHOICES, de…

Windows环境下 postgresql16 增量备份及恢复

修改postgresql.conf isten_addresses * wal_level replica archive_mode on archive_command copy /V "%p" C:\\backup\\wal_files\\%f 注意写法&#xff0c;这里有大坑 restore_command copy c:\\backup\\wal_files\\%f "%p" recov…

Python 将Word、Excel、PDF、PPT文档转为OFD文档

OFD&#xff08;Open Fixed-layout Document &#xff09;是我国自主制定的一种开放版式文件格式标准。OFD文档具有不易被篡改、格式独立、版式固定等特点&#xff0c;目前常用于政府公文、金融、电子发票等领域。 如果想要通过Python将Office文档&#xff08;如Word、Excel或…

2024盘古石初赛(服务器部分)

赛后总结 这次初赛就有20道服务器部分赛题&#xff0c;做的情况一般&#xff0c;错了5道题这样&#xff0c;主要原因就是出在第二个网站服务器没有重构起来 今天来复现一下 这次的服务器部分我直接用仿真仿起来就开找了 第一台IM前期配置 先把网配置好&#xff0c;然后ssh…

redis(17):什么是布隆过滤器?如何实现布隆过滤器?

1 布隆过滤器介绍 布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它基于位数组和多个哈希函数的原理,可以高效地进行元素的查询,而且占用的空间相对较小,如下图所示: 根据 key 值计算出它的存储位置,然后将此位置标…

YOLOv5训练自定义数据集模型的参数与指令说明

文章目录 一 概述二 准备工作三 参数说明四 训练模型4.1 单 GPU 训练4.2 多 GPU 训练 五 模型评估指令示例1. 单 GPU 训练2. 多 GPU 训练 一 概述 &#x1f4da; 本文档主要记录如何在单台或多台机器上使用单个或多个 GPU 正确训练 YOLOv5 数据集 &#x1f680;。 二 准备工作…

Wireshark抓包后的报文太大,如何拆分?

背景&#xff1a;抓包获取到一个400多兆的网络数据包.pcapng文件&#xff0c;使用wireshark软件可以正常打开。但需要把文件导出为.json文件&#xff0c;从而方便对报文内容做过滤分析。使用wireshark自带的导出功能导出后发现生成的.json文件大小为2G多&#xff0c;使用notepa…

mac安装allure及allure:command not fund问题解决

一、下载 下载连接&#xff1a;https://github.com/allure-framework/allure2/releases 选择任意压缩包进行下载 二、解压 解压后是一个文件夹 三、打开终端 # bash终端 vim ~/.bash_profile # zsh终端 vim ~/.zshrc四、配置环境变量 export PATH/usr/bin:/bin:/usr/sb…

电脑缺失msvcp120.dll要如何解决,学会这七个方法,轻松摆脱困扰

msvcp120.dll 是 Microsoft Visual C 2013 运行时库的一部分&#xff0c;它提供了 C 标准库的实现&#xff0c;使得开发者能够利用丰富的 C 功能来构建复杂的应用程序。这个文件对于使用了 C 标准库的应用程序来说是必不可少的。当这些应用程序运行时&#xff0c;它们会动态链接…

干Java的有4年的工作经验;想转行做labview能行吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;bVIEW和Java都是软件工具&a…