LangChain实战指南:从Agent、RAG到LangGraph构建企业级AI应用
2026/8/5 11:14:22 网站建设 项目流程

1. 先搞清楚 LangChain 这套东西到底在解决什么问题

如果你正在看这篇文章,大概率是听说了 LangChain 能搞 AI 应用,但被 Agent、RAG、MCP、LangGraph 这些词绕晕了,不知道从哪下手。我直接说结论:LangChain 的核心价值,是帮你把大语言模型(LLM)从一个“聊天机器人”变成一个能稳定执行复杂业务流程的“自动化员工”

别被“企业级项目实战”这种词吓到。说白了,就是你想让 AI 不只是回答问题,而是能按你的指令,去查资料、做计算、调接口、写代码、处理文件,并且这些步骤能串起来、有状态、能回溯。这就是 LangChain 要干的事。Agent 是让 AI 自己决定用什么工具;RAG 是让 AI 能回答它“没学过”的知识;MCP 是定义工具的标准接口;LangGraph 是把多个 AI 或工具调用编排成一个有状态的工作流。

一周学完?坦白说,如果你有 Python 基础,一周把核心概念和基础流程跑通,完全可能。但想“吃透”,取决于你用它做什么。这篇文章的目标,就是帮你跳过那些概念空转,直接进入“能用、能调、能排查”的实操状态,把 99% 的弯路,变成几条清晰的检查清单。

2. 环境准备:别在配置上卡一整天

在写第一行 LangChain 代码之前,先把环境理顺。很多“跑不起来”的问题,都出在这里。

2.1 基础环境与依赖

首先,你需要一个能运行 Python 的环境。我强烈建议使用Python 3.10 或 3.11。LangChain 社区对新版本 Python 的跟进很快,但 3.10/3.11 是目前兼容性最广、最稳定的选择。用 Conda 或 venv 创建独立的虚拟环境是必须的,避免包冲突。

核心的安装命令很简单:

pip install langchain langchain-community

但请注意,langchain是一个“元包”,它声明了很多子包作为依赖。在生产环境中,更推荐根据你的需求,精确安装所需的组件,例如:

pip install langchain-core langchain-openai langchain-chroma

这能更好地控制依赖版本。

2.2 大模型接入:钥匙在哪?

LangChain 本身不提供模型,它是个“连接器”。你需要一个 LLM 的 API Key。对于初学者,OpenAI 的 GPT 系列(通过langchain-openai)或 Anthropic 的 Claude(通过langchain-anthropic)是起点最平滑的选择,因为它们的接口稳定,LangChain 集成度最高。

准备好你的 API Key,并设置环境变量:

export OPENAI_API_KEY="your-key-here" # 或者在代码中直接设置

关键点:国内用户需要注意网络连通性。确保你的运行环境能够稳定访问你选择的模型服务商 API。这是后续所有步骤的前提,如果这里不通,后面全是徒劳。

2.3 工具与向量数据库:按需选配

这是最容易让人困惑的地方,感觉什么都要装。其实初期你只需要关注两样:

  1. 一个简单的工具:比如用于数学计算的langchain_experimental.utilities.PythonREPL,或者搜索工具(需要额外 API Key,如 Tavily)。先用一个工具来验证 Agent 能跑通。
  2. 一个本地的向量数据库:如果你要玩 RAG。学习阶段,ChromaDB是最佳选择,因为它无需服务器,内存模式一键启动。
    pip install chromadb
    它的数据可以持久化到磁盘,足够应对 demo 和小型项目。

把环境清单理清楚:

  • Python 3.10+
  • 虚拟环境(Conda/venv)
  • langchain-core,langchain-openai等核心包
  • 有效的 LLM API Key 及网络
  • (可选) ChromaDB
  • (可选) 一个示例工具包

先别想着把所有热搜词对应的包都装上。从最小可运行环境开始。

3. 从 LangChain 到 LangGraph:核心概念落地实操

现在我们来拆解这几个核心概念,并用最简代码说明它们怎么用。

3.1 Agent:让 LLM 学会“用工具”

Agent 不是魔法。它的本质是:LLM + 提示词(决定何时用工具) + 工具列表 + 执行循环

一个最简单的 ReAct 范式 Agent 示例:

from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain.tools import Tool from langchain import hub # 1. 定义工具(一个模拟的计算器) def calculate(expression: str) -> str: """计算一个数学表达式。""" try: return str(eval(expression)) except: return “计算错误” calc_tool = Tool( name=“Calculator”, func=calculate, description=“用于计算数学表达式,例如 ‘(3 + 5) * 2’” ) # 2. 准备 LLM 和提示词 llm = ChatOpenAI(model=“gpt-3.5-turbo”, temperature=0) prompt = hub.pull(“hwchase17/react”) # 从 LangChain Hub 拉取标准 ReAct 提示词 # 3. 创建 Agent 和执行器 agent = create_react_agent(llm, tools=[calc_tool], prompt=prompt) agent_executor = AgentExecutor(agent=agent, tools=[calc_tool], verbose=True) # 4. 运行 result = agent_executor.invoke({“input”: “如果我有17个苹果,吃了5个,又买了3打,我现在总共有多少个苹果?”}) print(result[“output”])

发生了什么?

  1. LLM 看到问题,意识到需要计算。
  2. 它生成一个类似Action: Calculator, Action Input: (17 - 5) + 3*12的思考。
  3. Agent 框架执行工具,得到结果48
  4. 将结果返回给 LLM,LLM 组织最终答案。

关键理解AgentExecutor负责管理这个“思考-行动-观察”的循环。verbose=True会让你看到整个过程,对于调试至关重要。

3.2 RAG:给 LLM 装上“外部知识库”

RAG 的流程比想象中直接:灌文档 -> 切块 -> 存向量 -> 问问题 -> 搜相关块 -> 组合答案

from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_chroma import Chroma from langchain.chains import RetrievalQA # 1. 加载并分割文档 loader = TextLoader(“./my_doc.txt”) # 你的知识文档 documents = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) texts = text_splitter.split_documents(documents) # 2. 嵌入并存入向量库 embeddings = OpenAIEmbeddings() # 需要 OPENAI_API_KEY vectorstore = Chroma.from_documents(documents=texts, embedding=embeddings, persist_directory=“./chroma_db”) retriever = vectorstore.as_retriever() # 3. 创建问答链 llm = ChatOpenAI(model=“gpt-3.5-turbo”, temperature=0) qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type=“stuff”, retriever=retriever) # 4. 提问 answer = qa_chain.invoke({“query”: “根据文档,项目的主要目标是什么?”}) print(answer[“result”])

避坑点

  • 分块大小(chunk_size):不是越大越好。太小丢失上下文,太大检索不准。从 500 开始调整。
  • 嵌入模型:必须与检索时使用的模型一致。这里都用OpenAIEmbeddings
  • 检索器(retriever)as_retriever(search_kwargs={“k”: 4})可以控制返回几个相关块。
  • chain_type“stuff”最简单,把所有检索到的文本塞给 LLM。如果文本很长,考虑“map_reduce”“refine”

RAG 的效果上限,一半取决于你的文档预处理(分块、清洗),另一半取决于检索质量。不要指望把乱七八糟的文档扔进去就能得到完美答案。

3.3 MCP:工具定义的“通用插座”

MCP(Model Context Protocol)可以理解为工具定义的标准化协议。它的目的是让任何符合 MCP 标准的工具,都能轻松接入 LangChain、Claude Desktop 等支持 MCP 的客户端。

你暂时可以不用深入实现 MCP Server。但要知道,当你看到TavilySearchResults这样的工具时,它背后可能就是一个 MCP 兼容的工具。对于开发者,MCP 的意义在于:如果你要提供一个可被 AI 调用的服务(如查询公司内部数据库),按照 MCP 标准来构建,就能获得最广泛的兼容性

现阶段,作为 LangChain 使用者,你更多是消费MCP 工具。例如,通过langchain-mcp-adapters来集成 MCP 工具。

3.4 LangGraph:把任务流“画”出来

这是 LangChain 生态中用于构建有状态、多环节、可循环工作流的库。如果说基础的AgentExecutor是一个自动的思考循环,那么 LangGraph 就是让你能手动设计这个循环的蓝图,支持更复杂的拓扑结构(分支、并行、循环)。

一个超级简单的“审批流程”示例:

from typing import TypedDict, Annotated from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI # 1. 定义状态(State) class ApprovalState(TypedDict): application: str review_comment: Annotated[str, “add”] # 这是一个“追加”字段 approved: bool # 2. 定义节点(函数) def reviewer_node(state: ApprovalState): llm = ChatOpenAI(model=“gpt-3.5-turbo”) # 模拟审核逻辑 message = llm.invoke(f“请审核以下申请,给出简要意见:{state[‘application’]}”) return {“review_comment”: message.content} def decision_node(state: ApprovalState): # 根据审核意见做决定(这里简化逻辑) if “符合” in state[“review_comment”]: return {“approved”: True} else: return {“approved”: False} # 3. 构建图 workflow = StateGraph(ApprovalState) workflow.add_node(“reviewer”, reviewer_node) workflow.add_node(“decision”, decision_node) # 4. 设置边(流程走向) workflow.set_entry_point(“reviewer”) workflow.add_edge(“reviewer”, “decision”) workflow.add_edge(“decision”, END) # 5. 编译并运行 app = workflow.compile() initial_state = {“application”: “申请购买一台高性能服务器”, “review_comment”: “”, “approved”: False} result = app.invoke(initial_state) print(f“审核意见:{result[‘review_comment’]}\n是否批准:{result[‘approved’]}”)

LangGraph 的核心思想

  • 状态(State):一个贯穿流程的共享字典。每个节点读取和更新它。
  • 节点(Node):一个普通的函数,处理业务逻辑。
  • 边(Edge):决定下一个执行哪个节点。可以是条件边(add_conditional_edges)。
  • 编译(Compile):把图结构变成一个可执行的Graph对象。

什么时候用 LangGraph?当你的 Agent 需要多个 LLM 调用按特定顺序协作,或者流程中存在“循环”(例如,工具执行结果不满足要求,需要重新思考)时。基础的AgentExecutor已经内置了 ReAct 循环,但 LangGraph 给了你完全的控制权。

4. 企业级实战思维:从 Demo 到可靠系统的关键跨越

能跑通 Demo 只是第一步。要把这些东西用于实际项目,必须转换思维。下面这些点,是新手和老手的核心区别。

4.1 设计模式:不是所有场景都需要 Agent

不要手里有把锤子,看什么都像钉子。

  • 简单检索问答:直接用RetrievalQA链,稳定可控。
  • 固定流程的数据处理:用SequentialChain或自定义Runnable序列。
  • 需要动态决策、使用多种工具:用Agent
  • 复杂、多角色、有状态的长流程:用LangGraph

经验法则:从最简单的链开始,只有当逻辑无法用固定流程表达时,才考虑引入 Agent 的“决策”能力。Agent 的不可预测性和开销(更多 Token、更多调用)都更高。

4.2 稳定性与监控:给 AI 应用装上“仪表盘”

AI 应用的不稳定性主要来自 LLM 输出的随机性和工具调用的失败。

  • 结构化输出:尽可能让 LLM 输出 JSON 等格式,用PydanticOutputParser进行解析和校验。
  • 超时与重试:为工具调用和 LLM 调用设置超时。使用tenacity库实现指数退避重试。
  • Fallback 策略:当主模型(如 GPT-4)调用失败或超时时,自动降级到备用模型(如 GPT-3.5)。
  • 日志与追踪:集成LangSmith。这是 LangChain 官方的监控平台。它能记录每一次链、Agent、工具的调用详情,包括输入、输出、耗时、Token 用量。这是排查“为什么这次回答不对”的终极武器。在代码中加几行配置即可启用。

4.3 性能与成本优化

  • 缓存:对相同的输入,使用InMemoryCacheSQLiteCache缓存 LLM 响应,能极大节省成本和时间。
  • 批处理:对于大量独立的文档处理或问答,使用batchabatch(异步批处理)方法。
  • Token 管理:在构建提示词时,注意上下文长度。对于长文档 RAG,使用能处理长上下文的模型(如 GPT-4 Turbo 128K),或采用Map-Reduce等链类型。
  • 向量检索优化:调整retrieversearch_type(如mmr最大边际相关性搜索可以平衡相关性和多样性)和k值。

4.4 部署与集成

  • API 服务:使用FastAPI将你的 LangChain 应用包装成 HTTP API。注意处理好异步、并发和生命周期。
  • 结构化项目:不要把所有代码写在一个文件里。将工具定义、链/图构建、业务逻辑分层。
    my_agent_project/ ├── tools/ # 自定义工具 ├── chains/ # 各种链 ├── graphs/ # LangGraph 工作流定义 ├── schemas/ # Pydantic 模型 ├── api/ # FastAPI 路由 └── config.py # 配置管理
  • 配置管理:使用pydantic-settings管理 API Key、模型名称等配置,通过环境变量加载。

5. 高频问题与排查清单

当你遇到问题时,按这个顺序查。

5.1 Agent 不动或乱用工具

  • 检查点1:工具描述(description)。LLM 完全靠这个决定是否调用工具。描述必须清晰、准确,包含关键词。例如,一个处理 CSV 的工具,描述里要有“CSV”、“文件”、“读取”、“行”、“列”等词。
  • 检查点2:提示词(prompt)。你是否使用了合适的 Agent 类型(ReAct, OpenAI Tools, etc.)?尝试从hub.pull拉取官方标准提示词作为基线。
  • 检查点3:verbose=True。打开详细输出,看 LLM 的思考过程(Thought)。如果Thought里根本没提工具,说明提示词或工具描述有问题。如果Action错了,说明工具描述不匹配或 LLM 理解偏差。
  • 检查点4:LLM 温度(temperature)。在 Agent 场景下,通常设为0或接近0,以减少随机性,让决策更稳定。

5.2 RAG 答案质量差

  • 检查点1:检索结果。首先单独测试检索器:docs = retriever.get_relevant_documents(“你的问题”)。看看返回的文档块是否真的相关。如果不相关,问题在前段
  • 前段问题排查
    • 文档分块chunk_size是否合适?尝试 200, 500, 1000 进行对比。
    • 嵌入模型:是否使用了强语义理解能力的模型?不同模型效果差异巨大。
    • 检索策略:尝试search_type=“mmr”,并调整fetch_k参数。
  • 后段问题排查:如果检索结果相关,但最终答案不好,问题在后段
    • 提示词:你的RetrievalQA是否使用了自定义提示词来指导 LLM 如何利用上下文?默认提示词可能不够强。
    • 上下文长度:检索到的文本总长度是否超过了 LLM 的上下文窗口?考虑使用chain_type=“map_reduce”
    • LLM 本身能力:尝试换一个更强的模型(如从 gpt-3.5-turbo 切换到 gpt-4)。

5.3 LangGraph 状态流转错误

  • 检查点1:状态(State)Schema。确保每个节点函数读取和写入的字段,都在TypedDict中正确定义。Annotated注解(如add)用于指定字段的更新方式(追加、替换等)。
  • 检查点2:边(Edge)逻辑。条件边(add_conditional_edges)的判断函数必须返回下一个节点的名称或END。用print调试这个判断函数的返回值。
  • 检查点3:可视化。使用app.get_graph().draw_mermaid_png()生成流程图,直观检查你的图结构是否正确。

5.4 通用错误与慢速

  • API Rate Limit/Timeout:这是最常见错误。实现重试机制和降级策略。降低并发请求数。
  • InvalidRequestError(context length):提示词+上下文超长了。优化提示词,减少无关信息,或使用支持更长上下文的模型。
  • 速度慢:首先用 LangSmith 或简单计时,定位是哪个环节慢(LLM 调用、工具调用、检索)。LLM 慢考虑换模型或启用缓存;工具慢优化工具本身;检索慢考虑向量索引优化(如使用 HNSW 索引)。

最后,记住一个核心原则:LangChain 是一个强大的“胶水”框架,但它不解决你工具本身的质量问题,也不解决你提示词设计的问题,更不解决你数据质量的问题。它的价值在于,把这些环节标准化、流程化、可监控化。先用手动流程验证你的想法是通的,再用 LangChain 把它自动化、健壮化。这条路,就走对了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询