LangChain新版本实战路线:从RAG、Agent到MCP与LangGraph
如果你最近打开 LangChain 官方文档,再对照网上那些两三年以前的教程,很可能会有一种“我是不是学了一个假框架”的错觉。以前一个 LLMChain 就能跑通的任务,现在打开 IDE 全是 deprecated 警告;以前 initialize_agent 一行代码就能生成 Agent,现在官方示例却频繁出现 LangGraph 的状态图。于是社区里出现了两种声音:一种说 LangChain 学了就废,另一种说它是 LLM 应用开发绕不开的抽象层。
我的判断是:LangChain 的价值从来不在“Chain”本身,而在于它把 LLM 应用的共性能力标准化了——模型接入、提示词管理、工具调用、记忆、检索、Agent 编排。理解这一点,你才会明白为什么 RAG、ReAct、MCP、LangGraph 这些名词会反复出现在同一类教程里。它们不是相互独立的新概念,而是同一个问题在不同层面的解法:如何让大模型在真实业务里稳定可靠地工作。
这篇文章不是官方文档的翻译,而是一条从“照着跑通示例”到“理解企业场景怎么选型”的完整路线。我们会从一个最小的大模型调用开始,逐步完成 RAG 知识库问答、ReAct Agent 实战、MCP 工具接入、MapReduce 长文档处理,最后落地到企业项目真正需要关心的工程问题。你可以把它当作一份能跟着敲的教程,也可以当作一次框架认知的梳理。
1. 为什么还要学 LangChain:框架的价值与争议
很多初学者会问:现在直接调 OpenAI SDK 不就行了吗?为什么要多套一层 LangChain?
这个问题的答案,取决于你要做的是“调用模型”还是“构建应用”。如果只是写一个脚本让模型回复一句话,直接调 SDK 完全够用。但一旦你开始做知识库问答、多工具调用、长流程任务编排,代码量会快速膨胀。你要自己处理文档加载、文本切分、向量存储、提示词组装、工具协议、上下文管理、失败重试,这些工作跟“调用大模型”本身没有关系,但又绕不过去。
LangChain 做的就是把这一层公共能力沉淀成标准接口。模型可以换,向量库可以换,工具可以换,但上层的编排逻辑不需要大改。这也是它在 2023 年到 2024 年快速流行、又在 2025 年被频繁讨论“是否过时”的原因。
坦白说,LangChain 的 API 变动确实剧烈。0.1 时代的 LLMChain、AgentExecutor,到 0.3 时代大力推广 LCEL 和 LangGraph,很多旧代码跑不起来。但这并不意味着框架不值得学。更合理的判断是:新版本的演进方向,恰好代表了 LLM 应用开发的趋势——从“写死链路”走向“动态规划”。你在旧教程里看到的大量 Chain 组合,今天更多被 Agent 和状态图取代。看懂这种演进,比背熟某个 API 更重要。
所以本文写给三类读者:
- 刚入门 LLM 应用开发,想系统了解 LangChain 核心模块的新手;
- 正在做 RAG 知识库或 Agent 项目,需要避开常见坑的开发者;
- 技术选型阶段,想判断 LangChain 和 LangGraph、MCP 到底什么关系的架构师。
如果你已经熟练使用 LangGraph 和 LangSmith,本文的前半部分可以当作查漏补缺,第 6 章之后的工程实践部分仍然值得一看。
2. LangChain 核心概念与新版体系
在学习代码之前,先把 LangChain 的核心抽象讲清楚。它不是一个大而全的“AI 框架”,而是一组面向 LLM 应用的工具集合。在最新版本里,这几个模块最常被用到。
2.1 模型层:ChatModel 与 Message
现在的 LangChain 统一使用 ChatModel 接口,不再区分旧版的 LLM 和 ChatLLM。它接收的是 Message 列表,而不是纯字符串。常见的消息类型包括系统消息、人类消息和 AI 消息,这让多轮对话和角色设定变得非常自然。
很多旧教程里 llm.predict("你好") 的写法已经不建议使用,新版更推荐 llm.invoke([...]) 或直接配合 LCEL 使用。
2.2 LCEL:LangChain 表达式语言
LCEL 是 LangChain 在 0.2 之后大力推行的语法,用管道符 | 把组件串联起来。它的核心价值是让代码从“过程式”变成“声明式”,并且天然支持流式输出和异步调用。
举个例子,一个最简单的“提示词 -> 模型 -> 输出解析”流程,在 LCEL 里只需要三行代码,这在后续的 RAG 和 Agent 示例中会频繁出现。
2.3 工具调用:Tool 与大模型 Function Calling
工具调用是 LangChain Agent 的基础。LangChain 提供了统一的 tool 装饰器,可以把任意 Python 函数封装成大模型可以调用的工具。函数名、函数描述、参数签名会自动成为模型的工具描述。
模型本身不会直接执行这个函数,它只是在对话中输出一个“需要调用该工具”的结构化请求,真正执行仍然在本地完成。这种“模型负责决策,代码负责执行”的分工,是整个 Agent 体系的核心设计。
2.4 Agent 与 ReAct 范式
Agent 可以理解为一个“会自己决定下一步做什么”的链。它不再是一套写死的流程,而是循环执行:思考当前问题、决定调用哪个工具、观察工具输出、继续思考,直到得到最终答案。
ReAct 是 Reasoning + Acting 的缩写,它和前端框架 React 没有任何关系。ReAct 的核心思想是让模型在每一轮都输出“思考过程”和“具体行动”,然后通过执行环境得到观察结果,再进入下一轮。这种“一步步来”的模式可以显著提升大模型在复杂任务上的推理可靠度。
2.5 记忆与检索:Memory 和 RAG
Memory 解决的是多轮对话的上下文问题,而 RAG(Retrieval-Augmented Generation,检索增强生成)解决的是“模型不知道私有知识”的问题。RAG 的思路是:把文档切块、向量化、存入向量数据库,用户提问时先检索相关片段,再把片段拼进提示词,让模型基于片段回答。
2.6 LangGraph 与 AgentExecutor 的关系
这是最容易混淆的地方。新版 LangChain 官方推荐用 LangGraph 构建 Agent,而不是早期版本的 AgentExecutor。LangGraph 把 Agent 流程建模为一张状态图,节点是“调用模型”“调用工具”“路由判定”,边是状态流转,这让流程可控性大幅提升。
两者对比可以这样理解:
| 维度 | AgentExecutor | LangGraph |
|---|---|---|
| 流程模型 | 写死的循环 | 显示状态图 |
| 可控性 | 较弱,难以插入人工节点 | 强,可定义暂停、回退、并行 |
| 调试体验 | 靠日志 | 可视化状态与轨迹 |
| 适用场景 | 快速验证原型 | 企业级复杂流程 |
| 学习成本 | 低 | 中高 |
实际项目里,快速 Demo 用 AgentExecutor 没有问题,但进入生产环境后,状态可控、可观测的 LangGraph 才是更好的选择。
老版本中的 LLMChain、SimpleSequentialChain 等概念在最新版本中已经不再是官方主推,但在大量存量代码和旧教程中仍然存在。如果你维护老项目,需要知道它们;如果你从零开始,建议直接把重心放到 LCEL + LangGraph 上。
3. 环境准备与最小示例
在写代码之前,先准备好运行环境。本文假设你使用 Python 3.10 以上版本,具体版本以你的项目实际为准。为了避免包版本冲突,建议在虚拟环境里操作。
然后安装核心依赖:
如果你的项目还要用 MCP 协议和 LangGraph,可以一并安装:
这里有一个很重要的提醒:当前版本的 LangChain 包拆分很细,langchain 主包主要负责编排和链逻辑,模型提供商都有自己的独立包,比如 langchain-openai、langchain-anthropic、langchain-ollama。不要在代码里直接写 from langchain.llms import OpenAI,这种旧写法在新版本里已经废弃。
如果你使用 OpenAI 兼容接口的本地模型,比如 Ollama 或 vLLM 部署的 Qwen 系列,只需要设置 base_url 指向本地服务地址即可。下面是最小示例:
运行后如果一切正常,你会看到一句关于 RAG 的解释。resp.content 是模型回复的文本内容,resp.response_metadata 里可以看到 token 消耗等元数据。
这里要特别提醒 Windows 用户:很多开发者在安装 langchain-chroma 时遇到编译错误,根源往往是本地缺少 C++ 编译环境。更简单的做法是优先用 pip 安装预编译版本,如果还是报错,检查 Python 版本是否过新或过旧,也可以临时换用内存向量存储 langchain_core.vectorstores.InMemoryVectorStore 跑通流程。
运行成功之后,我们就有了第一个可运行的 LangChain 程序。接下来把复杂度往上加一层,做一个完整的 RAG 知识库问答系统。
4. 从零构建一个 RAG 知识库问答系统
RAG 是企业落地 LLM 应用最常用的模式。它解决的问题很清楚:大模型没有你的内部文档、产品手册、售后记录,直接问它会“一本正经地胡说八道”。RAG 的做法是提前把文档内容向量化,用户提问时先检索最相关的片段,再让模型基于这些片段生成答案。
整个流程可以拆成五个环节:文档加载、文本切分、向量化存储、检索、生成回答。我们逐个来看。
4.1 文档加载与文本切分
LangChain 提供了非常多的文档加载器。下面以文本文件为例,如果你想加载 PDF、Markdown、HTML,只需要换掉 TextLoader,比如 PyPDFLoader、UnstructuredMarkdownLoader。
真正的关键步骤是切分。直接按字符数硬切会破坏语义,比如把一句话从中间切开;按段落切分又可能导致单个片段太长,超出模型上下文窗口。更推荐的做法是用递归字符切分器 RecursiveCharacterTextSplitter,它会在遇到换行、句号、空格时优先断句,尽可能让每个片段保持语义完整。
chunk_size 和 chunk_overlap 是 RAG 项目里最值得调的两个参数。chunk_size 太小,检索到的信息可能不完整;太大,会增加向量化成本和模型上下文压力。一般来说,中文场景下 300 到 800 字是比较常见的范围,具体取决于你的文档类型和问答粒度。如果文档是产品规格书,可能需要更小的块方便精确检索;如果是长篇技术文档,可以适当放大。
4.2 向量化与向量数据库
切分完成后,需要把每个片段转成向量。Embedding 模型选择很关键:如果你用的 LLM 是 OpenAI 或国产闭源模型,通常搭配该厂商提供的 Embedding 接口;如果做本地私有化部署,可以用 BAAI/bge-m3、m3e-base 等开源模型。
下面代码使用 OpenAI 兼容的 Embedding 接口,并写入 Chroma 向量库。from_documents 方法会把文档切片、向量化并持久化到本地目录。
第一次运行会耗时较长,因为要逐条调用 Embedding 接口。之后再次运行,如果目录已存在,可以直接用 Chroma(persist_directory="./chroma_db", embedding_function=embedding) 加载已有数据,不需要重新切分向量化。
4.3 构建检索问答链
向量库建好后,剩下的工作就是“检索”和“生成”。LangChain 提供了两个核心方法:create_stuff_documents_chain 负责把检索到的文档内容“塞”进提示词让模型回答;create_retrieval_chain 负责把检索器和上面的文档链串起来。
注意这里的 retriever 就是向量库的检索接口,你可以通过 vectorstore.as_retriever(search_kwargs={"k": 4}) 控制每次检索返回的片段数量。k 值越大,给模型的信息越丰富,但也可能掺入无关内容,影响回答准确度。
这里有一个新手容易误解的地方:create_stuff_documents_chain 默认会把所有检索到的文档“一股脑”塞进 context 变量。如果你的文档很多,检索回来的片段很多,提示词会变得很长。入门阶段可以先不纠结,但到生产环境,建议对检索结果做重排(Rerank)或者用 MapReduce 方式分段处理,避免上下文超限。
4.4 运行结果与验证
运行上面的脚本后,预期输出是一段基于文档内容的回答。如果回答里出现了明显与文档无关的信息,优先检查两处:
retriever检索回来的片段是不是正确的?可以在invoke之前调用retriever.invoke("退货政策是什么")打印片段内容进行验证。chunk_size是否太小,导致关键信息被切碎了?可以尝试调大chunk_size并增大chunk_overlap。
这一步跑通之后,你已经拥有了一个最简可用 RAG 系统。从企业角度看,接下来要考虑的是:文档更新怎么同步、向量库选择什么、权限怎么隔离。这些放到第 8 章再展开。
5. ReAct Agent 与工具调用实战
如果说 RAG 解决的是“让模型知道更多信息”,Agent 解决的就是“让模型能做更多事情”。当你需要模型根据用户请求去查数据库、算数学题、调内部 API 时,就需要 Agent 体系登场。
5.1 ReAct 循环到底在循环什么
先用一个比喻理解 ReAct。想象你让一个实习生帮你订会议室,他不会一次性把所有事情做完,而是先看你给定的信息,查询会议室系统,发现时间冲突,再换一间,最后确认,每一步都基于上一步的结果。
ReAct Agent 就是这样的实习生。模型在每一轮都会输出:
- 思考:基于当前问题,我该做什么?
- 行动:我应该调用哪个工具,参数是什么?
- 观察:工具返回了什么结果?
然后进入下一轮,直到模型认为自己得到了最终答案。LangChain 的 AgentExecutor 负责执行这个循环,你只需要提供工具清单和系统提示词。
5.2 定义工具并构建 ReAct Agent
下面我们构建一个能进行数学计算的 Agent。为了让示例更有说服力,我们故意不告诉模型计算公式,让它通过工具去计算。
这段代码里有两个值得关注的点。
第一,@tool 装饰器会把 Python 函数的 __doc__ 作为工具描述发给模型,因此函数的 docstring 要写清楚“这个工具是干什么的、适合什么场景”,这会直接影响模型能否正确选择工具。
第二,handle_parsing_errors=True 在生产环境中非常重要。大模型偶尔会输出不符合格式要求的内容,如果解析失败直接抛异常,用户体验会很差;开启后 LangChain 会把解析错误反馈给模型,让它重新生成,提高任务成功率。
5.3 运行观察
带着 verbose=True 运行,你会看到控制台逐行打印模型内部的 ReAct 循环过程。你会看到模型先输出“思考:我需要调用 multiply 工具来计算……”,然后调用工具,看到结果后继续思考,再调用 get_current_year,最终拼出答案。
这个过程中最容易出现的问题是:模型死循环调用同一个工具,或者一直在“思考”但拿不出行动。解决办法是调低 max_iterations,并在工具层做防重入和超时控制。
如果你希望进一步控制流程,比如先调用 A 工具校验参数,再决定是否调用 B 工具,那 AgentExecutor 就不太好用了。此时应该转向 LangGraph,把每一步建模为图中的节点,通过条件边控制分支。这也是为什么在企业级 Agent 项目中,LangGraph 越来越受重视。
6. MCP:标准化 Agent 工具层
讲到 Agent,绕不开 MCP。MCP(Model Context Protocol,模型上下文协议)是 2024 年底开始走红的一个开放协议,目标是让大模型应用通过统一方式接入外部工具、数据源和文件系统。
6.1 MCP 到底解决了什么问题
在 MCP 出现之前,每接一个工具,开发者在代码里写一个对应的 Function Calling 封装,工具多了之后维护成本非常高。而且不同 Agent 框架对工具的描述格式各不相同,可复用性差。
MCP 的角色更像一个“Agent 世界的中间件”。它把工具的能力统一暴露成标准接口,Agent 只需要通过 MCP 客户端去发现工具、调用工具,不需要关心工具背后是数据库、浏览器、设计软件还是内部 API。你可以在本地起一个 MCP Server,加载一堆工具,然后在任意支持 MCP 的客户端里使用它们。
用表格对比一下常见概念:
| 概念 | 作用层次 | 举例 |
|---|---|---|
| Agent Skill | 面向 Agent 的能力封装 | 教会 Agent 完成某一类任务的方法 |
| MCP Server | 面向工具的标准化接入层 | 暴露数据库查询、浏览器操作等能力 |
| Function Calling | 模型输出结构化调用意图 | 模型在输出里请求调用某个函数 |
| Tool 装饰器 | 代码侧把函数暴露给模型 | @tool 定义的 Python 函数 |
简单说,MCP 更偏向“协议”,Skill 更偏向“行为指导”。两者不是替代关系,而是可以配合使用。MCP 让工具接入标准化,Skill 让 Agent 更聪明地使用工具。
6.2 写一个最简 MCP Server
下面用 Python 官方 MCP SDK 写一个最简单的数学工具服务。这个服务暴露一个 add 工具,远程客户端可以直接发现并调用。
FastMCP 是 MCP Python SDK 提供的高层封装,它会自动根据函数签名生成工具描述,并处理通信细节。运行这个文件后,服务会在本地启动一个标准输入输出通道,等待客户端连接。你可以在其他支持 MCP 的客户端里加载这个脚本路径,动态发现 add 和 subtract 两个工具。
6.3 在 LangChain 中加载 MCP 工具
在 LangChain 项目中,可以通过 langchain-mcp-adapters 将 MCP Server 暴露的工具加载成 LangChain 的 Tool 对象,然后直接喂给 Agent 使用。
这段代码的优点是:Agent 不再关心工具具体实现在哪里,只要 MCP Server 启动成功,客户端会自动发现工具。如果你想接入外部服务,比如 Figma、Playwright、数据库中间件,只需要把 command 和 args 换成对应服务的启动方式,代码逻辑不用改动。
需要提醒的是,langchain-mcp-adapters 仍在快速迭代中,不同版本的导入路径可能有差异。如果遇到 load_mcp_tools 导入失败,先检查这个包的版本和官方 README,而不要盲目改代码。
6.4 MCP 在企业场景中的价值
从材料看,MCP 已经从最初的 AI 编程辅助场景扩展到设计工具、数据库、IDE 工具链等多个方向。这说明 MCP 正在成为 Agent 工具接入的通用标准。对我们开发者的直接影响是:团队的内部工具库可以用 MCP Server 统一暴露,Agent 应用、IDE 插件、低代码平台都能复用同一套工具接口。虽然部署和调试成本客观存在,但从标准化角度看,方向已经很清晰。
7. MapReduce 与其他文档处理模式
Agent 和工具讲完之后,回到一个很实际的问题:当文档太长、上下文窗口放不下时,怎么办?这正是 MapReduce 这类文档处理链要解决的场景。
7.1 Stuff、MapReduce、Refine 的对比
在 LangChain 的文档处理体系里,有三种经典策略:
| 模式 | 工作方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Stuff | 把所有文档直接拼进提示词 | 简单,信息完整 | 受上下文窗口限制 | 文档量小 |
| MapReduce | 先逐段摘要,再合并摘要 | 可处理超长文档 | 可能丢失细节,成本高 | 长文档全局摘要 |
| Refine | 逐段迭代,边读边润色答案 | 保留上下文衔接 | 串行慢,误差累积 | 需要逐步归纳 |
MapReduce 的思路是:第一步对每个切块单独生成摘要,第二步把所有摘要再汇总成最终结果。这个过程和 Hadoop 里的 MapReduce 思想类似,只是处理对象从数据变成了文本片段。
在实际代码里,LangChain 提供了一个比较经典的 load_summarize_chain。不过新版官方更推荐用 LCEL 自行组合,下面给出一个基于经典 API 的可运行示例。
运行之后,你会得到一个比原文短很多的摘要。注意 chain_type="map_reduce" 的调用方式是旧版 API,但在很多存量代码里仍然出现。如果在企业新项目里,我更推荐用 LCEL 自己组合 MapReduce 流程:用 RunnableLambda 或 LangGraph 的 Map 节点处理每个分块,再用 combine_documents 汇总。这样每一步的输入输出都清晰可控,便于监控和恢复。但这个写法的完整示例比较长,初学者可以不急着在第一步掌握。
7.2 MapReduce 在企业落地中的坑
MapReduce 的第一个坑是成本。每个文本分块都要调用一次模型,如果长文档切成 100 个块,地图阶段就是 100 次调用,费用和时间都会显著上升。在实际项目中,可以先用聚类或关键词过滤掉无关分块,再做摘要。
第二个坑是信息丢失。单块摘要会丢弃很多细节,汇总阶段只基于摘要做二次归纳,最终结果往往只保留大方向。如果业务要求严格保留数据细节,MapReduce 并不合适,应优先考虑增大上下文窗口或使用 Refine。
第三个坑是顺序依赖。某些文档的逻辑是层层递进的,各块之间有关联。MapReduce 默认把每个块当独立单元,容易丢失前后逻辑。对这种文档,可以按章节切分,而不是按固定字符数切分。
8. 企业项目实战:工程问题与最佳实践
跑通示例和上线之间,还隔着很多工程问题。这一章把实际项目中最常遇到的问题和做法总结出来。
8.1 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
新版代码报 DeprecationWarning |
使用了旧版 API | 查看警告信息中的替代方案 | 改用 LCEL / LangGraph,或先锁定旧版本运行 |
| RAG 回答答非所问 | 检索片段不相关 | 打印 retriever.invoke 结果检查召回内容 |
调整切分参数,调大 k,增加重排环节 |
| 向量库启动报错 | 依赖版本冲突 | 查看错误堆栈,检查 langchain-chroma 版本 |
统一依赖版本,或用 InMemoryVectorStore 先验证流程 |
| Agent 死循环 | 模型反复选择同一个工具 | 开启 verbose 观察循环 |
设置 max_iterations,增加工具调用唯一性校验 |
| MCP Server 启动后客户端找不到工具 | 包版本或通信方式不匹配 | 先独立测试 MCP Server,再测试客户端加载 | 检查 SDK 版本,参考官方 README 调整 |
| 生产环境响应太慢 | 串行调用过多 | 查看链路的日志和耗时分布 | 增加缓存、并行调用、异步处理 |
排查问题时,最忌讳一上来就怀疑模型能力。大部分 LangChain 问题都出在数据格式、工具描述、依赖版本和提示词结构上。建议先打印模型收到的完整提示词和工具返回结果,往往一眼就能定位。
8.2 工程实践 1:锁版本,不要盲目追新
LangChain 的版本变化之快,在 Python 生态里也算少见。一个项目今天跑得好好的,明天升级一个小版本就可能出现导入错误。企业项目一定要在 requirements.txt 或 pyproject.toml 里锁定版本范围,并且把升级当成一次独立的测试任务来做。
依赖锁定虽然简单,却是成本最低的防故障手段。很多线上事故都源于“顺手升级了一个依赖”。
8.3 工程实践 2:可观测性必须前置
LLM 应用的最大特点是“不确定”。同一个问题,模型今天回答和明天回答可能不一样。因此,日志记录不能只记录结果,还要记录提示词、模型输出、token 消耗、耗时、工具调用序列。
如果你还没有接入 LangSmith 或 Langfuse,也可以先用最朴素的方式:在每个关键节点打印结构化日志。生产环境建议把完整的调用轨迹写入日志系统,方便出问题时回放。
8.4 工程实践 3:工具层要加权限和风控
Agent 可以调用工具,就意味着模型一旦被注入恶意指令,可能触发危险操作。比如你给 Agent 一个删除数据库记录的工具,提示词注入可能让模型在用户诱导下执行危险调用。
所以工具函数内部必须做权限校验和参数白名单校验。模型输出的参数只是“建议值”,真正执行时要在代码里二次确认。尤其是删除、修改、发送消息这类高影响操作,建议加入人工审批节点。Agent 工具的权限设计原则是最小权限:只给执行任务所需的工具,不给多余能力。
8.5 工程实践 4:从 AgentExecutor 平滑迁移到 LangGraph
如果你的 Agent 逻辑越来越复杂,比如需要用户确认、需要回退到上一步、需要多个 Agent 协作,建议尽早迁移到 LangGraph。迁移时不需要推翻重来,可以把原有工具函数原样保留,只把外层循环改成图结构。
简单来说,LangGraph 的三个基本节点是:Agent 节点、工具节点、条件边。Agent 节点负责决定调用哪个工具,工具节点负责执行,条件边根据工具结果决定下一步是继续还是结束。虽然概念上比 AgentExecutor 多一层,但它带来的可控性和可调试性,在企业项目里非常值得。
9. 总结与后续学习建议
回到开头那个问题:LangChain 学了到底有没有用?我的答案是有用,但你要盯着新版本的核心方向学,而不是照着旧教程背 API。
这篇文章真正想讲清楚的一件事是:大模型应用开发的技术栈已经从“搭一条写死的链”变成“搭一个可控的智能体流程”。RAG 是给模型补充知识,ReAct 是让模型有推理和行动能力,MCP 是让工具接入标准化,LangGraph 是让整个流程状态可控。LangChain 的价值,就是把这些能力统一在同一个编程模型里,让你不必自己从零实现分布式向量库、工具协议和状态机。
如果你现在还有点乱,建议按这样的顺序练习:
- 先不加任何框架,直接用大模型 SDK 体验 Function Calling,理解模型如何输出工具调用意图;
- 再使用 LangChain 的
@tool和create_react_agent跑通一个最小 Agent; - 然后做 RAG,重点调优切分参数和检索质量;
- 接着用 LangGraph 把上述 Agent 流程画成一张状态图;
- 最后再研究 MCP 怎么把团队内部工具有效暴露出来。
这个顺序背后的逻辑是:先用最底层的方式理解原理,再用 LangChain 提高效率,最后用 LangGraph 和 MCP 解决生产问题。每一步都有明确的目标,不会陷入“学了 API 就忘”的循环。
在实际项目中,你还会遇到模型选型、Embedding 模型评测、Prompt 版本管理、成本控制、数据权限隔离等一系列问题,这些靠一篇文章讲不完。但只要你理解了框架的核心抽象,新概念和新工具出现时,你都能快速判断它在整个体系里处于哪一层、解决什么问题。这比记住某一个 API 重要得多。