langchain构建一个 Agent 的过程

构建一个 Agent 的过程

概述

在使用大型语言模型(LLM)时,语言模型本身无法直接采取行动,只能输出文本。LangChain 的一个重要用例是创建代理(Agents)。代理是使用 LLM 作为推理引擎的系统,用于确定应采取哪些行动以及这些行动的输入应该是什么。然后,这些行动的结果可以反馈给代理,它会确定是否需要更多行动,或者是否可以结束。

在这个教程中,我们将构建一个可以与多种不同工具进行交互的代理:一个是本地数据库,另一个是搜索引擎。您将能够向这个代理提问,观察它调用工具,并与它进行对话。

构建代理所需的概念
  • 使用语言模型,特别是它们的工具调用能力
  • 创建一个检索器,以向我们的代理公开特定信息
  • 使用搜索工具在线查找事物
  • 使用 Chat History,使聊天机器人能够“记住”过去的互动,并在回答后续问题时加以考虑
  • 使用 LangSmith 调试和跟踪您的应用程序

步骤详解

1. 设置和安装

首先,确保您已安装 LangChain,并设置好 LangSmith 环境变量以记录跟踪:

pip install langchain

在 Jupyter Notebook 中:

import getpass
import osos.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
2. 定义工具

我们需要创建一些工具供代理使用。在这里,我们将使用 Tavily 搜索引擎和本地检索器。

Tavily 搜索工具

from langchain_community.tools.tavily_search import TavilySearchResultssearch = TavilySearchResults(max_results=2)

本地检索器

from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitterloader = WebBaseLoader("https://docs.smith.langchain.com/overview")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200
).split_documents(docs)
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(retriever,"langsmith_search","Search for information about LangSmith. For any questions about LangSmith, you must use this tool!",
)tools = [search, retriever_tool]
3. 使用语言模型

选择一个语言模型并绑定工具:

from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4")
model_with_tools = model.bind_tools(tools)

测试工具调用:

from langchain_core.messages import HumanMessageresponse = model_with_tools.invoke([HumanMessage(content="What's the weather in SF?")])
print(f"ContentString: {response.content}")
print(f"ToolCalls: {response.tool_calls}")
4. 创建代理

定义提示并创建代理:

from langchain import hubprompt = hub.pull("hwchase17/openai-functions-agent")from langchain.agents import create_tool_calling_agentagent = create_tool_calling_agent(model, tools, prompt)
5. 创建 AgentExecutor 并运行代理
from langchain.agents import AgentExecutoragent_executor = AgentExecutor(agent=agent, tools=tools)response = agent_executor.invoke({"input": "hi!"})
print(response)response = agent_executor.invoke({"input": "how can langsmith help with testing?"})
print(response)response = agent_executor.invoke({"input": "whats the weather in sf?"})
print(response)
6. 添加内存

使代理具有记忆功能:

agent_executor.invoke({"input": "hi! my name is bob", "chat_history": []})from langchain_core.messages import AIMessage, HumanMessageresponse = agent_executor.invoke({"chat_history": [HumanMessage(content="hi! my name is bob"),AIMessage(content="Hello Bob! How can I assist you today?"),],"input": "what's my name?",}
)
print(response)from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistorystore = {}def get_session_history(session_id: str) -> BaseChatMessageHistory:if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]agent_with_chat_history = RunnableWithMessageHistory(agent_executor,get_session_history,input_messages_key="input",history_messages_key="chat_history",
)response = agent_with_chat_history.invoke({"input": "hi! I'm bob"},config={"configurable": {"session_id": "<foo>"}},
)
print(response)response = agent_with_chat_history.invoke({"input": "what's my name?"},config={"configurable": {"session_id": "<foo>"}},
)
print(response)

通过上述步骤,您可以构建一个能够与多种工具交互的代理,并具备记忆功能。代理可以通过调用工具来处理复杂的任务,并能够记住先前的交互,以便在后续问题中做出更加智能的响应。

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

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

相关文章

运用selenium爬取京东商品数据储存到MySQL数据库中

使用Selenium爬取京东商品数据并存储到MySQL数据库中的过程可以分为几个步骤&#xff1a; 1. 准备工作 安装所需库 确保你已经安装了Python环境以及以下库&#xff1a; selenium&#xff1a;用于自动化浏览器操作。pymysql 或 mysql-connector-python&#xff1a;用于连接M…

在MongoDB中,您可以通过以下步骤来创建账号密码,并限制其在特定数据库上的访问权限

在MongoDB中&#xff0c;您可以通过以下步骤来创建账号密码&#xff0c;并限制其在特定数据库上的访问权限&#xff1a; 连接到MongoDB数据库&#xff1a; 使用MongoDB的客户端&#xff08;如mongo shell或者MongoDB Compass&#xff09;连接到MongoDB服务器。 切换到admin数…

【TensorFlow深度学习】池化层的功能与类型详解

池化层的功能与类型详解 池化层的功能与类型&#xff1a;深度学习中的维度缩减与特征抽取艺术概述主要的池化类型结语 池化层的功能与类型&#xff1a;深度学习中的维度缩减与特征抽取艺术 在深度神经网络架构中&#xff0c;池化层&#xff08;Pooling Layer&#xff09;是一个…

实验报告 GUI窗体和标签

实验目的&#xff1a; 理解AWT和Swing工具包 掌握窗体和组件的创建方法。 实验要求&#xff1a; &#xff08;1&#xff09;掌握创建GUI窗体的操作 &#xff08;2&#xff09;掌握标签的使用 &#xff08;3&#xff09;代码应遵循Java编程规范&#xff0c;包含恰当的注释…

Kotlin 嵌套类和内部类

文章目录 嵌套类内部类 嵌套类 在类的内部可以定义其他的类&#xff0c;这是类结构上的嵌套&#xff08;Nested&#xff09;。 class Container {val name "Container"class NestedClass {fun getter() {// 此时无法访问外部类的成员// name}} }Note&#xff1a;接…

源码分析の前言

源码分析路线图&#xff1a; 初级部分&#xff1a;ArrayList->LinkedList->Vector->HashMap(红黑树数据结构&#xff0c;如何翻转&#xff0c;变色&#xff0c;手写红黑树)->ConcurrentHashMap 中级部分&#xff1a;Spring->Spring MVC->Spring Boot->M…

用Python装饰器打造强大的日志系统

用Python装饰器打造强大的日志系统 日志记录是软件开发中不可或缺的一部分&#xff0c;它帮助开发者追踪程序的执行过程、调试错误和分析性能。Python提供了多种日志记录工具&#xff0c;但如何将日志记录功能优雅地集成到代码中&#xff0c;是一个值得探讨的问题。本文将介绍如…

机器学习中的神经网络重难点!纯干货(下篇)

纯干货 目录 长短时记忆网络 基本原理 一个示例 自注意力模型 基本原理 自注意力机制 具体步骤 一个案例 生成对抗网络 基本原理 一个案例 长短时记忆网络 LSTM就像一个有记忆的人&#xff0c;可以记住重要的信息并且忘记不重要的。 特别擅长处理长序列数据&#…

网上蛋糕售卖店管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;店员管理&#xff0c;用户管理&#xff0c;商品管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息&#xff0c;商品…

2024医美如何做抖音医美抖音号,本地团购、短视频直播双ip爆品引流,实操落地课

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89307619 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 01-0-序.mp4 02-01-账号定位.mp4 03-02-误区.mp4 04-03-五件套.mp4 05-04-文案怎么来.mp4 06-05-对标怎么弄.mp4 07-06-人设怎…

Go实现阻塞读且并发安全的map

GO里面MAP如何实现key不存在 get操作等待 直到key存在或者超时&#xff0c;保证并发安全&#xff0c;且需要实现以下接口&#xff1a; type sp interface {Out(key string, val interface{}) //存入key /val&#xff0c;如果该key读取的goroutine挂起&#xff0c;则唤醒。此方…

进程与线程(四)

进程与线程&#xff08;四&#xff09; 基于System V IPC对象的进程间通信机制SystemV IPC引入查看Linux系统中IPC工具的方式查看所有IPC工具命令&#xff1a;ipcs 查看指定的IPC工具key值获取方法&#xff1a;ftok()函数 消息队列消息队列的特征&#xff1a;消息队列的操作打开…

处理多对一的映射关系

1、级联属性赋值 Emp实体类中设置Dept 属性并生成get、set方法,生成toString方法,但是构造方法不必包含此属性 在EmpMapper.xml文件中: <resultMap id="empAndDeptResultMapOne" type="Emp"><id property="eid" column="eid…

Python知识点5---字符串的使用

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的字符串在使用上和其他语言的差别不大&#xff0c;常规操作都…

AndroidStudio使用高德地图API获取手机定位

一、高德地图API申请 首先去高德注册开发者账号 下面这两个选项&#xff0c;也是我们项目成功的关键 1.1怎么获取SHA1指纹密码 ①使用AS自带的签名文件 你的用户文件下面会有一个.android文件夹,进入文件夹,在这个路径下打开cmd 如果.android下面没有签名文件参考创建文章 …

挂载SMB和NFS共享目录

挂载SMB共享目录//192.168.3.191/OMV&#xff1a; ubuntu需要安装cifs工具&#xff1a; sudo apt install cifs-utils sudo mount.cifs //192.168.3.191/OMV /mnt -o usersamba,passsamba “samba”用户需要是一个samba用户&#xff0c;并且有访问OMV目录的权限。 挂载NFS共…

fastjson TypeReference 泛型类型(详解)

系列文章目录 附属文件一&#xff1a;fastjson 泛型转换问题&#xff08;详解&#xff09; 文章目录 系列文章目录一、简介二、构造方法1. 无参构造方法2. 有参构造方法 一、简介 com.alibaba.fastjson.TypeReference 即类型引用&#xff0c;用于指定我们使用 com.alibaba.fa…

Win10安装TensorRT

目录 什么是TensorRT 下载TensorRT 安装TensorRT 拷贝文件 安装whl文件 验证是否安装成功 什么是TensorRT TensorRT是由Nvidia推出的C语言开发的高性能神经网络推理库&#xff0c;是一个用于生成部署的优化器和运行时引擎。和cudnn类似&#xff0c;但它不支持训练&#xff…

开源与闭源 AI 模型:发展路径的比较与前瞻

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Git系列:rev-parse 使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…