LangChain教程 - 创建智能代理

系列文章索引
LangChain教程 - 系列文章

在本教程中,我们将学习如何使用 LangChain 创建一个能够与搜索引擎交互的智能代理。代理可以通过大语言模型(LLM)作为推理引擎来确定执行的操作和输入,执行这些操作后,再将结果反馈到 LLM 以决定是否需要继续操作或结束对话。

前提条件

本教程假设你已经熟悉以下概念:

  • 聊天模型(Chat Models)
  • 工具(Tools)
  • 代理(Agents)

语言模型本身不能直接执行操作,它们只能生成文本。LangChain 的一个重要用例就是创建代理,代理系统能够使用 LLM 进行推理,确定执行哪些操作以及传递什么输入。然后根据操作结果,代理可以继续决定下一步的动作或结束任务。

最终效果预览

下面的代码段展示了一个完整的代理,它使用 LLM 来决定调用哪些工具,并具备与搜索引擎交互的能力。这是一个多轮对话代理,它还带有对话记忆。

# 导入所需模块
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
from langgraph.checkpoint.memory import MemorySaver
from langgraph.prebuilt import create_react_agent
import getpass
import os# 设置 Tavily API 密钥
os.environ["TAVILY_API_KEY"] = getpass.getpass(prompt="请输入 Tavily API Key: ")# 设置语言模型 API 密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass(prompt="请输入 OpenAI API Key: ")# 创建代理
memory = MemorySaver()
model = ChatOpenAI(model="gpt-4")
search = TavilySearchResults(max_results=2)
tools = [search]
agent_executor = create_react_agent(model, tools, checkpointer=memory)# 使用代理
config = {"configurable": {"thread_id": "abc123"}}
for chunk in agent_executor.stream({"messages": [HumanMessage(content="你好,我是Bob,住在旧金山")]}, config
):print(chunk)print("----")for chunk in agent_executor.stream({"messages": [HumanMessage(content="我住的地方现在天气怎么样?")]}, config
):print(chunk)print("----")

通过上面的代码,你可以使用一个与搜索引擎互动的代理来回答关于天气的问题,并且代理具备记忆对话内容的能力。

安装依赖

为了安装所需的依赖,可以运行以下命令:

pip install -U langchain-community langgraph langchain-anthropic tavily-python langgraph-checkpoint-sqlite langchain-openai

设置 Tavily 搜索工具

我们将在代理中使用 Tavily 作为搜索引擎工具。首先需要获取 API 密钥并设置环境变量:

import getpass
import osos.environ["TAVILY_API_KEY"] = getpass.getpass()

接着,我们可以定义搜索工具:

from langchain_community.tools.tavily_search import TavilySearchResultssearch = TavilySearchResults(max_results=2)
search_results = search.invoke("旧金山的天气怎么样")
print(search_results)

使用语言模型

接下来,我们将配置语言模型来调用这些工具。这里使用的是 ChatOpenAI 提供的 gpt-4 作为语言模型。

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessagemodel = ChatOpenAI(model="gpt-4")response = model.invoke([HumanMessage(content="你好!")])
print(response.content)

可以看到,模型返回了简单的对话内容。接下来,我们将模型与工具结合,使其能够调用 Tavily 搜索工具。

model_with_tools = model.bind_tools([search])response = model_with_tools.invoke([HumanMessage(content="旧金山的天气怎么样?")])
print(response.content)
print(response.tool_calls)

在这里,模型会识别需要调用工具并生成相应的工具调用指令。

创建代理

现在,我们可以使用 LangGraph 来构建这个代理,并结合语言模型和工具:

from langgraph.prebuilt import create_react_agentagent_executor = create_react_agent(model, [search])

我们现在可以通过代理执行一系列查询,并且代理会根据需要调用工具:

response = agent_executor.invoke({"messages": [HumanMessage(content="旧金山的天气怎么样?")]})
print(response["messages"])

代理会根据输入自动判断是否需要调用搜索工具,并返回搜索结果。

实现记忆功能

默认情况下,代理是无状态的(不记得之前的对话)。为了使代理具备记忆能力,我们可以为其添加记忆模块。通过传入 MemorySaver,代理可以记住对话内容:

from langgraph.checkpoint.memory import MemorySavermemory = MemorySaver()
agent_executor = create_react_agent(model, [search], checkpointer=memory)config = {"configurable": {"thread_id": "abc123"}}
response = agent_executor.invoke({"messages": [HumanMessage(content="我叫Bob")], config=config})
print(response["messages"])

代理现在可以记住之前的对话内容,并在后续查询中使用这些记忆。

整体代码

# 导入所需的库
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
from langgraph.checkpoint.memory import MemorySaver
from langgraph.prebuilt import create_react_agent
import getpass
import os# 设置 Tavily API 密钥
os.environ["TAVILY_API_KEY"] = getpass.getpass(prompt="请输入 Tavily API Key: ")# 设置语言模型 API 密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass(prompt="请输入 OpenAI API Key: ")# 初始化记忆模块
memory = MemorySaver()# 初始化语言模型 (gpt-4)
model = ChatOpenAI(model="gpt-4")# 初始化 Tavily 搜索工具
search = TavilySearchResults(max_results=2)# 将工具和模型结合,创建代理
tools = [search]
agent_executor = create_react_agent(model, tools, checkpointer=memory)# 定义对话配置,使用线程 ID 来区分不同的对话上下文
config = {"configurable": {"thread_id": "abc123"}}# 第一次对话:问候并告诉代理你的名字
for chunk in agent_executor.stream({"messages": [HumanMessage(content="你好,我叫Bob,我住在旧金山")]}, config
):print(chunk)print("----")# 第二次对话:询问代理关于当前所在地的天气
for chunk in agent_executor.stream({"messages": [HumanMessage(content="我住的地方现在天气怎么样?")]}, config
):print(chunk)print("----")# 第三次对话:测试代理是否记得你的名字
for chunk in agent_executor.stream({"messages": [HumanMessage(content="你还记得我叫什么吗?")]}, config
):print(chunk)print("----")# 开启一个新的对话上下文(新线程),验证代理是否不记得以前的对话
new_config = {"configurable": {"thread_id": "xyz123"}}
for chunk in agent_executor.stream({"messages": [HumanMessage(content="你知道我叫什么吗?")]}, new_config
):print(chunk)print("----")

结论

通过本教程,我们展示了如何使用 LangChain 构建一个具备工具调用和记忆功能的智能代理。代理可以根据输入的内容自动调用工具,并在需要时记住对话内容。这为构建复杂、多轮对话的智能系统提供了灵活的基础。

如果你想进一步了解代理的高级用法和功能,请查阅 LangGraph 文档,那里有更多教程和深入指南。

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

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

相关文章

Zotero(7.0.5)+123云盘同步空间+Z-library=无限存储文献pdf/epub电子书等资料

选择123云盘作为存储介质的原因 原因1: zotero个人免费空间大小:300M,如果zotero云端也保存文献pdf资料则远远不够 原因2: 百度网盘同步文件空间大小:1G123云盘同步文件空间大小:10G 第一台电脑实施步骤…

Hadoop的一些高频面试题 --- hdfs、mapreduce以及yarn的面试题

文章目录 一、HDFS1、Hadoop的三大组成部分2、本地模式和伪分布模式的区别是什么3、什么是HDFS4、如何单独启动namenode5、hdfs的写入流程6、hdfs的读取流程7、hdfs为什么不能存储小文件8、secondaryNameNode的运行原理9、hadoop集群启动后离开安全模式的条件10、hdfs集群的开机…

如何导入一个Vue并成功运行

注意1:要确保自己已经成功创建了一个Vue项目,创建项目教程在如何创建Vue项目 注意2:以下操作均在VS Code,教程在VS Code安装教程 一、Vue项目导入VS Code 1.点击文件,然后点击将文件添加到工作区 2. 选择自己的vue项…

有女朋友后,怎么养成贤内助?为自己找个好伴侣,为孩子找个好妈妈,为母亲找个好儿媳

有女朋友后,怎么养成贤内助?为自己找个好伴侣,为孩子找个好妈妈,为母亲找个好儿媳 时代背景女生有点作怎么办?大商家族的爱情观 时代背景 一块钱的东西,赋予俩块钱的意义,三块钱卖出去。 用商…

企业急于采用人工智能,忽视了安全强化

对主要云提供商基础设施上托管的资产的安全分析显示,许多公司为了急于构建和部署 AI 应用程序而打开安全漏洞。常见的发现包括对 AI 相关服务使用默认且可能不安全的设置、部署易受攻击的 AI 软件包以及不遵循安全强化指南。 这项分析由 Orca Security 的研究人员进…

Python爬虫使用实例-umei

优美图库 www.umei.cc BV1Ag41137re 1/获取资源 查看网站资源结构 多页,每个item只有一张图 多页,每个item都是一个图集 最大页码 内外层图集均有若干page。 通过尾页按钮确定pageNum: 2/发送请求 response requests.get(urlurl, header…

蓝桥杯【物联网】零基础到国奖之路:十. OLED

蓝桥杯【物联网】零基础到国奖之路:十.OLED 第一节 硬件解读第二节 MDK配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fa7660b81be9407aa19c603561553db0.png)第三节 代码 第一节 硬件解读 OLED硬件知识: 第二节 MDK配置 第三节 代码 include头文件。 编…

Vue3 中组件传递 + css 变量的组合

文章目录 需求效果如下图所示代码逻辑代码参考 需求 开发一个箭头组件&#xff0c;根据父组件传递的 props 来修改 css 的颜色 效果如下图所示 代码逻辑 代码 父组件&#xff1a; <Arrow color"red" />子组件&#xff1a; <template><div class&…

VM-Ubantu中使用vscode头文件报错——解决办法

问题 系统中头文件明明存在但是却报错 解决方法 在报错的文件中点击&#xff0c;shift ctrl p选择Edit Configurations(JSON) 修改文件内容 原文件内容 修改之后的内容 {"configurations": [{"name": "Linux","includePath":…

https加密原理

以为http的数据都是以明文传送&#xff0c;会有很大的安全问题&#xff0c;所以出现的https协议。https就是在http协议的基础上增加了一个安全层&#xff0c;可以对数据进行加密和解密(例如SSL、TLS等)。 https加密解密的原理&#xff1a;证书非对称加密对称加密 在讲解原理前…

你了解system V的ipc底层如何设计的吗?消息队列互相通信的原理是什么呢?是否经常将信号量和信号混淆呢?——问题详解

前言&#xff1a;本节主要讲解消息队列&#xff0c; 信号量的相关知识。 ——博主主要是以能够理解为目的进行讲解&#xff0c; 所以对于接口的使用或者底层原理很少涉及。 主要的讲解思路就是先讨论消息队列的原理&#xff0c; 提一下接口。 然后讲解ipc的设计——这个设计一些…

QT打包--windeployqt执行,运行程序提示缺少库

执行windeployqt.exe D:\Data\code\QtCode\Release\RegularExp\RegularExp.exe 生成相应的dll动态库 执行RegularExp.exe&#xff0c;出错&#xff1a;“由于找不到libgcc_s_seh-1.dll…” 找到安装的qt对应的libgcc_s_seh-1.dll拷贝到RegularExp.exe同级目录下&#xff0c; 执…

Qt 窗口事件机制

在 Qt 开发中&#xff0c;窗口的关闭、隐藏、显示等事件是常见且重要的功能。不同的事件触发条件、处理方式不同&#xff0c;了解和掌握这些事件有助于我们更好地控制窗口行为。本文将详细讲解这些事件的使用方法&#xff0c;并通过代码实例来展示其应用。 1. done(int r) — 关…

嵌入式C语言自我修养:GNU C编译器扩展语法精讲

在Linux内核的源码中&#xff0c;你会发现许多这样的“奇特”代码。它们看起来可能有点陌生&#xff0c;但它们实际上是C语言的一种扩展形式&#xff0c;这种扩展在C语言的标准教材中往往不会提及。这就是为什么你在阅读Linux驱动代码或内核源码时&#xff0c;可能会感到既熟悉…

写一下线性表

如果你是c语言, "不会"c, 那么... 把iostream当成stdio.h 把cout当成printf, 不用管啥类型, 变量名字一给输出完事 把cin>>当成scanf, 变量名字一给输入完事 把endl当成\n, 换行. 哦对了, malloc已经不建议使用了, 现在使用new, 把new当作malloc, 把delete当…

【工具变量】科技金融试点城市DID数据集(2000-2023年)

时间跨度&#xff1a;2000-2023年数据范围&#xff1a;286个地级市包含指标&#xff1a; year city treat post DID&#xff08;treat*post&#xff09; 样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff1a; 参考文献-pdf格式&#xff1a;https://…

【JVM】概述

前言 Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java类库、Java编程语言及许许多多的第三方Java框架&#xff08;如Spring、MyBatis等&#xff09;构成。在国内&#xff0c;有关Java类库API、Java语言语法及第三方框架的技术资料和书籍非常丰富&…

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 蜗牛兼职网结构图&#xff0c;如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘

抖音短视频矩阵系统OEM源码开发注意事项,功能开发细节流程全揭秘 在当今数字化时代背景下&#xff0c;短视频产业正经历前所未有的快速发展。其中&#xff0c;抖音凭借其创新的算法及多元内容生态获得巨大成功&#xff0c;吸引了众多用户。对于意欲进入短视频领域的创业者而言&…

移动技术开发:ListView水果列表

1 实验名称 ListView水果列表 2 实验目的 掌握自定义ListView控件的实现方法 3 实验源代码 布局文件代码&#xff1a; activity_main.xml: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.androi…