最近不少读者问我:LangChain 版本更新这么快,社区资料又杂,到底该怎么学才不踩坑?
这个问题问得很实在。我见过不少团队把 LangChain 当成“调用大模型的 HTTP 封装”来用,结果项目一复杂就发现到处都是坑:Prompt 拼装混乱、工具调用不稳定、RAG 检索结果差、Agent 经常陷入死循环。问题出在哪?大部分时候不是大模型不行,而是没理解 LangChain 的编排逻辑。
这篇教程我会从示例代码出发,讲清楚 LangChain 里最核心的几个概念,再落到可运行的企业项目实战思路。内容包括:Core 核心组件、LCEL 表达式语言、RAG 知识库问答、ReAct 模式与 Agent 中间件、MapReduce 长文本处理,以及 2025 年绕不开的 MCP 协议。
阅读之前先给你一个明确判断:LangChain 不是一个“模型调用工具”,而是一个“大模型应用编排框架”。你的学习重点应该放在 Chain(链)、Agent(代理)、Memory(记忆)、RAG(检索增强)这几个工程抽象上,而不是某个模型的 API 怎么调。
这篇文章适合哪些人?
- 已经会调用大模型 API,但不知道怎么把 Prompt、知识库、外部工具组装成完整应用的开发者。
- 正在做或准备做 RAG 知识库问答,但效果不理想,想系统梳理流程的人。
- 想理解 Agent 和 ReAct 模式,但不清楚 LangChain 里 Agent 中间件如何工作的读者。
- 想从示例跑到企业项目,需要知道常见问题和最佳实践的工程师。
1. LangChain 到底解决什么问题
先看一个真实场景。
假设你要做一个客服助手,让用户直接问“我的订单到哪了”。没有框架的时候,你要写多少代码?
- 定义一个 Prompt 模板,把用户问题塞进去。
- 调用大模型接口,拿到回答。
- 如果用户问“帮我查天气”,还要根据意图调用天气接口。
- 如果用户问“这个月报表分析一下”,你需要把数据库数据取出来,塞进 Prompt。
- 多轮对话还要手动维护历史消息列表。
这些问题本身不难,但组合在一起就变得繁琐。更关键的是,大模型应用通常不是“单次问答”,而是一个多步骤流程:理解意图、检索资料、调用工具、生成答案、格式化输出。每一步都会引入不确定性,而 LangChain 提供的就是一套把这些步骤串起来的标准方式。
画一条对比线:
- 直接调 API:你关注的是 HTTP 请求、Token 消耗、输出解析。
- 使用 LangChain:你关注的是数据怎么流转、工具怎么接入、异常怎么处理。
换句话说,LangChain 把“大模型对话”变成了“可编排的数据流”。它提供的不是某个特别强的模型能力,而是一套工程化框架,帮你统一管理 Prompt、模型、输出解析、记忆和工具。
还有个容易混淆的问题:LangChain 和 LangGraph 是什么关系?
简单说,LangGraph 是 LangChain 团队推出的下一代编排框架,更擅长构建有状态、有环、需要人工干预的复杂 Agent 应用。LangChain 经典 API 适合线性或简单分支流程,LangGraph 适合复杂的图结构流程。初学者建议先扎实掌握 LangChain 核心,再学 LangGraph,不要一上来就追新。
2. LangChain 核心概念与架构梳理
LangChain 发展到现在,模块划分已经发生了不小变化,尤其 0.1 之后到 0.3 这个阶段,接口和包名都在调整。但从学习角度,你可以把它分成几个核心抽象:
Model / Chat Model:也就是大模型封装。LangChain 支持 OpenAI、Anthropic、Google Gemini,以及国内常见的 OpenAI 兼容接口。只要模型提供 OpenAI 兼容的 HTTP 接口,就能接入。
Prompt Template:提示词模板。把固定的系统指令和动态的用户输入分开,避免每次都在代码里拼字符串。
Output Parser:输出解析器。把模型返回的文本解析成结构化数据,比如 JSON、Pydantic 对象、逗号分隔列表。LangChain 0.2 之后提供了with_structured_output这类更简洁的方式,底层依赖模型本身的 JSON 输出能力。
Memory:对话记忆。管理多轮对话中的历史消息,常见方案有ConversationBufferMemory、ConversationSummaryMemory等。不过在 LangChain 新版本中,官方越来越推荐直接把历史消息作为参数传入messages,而不是依赖 Memory 模块的隐式状态。
Chain / LCEL:链和表达式语言。LCEL(LangChain Expression Language)是 LangChain 推荐的链式编程语法,用|连接不同组件。
RAG:检索增强生成。先通过检索从外部知识库中找到相关资料,再把资料和问题一起交给模型生成答案。
Agent / Tool:智能体和工具。Agent 决定“调用哪个工具”“什么时候调用”,工具是 Agent 可以执行的外部函数。ReAct 是经典 Agent 实现之一,核心是“思考-行动-观察”循环。
Callback:回调机制。你可以在链执行过程中挂上回调,用来记录日志、追踪 Token 消耗、实现流式输出。
为了理解它们之间的关系,可以打个比方。LangChain 像一条自动化生产线:
- 传送带是 LCEL 的
|符号,负责把物料运到各工位。 - Prompt Template 是产品设计图,规定产品长什么样。
- Model 是核心加工机器,负责生成内容。
- Output Parser 是质检员,检查产品是否符合规格。
- Memory 是仓库,保存半成品和历史记录。
- RAG 是外协供应商,从外部库调取原料。
- Agent 是调度员,根据情况决定下一步让哪台机器工作。
3. 环境准备与 LangChain 安装
开始实操前,先准备环境。建议用 Python 3.10 以上版本,如果机器上没有,先装好 Python 并配置国内镜像源。
安装 LangChain 时要注意:官方现在把核心包拆开了。以前pip install langchain就够,现在很多功能需要单独安装对应包,比如langchain-openai、langchain-community、langchain-chroma。
下面给出一套相对完整的安装命令(版本请以实际环境为准,本文着重演示通用思路):
# 创建虚拟环境 python -m venv langchain-demo source langchain-demo/bin/activate # Windows 下执行 langchain-demo\Scripts\activate # 安装核心包 pip install langchain langchain-openai langchain-community # 如果做 RAG,常用文档加载、切分、向量库相关包 pip install langchain-text-splitters chromadb pypdf # 如果做 Agent 结构化和工具调用,建议安装 pip install pydantic接下来设置大模型 API Key。为了示例通用,我以 OpenAI 兼容接口为例。很多国内大模型服务也提供兼容接口,只需要替换base_url、api_key、model三处配置。
创建.env文件:
OPENAI_API_KEY=你的API_KEY OPENAI_API_BASE=https://你的兼容接口地址 OPENAI_MODEL_NAME=gpt-4o-mini如果暂时没有 API Key,可以用一个假的 Key 先把代码流程跑通(会报鉴权错误,但能看到调用逻辑),也可以考虑本地模型方案,比如基于 llama.cpp 部署 Qwen 系列模型,用 OpenAI 兼容接口接入。
4. 第一个 LangChain 示例:从 Runnable 到 LCEL
4.1 基础模型调用
先写一个最简单的示例。新建demo_basic.py:
import os from langchain_openai import ChatOpenAI # 从环境变量读取配置 llm = ChatOpenAI( model=os.getenv("OPENAI_MODEL_NAME", "gpt-4o-mini"), temperature=0.7, ) response = llm.invoke("用一句话解释什么是 RAG") print(response.content)这个示例做的事情很简单:调用模型并输出回答。注意llm.invoke()返回的不是字符串,而是一个AIMessage对象,所以要用.content拿到文本。
4.2 引入 Prompt Template
实际项目很少直接丢一个问题给模型,而是需要一套结构化提示词。改进一下:
from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个资深 AI 技术专家,回答问题要简洁、准确、有逻辑。"), ("human", "请解释以下技术概念:{concept}"), ]) chain = prompt | llm result = chain.invoke({"concept": "LCEL"}) print(result.content)这里的竖线|就是 LCEL 的核心语法,表示把 prompt 的输出传给 llm。LCEL 让链式调用看起来非常直观,也容易被优化执行。
4.3 加入输出解析
如果希望模型返回结构化 JSON,可以加一个输出解析器,或者直接用with_structured_output:
from langchain_core.pydantic_v1 import BaseModel, Field class TechConcept(BaseModel): name: str = Field(description="概念名称") definition: str = Field(description="定义") use_case: str = Field(description="使用场景") llm_with_structure = llm.with_structured_output(TechConcept) result = llm_with_structure.invoke( "介绍一下 ReAct 模式,包含名称、定义和使用场景" ) print(result.name) print(result.definition) print(result.use_case)这个能力依赖大模型的 JSON 输出能力,不是所有模型都稳定。如果模型返回的 JSON 格式不规范,建议在 Prompt 中加强说明,或者增加重试机制。
到这里你就掌握了 LangChain 最基础的三个组装动作:Prompt 模板、模型调用、输出解析。这也是所有复杂应用的最小单元。
5. RAG 知识库问答完整示例
RAG 是 LangChain 里最常被提到的应用场景。它的目的是解决大模型“编造知识”的问题,在生成回答之前先从外部知识库检索相关内容,把检索结果作为参考材料发给模型。
5.1 RAG 完整流程
一个标准 RAG 流程包含以下步骤:
- 文档加载:读取 PDF、TXT、网页、Word 等文件。
- 文本分割:把长文档切分成 chunk,避免超出模型上下文窗口。
- 向量化:用 Embedding 模型把 chunk 转成向量。
- 存储:把向量保存到向量数据库(Chroma、FAISS、Milvus、PGVector 等)。
- 检索:用户提问时,把问题向量化,在数据库中做相似度检索。
- 增强生成:把检索到的 top-k 文档与用户问题组装成 Prompt,交给模型生成。
5.2 文档加载与分割
先看文档加载和分割的示例:
from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter # 假设你有一份 txt 文档 loader = TextLoader("help_docs.txt", encoding="utf-8") documents = loader.load() # 切分参数需要根据实际文档调整 text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, separators=["\n\n", "\n", "。", "!", "?", " ", ""] ) docs = text_splitter.split_documents(documents) print(f"切分后文档块数: {len(docs)}")chunk_size和chunk_overlap是两个关键参数。chunk_size决定每块多大,chunk_overlap决定块与块之间重复多少内容。这里的坑是:如果分割太细,语义会被切断;如果分割太粗,检索精度下降。建议从 300-800 起步,根据模型上下文和业务场景调优。
5.3 向量化与存储
接着用向量数据库存储:
from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma # Embedding 模型 embeddings = OpenAIEmbeddings() # 创建并持久化向量库 vectorstore = Chroma.from_documents( documents=docs, embedding=embeddings, persist_directory="./chroma_db" ) print("向量库构建完成") # 检索测试 retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) results = retriever.invoke("退换货的流程是什么") for doc in results: print(doc.page_content) print("----")如果不需要持久化,可以不用persist_directory。但企业场景中一般都要做持久化,因为文档更新后不需要全量重建向量库。
5.4 组装 RAG 问答链
检索器准备好后,写一个完整的 RAG 问答链:
from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个企业知识库助手。请基于【参考资料】回答问题。如果资料中没有相关内容,明确回答不知道,不要编造。\n\n` "【参考资料】\n{context}"), ("human", "{question}"), ]) llm = ChatOpenAI() def format_docs(docs): return "\n\n".join([doc.page_content for doc in docs]) rag_chain = ( { "context": retriever | format_docs, "question": lambda x: x["question"] } | prompt | llm ) answer = rag_chain.invoke({"question": "退换货需要哪些条件?"}) print(answer.content)这里有个值得注意的小技巧:retriever | format_docs表示先检索,再把结果拼成字符串。LCEL 的好处是你可以轻松在中间插入日志、重试、甚至替换检索器。
5.5 RAG 效果不理想怎么排查
RAG 项目做出来容易,做好很难。如果你的 RAG 问答效果差,按这个顺序排查:
- 召回不准:看检索返回的 top-k 文档里到底有没有正确答案。没有,问题出在切分策略或 Embedding 模型。
- 切分不合理:检查 chunk 是否截断了关键语义,尝试调整
chunk_size和chunk_overlap。 - 提示词表达不清:把资料给模型时,要说清楚“以资料为准”,而不是让模型自由发挥。
- Embedding 模型与领域不匹配:中文场景建议评估中文 Embedding 模型,而不是直接使用默认英文模型。
- 上下文被无关信息污染:top-k 不要取太大,通常 3-5 即可。
6. Agent 与 ReAct 模式:让模型学会调用工具
LangChain 里 Agent 是另一个高频话题,也是最容易让人困惑的部分。
6.1 什么是 ReAct
ReAct 是 Reasoning + Acting 的缩写,核心思想是让模型在“推理”和“行动”之间循环:
- Thought(思考):模型判断当前需要做什么。
- Action(行动):选择一个工具并调用。
- Observation(观察):查看工具返回结果。
- 重复以上过程,直到得出最终答案。
这种方式让大模型不只是在“生成文字”,而是变成了一个“能使用工具的决策器”。
6.2 定义一个简单工具并创建 Agent
下面用一个计算器工具演示 Agent 的完整流程。这里不依赖外部 API,你可以直接运行。
from langchain_openai import ChatOpenAI from langchain.agents import create_tool_calling_agent, AgentExecutor from langchain_core.tools import tool from langchain_core.prompts import ChatPromptTemplate # 1. 定义一个工具 @tool def calculate_expression(expression: str) -> str: """计算一个数学表达式的值,例如 '1 + 2 * 3'。""" try: # 注意:生产环境不要直接用 eval,这里仅用于演示简单工具调用 result = eval(expression) return str(result) except Exception as e: return f"计算失败: {str(e)}" # 2. 创建模型 llm = ChatOpenAI(model="gpt-4o-mini", temperature=0) # 3. 创建 Agent prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个智能助手,可以调用工具来回答问题。"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}"), ]) agent = create_tool_calling_agent(llm, [calculate_expression], prompt) agent_executor = AgentExecutor(agent=agent, tools=[calculate_expression], verbose=True) # 4. 运行 result = agent_executor.invoke({"input": "计算 (12 + 34) * 5 的结果"}) print(result["output"])运行后你会看到 Agent 的思考过程和工具调用记录。这里有个重要提醒:eval在真实生产环境会引入任意代码执行风险,切勿直接用于线上。真实项目中应当使用ast解析、受限表达式引擎或专用计算库。
6.3 Agent 中间件的含义
“Agent 中间件”在实际项目中有两层含义:
第一层是Agent 与工具之间的适配层。Agent 需要理解哪些工具可用、工具参数怎么填、工具返回怎么处理,这层适配逻辑就是中间件。
第二层是Agent 与大模型之间的调度层。LangChain 里的 AgentExecutor、LangGraph 的状态图,都承担了调度职责。你可以在这一层做权限校验、流量控制、日志埋点、工具调用审计。
在企业项目里,我建议不要把 Agent 逻辑和大模型调用代码混在一起。应该单独封装一层 ToolService,让 Agent 只能通过这一层访问内部系统,避免模型直接调用任意内部接口。
6.4 什么场景适合 Agent
Agent 适合这些场景:
- 用户指令不固定,需要动态决定调哪个工具。
- 需要跨多个系统协作,比如查库存、下单、发通知。
- 需要复杂多步推理的任务。
不适合的场景:
- 高频低延迟的场景。Agent 推理会多次调用模型,延迟和成本明显更高。
- 流程固定的场景。如果流程固定,直接写代码或用 Chain 更稳定、可维护。
- 对安全要求极高,且不允许模型自主决策的工具调用场景。
7. MapReduce 在 LangChain 中的用法
MapReduce 在 LangChain 里主要用于长文本处理。大模型有上下文窗口限制,几万字的文档没办法一次性放进 Prompt,这时可以用 MapReduce 思路:
- Map 阶段:把文档切成多段,对每段分别做摘要或处理。
- Reduce 阶段:把所有段落摘要合并,再生成一个总摘要。
LangChain 早期版本提供load_summarize_chain和map_reduce_chain。新版本中,更灵活的方式是用 LCEL 自己组装一段 MapReduce 逻辑:
from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_text_splitters import RecursiveCharacterTextSplitter llm = ChatOpenAI(model="gpt-4o-mini", temperature=0) # 假设有一篇长文 long_text = open("long_article.txt", encoding="utf-8").read() # 切分成块 splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200) chunks = splitter.split_text(long_text) # Map 阶段:对每一块生成摘要 map_prompt = ChatPromptTemplate.from_messages([ ("system", "请用不超过100字概括以下内容:"), ("human", "{text}"), ]) def map_summarize(text: str) -> str: chain = map_prompt | llm return chain.invoke({"text": text}).content summaries = [map_summarize(chunk) for chunk in chunks] # Reduce 阶段:合并摘要 reduce_prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个总结专家,请基于以下分块摘要生成一份连贯的总摘要:"), ("human", "{summaries}"), ]) final_chain = reduce_prompt | llm final_summary = final_chain.invoke({"summaries": "\n\n".join(summaries)}).content print(final_summary)MapReduce 的要点是“分而治之”。如果段落之间逻辑依赖很强,直接切分可能丢失上下文。解决办法是可以加大chunk_overlap,或者在 Reduce 阶段把上一步摘要也补充进 Prompt。
8. MCP:模型上下文协议
MCP 是 2025 年前后 AI 应用领域最热门的关键词之一,它的全称是 Model Context Protocol,模型上下文协议。这个协议由 Anthropic 提出,目标是统一“AI 应用如何接入外部工具和数据源”的接口标准。
8.1 为什么需要 MCP
没有统一协议时,每个 AI 项目接入一个外部工具,都要写一套自定义适配代码。比如接数据库要写数据库插件,接设计工具要写设计工具插件,接代码仓库要写代码仓库插件。这些插件互相不通用,每个应用要重复实现一遍。
MCP 提供了一套标准:
- 客户端(Client):调用方的 AI 应用。
- 服务端(Server):暴露工具、数据源能力的独立服务。
- 协议:定义了工具发现、调用、资源访问的消息格式。
引入 MCP 后,工具提供方只需要实现一次 MCP Server,所有支持 MCP 的客户端都能直接使用这个工具。
8.2 MCP 与 LangChain 的关系
MCP 和 LangChain 不是竞争关系。LangChain 是应用编排框架,MCP 是工具接入的开放协议。LangChain 可以支持 MCP 客户端,把它作为 Tool 的一种来源。
在企业项目里,更稳妥的做法是:用 MCP 标准化工具供给,用 LangChain/LangGraph 编排 Agent 逻辑。两者结合可以让“工具复用”和“Agent 调度”各司其职。
8.3 MCP 落地时的注意事项
如果你所在团队计划落地 MCP,有几个建议:
- 先从标准化内部工具开始,比如数据库查询服务、运维脚本、内部 API,而不是一上来就接外部所有服务。
- 对 MCP Server 做权限隔离。Agent 能调用哪些工具,必须由中间层控制,不能用模型自由调用全部工具。
- 工具描述要写清楚。模型理解工具的主要依据是描述文本,描述越清晰,调用准确率越高。
- MCP 的生态还在快速变化,建议保持版本关注,不要把所有逻辑都绑定在某个偏门实现上。
9. 企业项目中的常见问题与排查思路
把上面所有知识放到实际项目里,你会发现真正的问题往往不在代码语法,而在系统设计。下面列举我在 LangChain 工程落地中见过的高频问题,做成排查表供你参考。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 模型返回格式不稳定,解析失败 | 模型 JSON 能力弱,或 Prompt 指令不明确 | 打印原始输出,检查是否标准 JSON | 使用with_structured_output,或增加格式示例和重试逻辑 |
| RAG 检索结果与问题无关 | chunk 切分不合理、Embedding 模型不匹配、检索 top-k 设置过大 | 单独测试检索器返回的文档相关内容 | 调整 chunk 大小、更换 Embedding 模型、缩小 top-k 范围 |
| Agent 陷入多次工具调用循环 | 模型未拿到足够信息、工具返回不明确、Prompt 没有限制调用轮次 | 开启 verbose 日志,观察 Thought 和 Observation | 在提示词中加入最大轮次限制;在 AgentExecutor 层设置max_iterations |
| 多轮对话丢失上下文 | 没有正确维护历史消息 | 检查传给模型的 messages 是否包含完整历史 | 手动把历史消息加入 prompt,或使用合适的 Memory 实现 |
| 工具调用报错 | 工具输入参数格式不对、工具内部异常未捕获 | 查看工具返回的原始错误 | 在工具函数内捕获异常,返回可读错误信息,避免 Agent 无法理解 |
| 流式输出失效 | 回调函数未注册或使用了不支持流式的组件 | 检查是否是 LCEL 链,是否注册了streaming回调 | 统一使用 LCEL 链,注册on_llm_new_token回调 |
| 向量库数据过时,回答仍是旧内容 | 文档更新后没有重新构建或增量更新向量库 | 检查向量库中是否存在过期 chunk | 建立文档版本管理,每次更新后重新生成对应向量 |
这里的核心思路是:任何和模型相关的异常,都要先拿到原始输入和原始输出,再判断问题出在 Prompt、检索还是工具层。不要一上来就改代码,先把链路中的每一步打印出来。
10. 企业项目最佳实践与工程建议
最后这部分,是把 LangChain 从示例项目推到生产环境时必须考虑的内容。很多教程没讲这些,恰恰是它们最值钱的部分。
10.1 不要把 Prompt 散落在代码中
Prompt 应该集中管理,按业务模块拆分配置,而不是散落在各个 python 文件里。推荐的做法是用 YAML 或 JSON 文件维护 Prompt 模板,通过配置中心或版本管理工具管理。这样可以做到 Prompt 修改不重新发版。
一个简化的 prompt 配置文件示例:
# config/prompts/rag.yaml rag_system_prompt: | 你是一个严谨的知识库助手。 只基于【参考资料】回答,不要编造内容。 如果资料中没有答案,请直接回答“资料中未找到相关信息”。 rag_human_prompt: | 用户问题:{question} 参考资料: {context}代码里通过yaml.safe_load读取即可。注意配置文件的读取要放在启动阶段,并做好异常处理。
10.2 给 Agent 工具调用设置边界
企业项目的 Agent 工具调用必须有边界:
- 所有工具调用记录完整日志,包括工具名、入参、出参、耗时。
- 高风险操作(删除、更新、发送消息)必须二次确认,不要直接让模型执行。
- 为每个工具设置超时时间,避免 Agent 被外部接口拖死。
- 根据用户身份控制工具可见范围,不同角色能看到不同工具列表。
这些内容看似和 LangChain 无关,但实际上决定了 Agent 能不能上线。
10.3 做好成本控制与性能优化
大模型应用的成本主要在 Token 消耗和调用延迟。以下几个实践经验很值得参考:
- 对 RAG 检索到的文档做“相关性过滤”,只保留高分文档,减少 Token 浪费。
- 对 Agent 设置最大迭代次数,防止模型反复调用工具导致成本飙升。
- 对重复性问答场景增加缓存层,相同问题直接命中缓存。
- 监控每个链路的 Token 消耗,建立基线,出现异常时能及时发现。
10.4 安全与合规注意
- 不要在 Prompt 中写入系统内部账号密码、密钥、内部 IP。
- 不要让人工智能应用直接访问生产数据库,接入时使用只读账号,并且限制数据范围。
- 用户上传文档时要校验文件类型、大小、内容,防止恶意文件或注入提示词。
- 对模型输出做内容合规检测,尤其是面向公众用户的应用。
10.5 版本管理与升级策略
LangChain 迭代速度很快,0.1、0.2、0.3 之间 API 都有变化。建议:
- 使用明确的依赖版本锁定,不要使用
langchain全家桶最新版而不锁定。 - 升级前先看官方迁移文档,用测试环境跑通核心用例再升级。
- 核心链路要做好单元测试和集成测试,尤其要测试 Prompt 变更对输出的影响。
11. 总结与下一步学习路线
这篇文章从一个实际开发痛点出发,把 LangChain 的核心概念、RAG、Agent、ReAct、MapReduce、MCP 和工程化实践串成了一整条学习线。你可以按照下面这个路线继续深入:
- 先把基础调用跑通:用本文第 4 节的代码,替换成你自己的模型配置,理解 Prompt、LLM、OutputParser 三件套。
- 做一个最小 RAG 项目:准备一份业务文档,按第 5 节的代码实现加载、切分、向量化、检索、问答,重点体会切分参数和检索质量的关系。
- 再用 Agent 做工具调用:按第 6 节的代码加入一个计算工具或查询工具,观察 ReAct 循环中的 Thought、Action、Observation。
- 然后研究 LangGraph:当你的流程出现分支、循环、人工确认这些复杂状态时,LangGraph 会比传统 AgentExecutor 更合适。
- 最后关注 MCP 生态:理解协议本身,把工具标准化,避免每个项目重复造轮子。
关于 LangChain 的学习,还有一个很重要的提醒:不要被版本更新带乱节奏。框架会变,API 会变,但 Chain、RAG、Agent 这套应用范式不会轻易过时。你真正要学会的,是“把大模型接入业务流程”的工程思维。代码示例可以复制,工程经验需要你在自己的项目里一点点踩出来。建议把本文收藏下来,做项目时回来对照检查。