Agent 与工具调用3976 字

LangChain开发Agent智能体

·全库 427 / 611

《LangChain开发Agent智能体》共 0.4 万字,通篇围绕 LangChain、Agent、检索、prompt 展开,归在「Agent 与工具调用」这一层。

覆盖LangChainAgent检索prompt工具调用视觉

适合要让 AI 真的去干活、不只是陪人聊天的人

目录骨架(7 节)
  1. 定义工具
  2. 使用语言模型
  3. 创建代理程序
  4. 运行代理
  5. 添加记忆
  6. LangSmith
  7. Retriever
目录 · 4 节

示例代码

注:将ppt后缀名改为zip后解压

python版本:3.12.4

创建和运行 Agent

单独来说,语言模型无法采取行动 - 它们只能输出文本。

LangChain 的一个重要用例是创建代理。

代理是使用 LLM 作为推理引擎的系统,用于确定应采取哪些行动以及这些行动的输入应该是什么。

然后可以将这些行动的结果反馈给代理,并确定是否需要更多行动,或者是否可以结束。

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

下面将介绍使用 LangChain 代理进行构建。LangChain 代理适合入门,但在一定程度之后,我们可能希望拥有它们无法提供的灵活性和控制性。要使用更高级的代理,我们建议查看LangGraph

概念

我们将涵盖的概念包括:

  • 使用语言模型,特别是它们的工具调用能力
  • 创建检索器以向我们的代理公开特定信息
  • 使用搜索工具在线查找信息
  • 聊天历史,允许聊天机器人“记住”过去的交互,并在回答后续问题时考虑它们。
  • 使用LangSmith调试和跟踪您的应用程序

安装

要安装 LangChain,请运行:

pip install langchain

LangSmith

使用 LangChain 构建的许多应用程序将包含多个步骤,其中会多次调用 LLM。

随着这些应用程序变得越来越复杂,能够检查链或代理内部发生了什么变得至关重要。

这样做的最佳方式是使用LangSmith。

在上面的链接注册后,请确保设置您的环境变量以开始记录跟踪:

export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."

定义工具

我们首先需要创建我们想要使用的工具。我们将使用两个工具:Tavily(用于在线搜索),然后是我们将创建的本地索引上的检索器。

Tavily

LangChain 中有一个内置工具,可以轻松使用 Tavily 搜索引擎作为工具。

请注意,这需要一个 API 密钥 - 他们有一个免费的层级,但如果您没有或不想创建一个,您可以忽略这一步。

创建 API 密钥后,您需要将其导出为:

export TAVILY_API_KEY="..."
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults(max_results=2)
print(search.invoke("今天上海天气怎么样"))
[{'url': 'http://sh.cma.gov.cn/sh/tqyb/jrtq/', 'content': '上海今天气温度30℃~38℃,偏南风风力4-5级,有多云和雷阵雨的可能。生活气象指数显示,气温高,人体感觉不舒适,不适宜户外活动。'}]

Retriever

Retriever 是 langchain 库中的一个模块,用于检索工具。检索工具的主要用途是从大型文本集合或知识库中找到相关信息。它们通常用于问答系统、对话代理和其他需要从大量文本数据中提取信息的应用程序。

我们还将在自己的一些数据上创建一个Retriever。有关每个步骤的更深入解释,请参阅此教程。

#示例:tools_retriever.py
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader("https://zh.wikipedia.org/wiki/%E7%8C%AB")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(
    #chunk_size 参数在 RecursiveCharacterTextSplitter 中用于指定每个文档块的最大字符数。它的作用主要有以下几个方面:
    #chunk_overlap 参数用于指定每个文档块之间的重叠字符数。这意味着,当文档被拆分成较小的块时,每个块的末尾部分会与下一个块的开头部分有一定数量的重叠字符。
    #第一个块包含字符 1 到 1000。第二个块包含字符 801 到 1800。第三个块包含字符 1601 到 2600。
    chunk_size=1000, chunk_overlap=200
).split_documents(docs)
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求