Lazy loaded image
🧑‍🔧支持联网检索、连接本地知识库的问答Agent智能体创建 | 🦜️🔗 LangChain
Words 3830Read Time 10 min
2024-6-1
2024-12-31
type
status
date
slug
summary
tags
category
icon
password
comment
Status
 
大语言模型本身不能采取任何动作,只能输出文本。然而,它们可以被用于智能体系统,作为推理引擎来确定什么动作需要被采取以及如何输入这些动作。动作的结果可以反馈给智能体,使其能够判断是否需要进一步的动作,或者是否可以结束。
LangChain的一个重要使用场景就是创建agent(智能体)系统。

概念

涉及的核心概念:
  • 智能体:大语言模型智能体是一种利用大语言模型(LLM)进行复杂任务执行的应用。它们通过结合大语言模型与关键模块,如规划、记忆、调用工具,来执行任务。这些智能体能够理解语言、生成文本、执行指令,并与环境进行交互。
notion image
  • LLM:使用语言模型,特别是它们的工具调用能力。
  • Retriever:创建一个检索器,以向我们的智能体提供特定信息。
  • Tool:使用一个搜索工具在线查找东西。
  • LangGraph:使用LangGraph智能体,它使用LLM来考虑要做什么,然后执行它。
  • LangSmith:使用LangSmith来调试和追踪您的应用程序
    • notion image

启动

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 之前的对话历史就没有记忆了。

总结

这就是本视频的全部内容了。在这个视频中,我们讲解了如何创建一个具有使用工具、规划动作、记忆对话能力的简单智能体。然后我们还展示了如何返回智能体的响应!
 
官网地址:
上一篇
从零开始实现高效数据检索
下一篇
核心概念 | 🦜️🔗 LangChain