type
status
date
slug
summary
tags
category
icon
password
comment
Status
大语言模型本身不能采取任何动作,只能输出文本。然而,它们可以被用于智能体系统,作为推理引擎来确定什么动作需要被采取以及如何输入这些动作。动作的结果可以反馈给智能体,使其能够判断是否需要进一步的动作,或者是否可以结束。
LangChain的一个重要使用场景就是创建agent(智能体)系统。
概念
涉及的核心概念:
- 智能体:大语言模型智能体是一种利用大语言模型(LLM)进行复杂任务执行的应用。它们通过结合大语言模型与关键模块,如规划、记忆、调用工具,来执行任务。这些智能体能够理解语言、生成文本、执行指令,并与环境进行交互。

- LLM:使用语言模型,特别是它们的工具调用能力。
- Retriever:创建一个检索器,以向我们的智能体提供特定信息。
- Tool:使用一个搜索工具在线查找东西。
- LangGraph:使用LangGraph智能体,它使用LLM来考虑要做什么,然后执行它。
- LangSmith:使用LangSmith来调试和追踪您的应用程序

启动
Jupyter Notebook
安装
安装 LangChain:
LangSmith
LangSmith环境配置:
定义工具
首先需要创建需要使用的工具。我们将使用两种工具:Tavily(用于在线搜索)和本地retriever 。
Tavily
LangChain内置了一个工具,可以轻松地使用Tavily搜索引擎作为工具。请注意,这需要一个API密钥 ,注册后每月有免费的额度,足够用于测试学习。
API Key配置
API 调用:
Retriever
我们加载LangChain官网上对LangSmith的介绍页面,并将网页内容创建一个检索器。
API 调用:
现在我们已经创建好了一个retriever的检索器,现在将retriever封装为一个工具可以供智能体正确使用。
API Reference:
create_retriever_tool方法中需要传入三个参数,可执行的工具对象,工具名称和工具的描述。
Tools
现在我们已经创建了两个工具,langchain内置的网页检索工具TavilySearch,和本地向量检索器retriever,我们可以创建智能体可执行的一个工具列表,供接下来的智能体调用。
大模型调用
接下来我们尝试使用大模型调用工具,因为很多国内大模型都已经支持openai的调用接口,这里我们还是使用openai的包。
我们可以通过传入信息列表的方式调用大模型,默认响应格式是一个字符串的内容
API 调用:
接下来我们将上面定义的工具绑定给大模型,使用ChatOpenAI的
.bind_tools
方法,将工具列表 tools
传递给model对象现在我们就可以尝试调用模型,首先问一下不需要工具包的问题。看一下模型如何回答,我们将返回的内容和调用的工具列表打印,可以看到并没有调用任何工具。
我们再尝试输入一个需要调用网页检索工具的问题。
我们可以看到并没有直接输出答案,而是要调用Tavily Search网页检索工具
但是这不是并没有真正调用工具,而是模型告诉我们要调用这个工具,并帮我们封装好了调用工具的接口。为了真正调用,我们要创建我们的智能体。
创建智能体
目前,我们正在使用一个高级接口来构建代理程序,但是LangGraph的好处在于,这个高级接口是由一个低级、高度可控的API支持的,以便您可以修改代理逻辑。
之前我们定义好了工具集和大模型,我们现在来创建一个智能体。可以使用LangGraph去构造智能体,LangGraph的好处是我们可以高度定制智能体发相关逻辑和功能。目前我们先使用封装好的高级接口来构造智能体.
调用
create_tool_calling_executor
的方法传入使用大模型和工具集,我们之所以没有直接使用绑定好工具的大模型,是因为create_tool_calling_executor
这个方法会在内部调用.bind_tools
方法自动绑定工具集。执行智能体
现在我们可以对让智能体执行几个查。注意,就目前而言,这些都是无状态的查询(它不会记住先前的交互)。
First up, let's see how it responds when there's no need to call a tool:
为了确定内部没有工具调用,我们可以查看 LangSmith trace
我们再尝试问一个关于langsmith的问题,看看是否使用本地知识库检索器工具。
可以看到返回的内容包含了用户输入问题、模型调用工具、工具的响应信息,然后模型对知识库返回的相关信息进行加工处理返回的整个流程。
现在尝试询问一个需要调用联网查询工具的问题
检查 LangSmith trace 确保有效执行了联网查询的工具。
流式响应
我们已经看到智能体如何通过
.invoke
调用获得最终的响应。如果代理正在执行多个步骤,这可能需要一段时间。为了显示中间进度,我们可以实时流式返回消息。流式令牌
除了流式返回消息之外,流回令牌也是很有用的。我们可以使用
使用
.astream_events
方法,返回流式信息。注意
.astream_events
方法只能 Python 3.11 以上版本才能调用添加记忆
之前的方法调用,智能体是无状态的,这意味着智能体无法记住之前的交互,为了给智能体添加记忆需要使用checkpointer检查点。
使用SqliteSave的
.from_conn_string
方法,定义一个memory 对象,langchain会将记忆存储到Sqlite中。在构建智能体时,需要传入将memory 作为checkpointer传入。
当我们调用智能体时,必须传入
thread_id
,来让智能体根据id确定对话历史。可以看到,智能体以及记住了我们之前的对话,当我们修改
tread_id
之前的对话历史就没有记忆了。总结
这就是本视频的全部内容了。在这个视频中,我们讲解了如何创建一个具有使用工具、规划动作、记忆对话能力的简单智能体。然后我们还展示了如何返回智能体的响应!
官网地址:
- Author:小灰
- URL:https://blog.opencontent.cn//article/langchain-build-agent
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!