LangChain开发Agent智能体
《LangChain开发Agent智能体》共 0.4 万字,通篇围绕 LangChain、Agent、检索、prompt 展开,归在「Agent 与工具调用」这一层。
适合要让 AI 真的去干活、不只是陪人聊天的人
目录骨架(7 节)
- 定义工具
- 使用语言模型
- 创建代理程序
- 运行代理
- 添加记忆
- LangSmith
- 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()