使用 LangChain 构建智能体应用
LangChain 是一个强大的框架,支持将外部数据源和计算资源连接到大型语言模型(LLM),从而构建复杂的应用程序。本文将带你从基础的 LLM 链开始,逐步构建检索链、对话检索链,最终实现一个能够自主决定行动的智能体(Agent)。
本文介绍了如何使用 LangChain 构建基于 LLM 的智能体(Agent)。内容涵盖从基础链到检索增强生成(RAG)再到代理的演进过程。重点演示了如何配置本地向量数据库、创建自定义工具(如文档检索和数学计算)、利用 ReAct 模式初始化代理,并展示了单轮问答与多轮对话的实现方式。通过实际代码示例,帮助开发者快速掌握 Agent 的核心逻辑与应用场景,同时补充了生产环境中的稳定性、成本与安全考量。

LangChain 是一个强大的框架,支持将外部数据源和计算资源连接到大型语言模型(LLM),从而构建复杂的应用程序。本文将带你从基础的 LLM 链开始,逐步构建检索链、对话检索链,最终实现一个能够自主决定行动的智能体(Agent)。
最简单的形式是只依赖提示模板中的信息来响应请求。这种模式适合知识固定的场景。
为了处理动态数据,我们可以构建检索链。它先从独立的数据库获取相关数据,再将其注入到提示模板中,增强回答的准确性。
在此基础上添加聊天记录管理,创建对话检索链。这使得 LLM 能够记住上下文,允许用户以自然对话的方式交互。
这是本教程的核心。与预设步骤的链不同,Agent 利用 LLM 的能力来决定下一步该做什么。它可以根据问题类型,自主选择调用工具或生成答案。
一句话概括:Agent(代理)是目前构建智能体的基础架构。
构建 Agent 的首要任务是确定其权限范围,即它可以访问哪些工具(Tools)。在本示例中,我们将配置两个核心工具:
llm-math,用于处理复杂的数值运算。简单来说,当用户询问电影细节时,Agent 会调用检索工具;当涉及计算时,则调用数学工具。
在开始之前,需要确保已安装必要的依赖库,如 langchain-community, faiss-cpu, torch 等。以下是初始化嵌入模型、加载网页数据并构建向量数据库的标准流程。
from langchain_community.document_loaders import WebBaseLoader
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
import torch
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 设置设备:优先使用 GPU (CUDA),其次是 Apple Silicon (MPS),最后是 CPU
EMBEDDING_DEVICE = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
# 初始化嵌入模型
embeddings = HuggingFaceEmbeddings(
model_name='m3e-base',
model_kwargs={'device': EMBEDDING_DEVICE}
)
# 加载外部文档
loader = WebBaseLoader("https://baike.baidu.com/item/%E8%AE%A9%E5%AD%90%E5%BC%B9%E9%A3%9E/5358?fr=ge_ala")
docs = loader.load()
# 文档分块与向量化
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)
# 创建检索器
retriever = vector.as_retriever(search_kwargs={"k": 3})
首先,为刚刚创建的向量检索器封装一个工具接口,使其能被 Agent 识别。
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"rzdf_search",
"搜索有关电影《让子弹飞》的信息。对于任何关于《让子弹飞》的问题,你必须使用此工具!"
)
LangChain 提供了多种内置工具,这里我们加载数学计算工具。
from langchain.agents import load_tools
# 假设 llm 变量已经初始化好
tools = load_tools(['llm-math'], llm=llm)
将自定义工具和内置工具合并,形成 Agent 可用的工具集。
tools.append(retriever_tool)
现在我们可以利用 ReAct(Reasoning + Acting)模式创建代理。ReAct 是一种让模型先推理再行动的框架。
from langchain import hub
from langchain.agents import create_react_agent
from langchain.agents import AgentExecutor
# 拉取内置 Prompt 模板
prompt = hub.pull("hwchase17/react")
# 创建 Agent
agent = create_react_agent(llm, tools, prompt)
# 创建执行器,verbose=True 可打印中间思考过程
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
调用代理处理简单查询。
result = agent_executor.invoke({"input": "让子弹飞的导演是谁"})
print(result["output"])
如果设置了 verbose=True,你会看到完整的思维链(CoT)过程,包括模型如何决定调用哪个工具。
测试 Agent 对数学问题的处理能力。
result = agent_executor.invoke({
"input": "8 的立方根是多少?乘以 13.27,然后减去 5。"
})
print(result["output"])
Agent 同样支持维护上下文记忆。通过传入 chat_history,可以实现连续对话。
from langchain_core.messages import HumanMessage, AIMessage
chat_history = [
HumanMessage(content="让子弹飞是谁导演的"),
AIMessage(content="让子弹飞是姜文导演的。")
]
result = agent_executor.invoke({
"chat_history": chat_history,
"input": "这部电影什么时候上映的?"
})
print(result["output"])
虽然上述代码展示了 Agent 的基础用法,但在实际生产环境中,还需要考虑以下因素:
本文详细介绍了如何使用 LangChain 构建基于 LLM 的智能体。从环境搭建、向量数据库配置,到工具封装、ReAct 模式实现,再到多轮对话管理,涵盖了 Agent 开发的核心链路。掌握这些基础后,你可以进一步探索自定义工具、多 Agent 协作以及更复杂的业务逻辑集成。
未来,随着大模型能力的提升,Agent 将在自动化运维、数据分析、客户服务等领域发挥更大作用。建议开发者在实际项目中不断尝试不同的 Prompt 策略和工具组合,以找到最适合业务场景的解决方案。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online