LangChain+LangGraph+Agent+RAG:LLM应用开发从入门到知识库问答实战
最近在技术社区里,LangChain、LangGraph、Agent、RAG 这几个词几乎成了 LLM 应用开发的“标配四件套”。但很多同学学完 LangChain 的基础示例之后,一旦要落地真实项目,就会发现官方文档里的 Demo 根本撑不起生产环境:链式调用太死板、Agent 调度不可控、知识库检索效果差。市场上资料又极其零散,有的只讲概念,有的只贴代码,缺少一条从入门到企业级实战的完整路线。
这篇文章就是按照“一个月吃透 LLM 应用开发”的思路整理的一套闭环学习方案,涵盖 LangChain 核心用法、LangGraph 图编排、Agent 开发、RAG 知识库构建,最后用 FastAPI 封装成一个可运行的本地知识库问答系统。内容偏实战,每段代码都可以直接复制运行,适合刚入门 LLM 开发的同学,也适合想系统化梳理 Agent 工程化的后端开发者。
1. 背景:为什么说这是 LLM 应用开发绕不开的四件套
1.1 四个概念分别解决什么问题
先别急着写代码,把这四个词放在同一个坐标系里理解,后面会少走很多弯路。
LangChain 是一个 LLM 应用开发框架,它把“调用模型、拼提示词、解析输出、管理记忆、连接外部工具”这些高频操作封装成标准组件。你可以把它理解成 LLM 开发领域的“Spring Boot”,解决的是应用开发的工程化问题。
LangGraph 是建立在 LangChain 之上的编排框架。LangChain 早期提供的 Chain(链)是线性结构,但在真实业务里,一个复杂的 AI 应用往往有条件分支、循环、人工介入、多角色协作,线性链路根本表达不了。LangGraph 用图(Graph)来组织执行流程,节点(Node)负责干活,边(Edge)决定流转方向,解决的是流程可控性问题。
Agent(智能体)指的是让大模型具备“思考 → 调用工具 → 根据结果继续思考”的循环能力。它不再是一次性问答,而是能拆解任务、选择工具、执行动作、观察结果、最终给出答案。解决的是模型自主行动问题。
RAG(Retrieval-Augmented Generation,检索增强生成)是把外部知识库和 LLM 结合的方法。先根据用户问题检索出相关文档片段,再把这些片段作为上下文交给模型生成回答。解决的是模型知识过时和幻觉问题。
1.2 它们之间的关系
一句话总结它们的关系:
RAG 是知识供给方案,Agent 是任务执行范式,LangGraph 是流程编排引擎,LangChain 是基础设施框架。
一个企业级项目通常是这样的:用 LangChain 接入模型和工具,用 LangGraph 编排整个问答流程,在流程中加入 Agent 节点实现工具调用,在检索环节接入 RAG 知识库。四者不是互相替代的关系,而是层层叠加、各司其职。
有不少人问“LangChain 是不是过时了?”答案是:框架本身在演变,但它的组件抽象思路仍然值得学。即使在 LangGraph 项目中,你依然要大量使用 LangChain 的模型封装、Prompt 模板、文档加载器和向量库集成。与其纠结哪个框架“新”,不如先把组件能力和编排思想搞清楚。
1.3 学完这篇你能掌握什么
- 理解 LangChain 的核心组件:模型、Prompt、输出解析器、记忆。
- 理解 LangGraph 的状态图模型,能写条件路由和循环。
- 掌握 Agent 的基本原理,能自定义 Tool 并交给 Agent 调用。
- 掌握 RAG 完整链路:加载 → 切分 → 向量化 → 存储 → 检索 → 生成。
- 完成一个基于 LangGraph + Agent + RAG + FastAPI 的可运行项目。
2. 环境准备与版本说明
2.1 基本环境要求
LLM 开发环境相对简单,本文示例环境如下:
| 依赖 | 推荐版本 | 说明 |
|---|---|---|
| Python | 3.10+ | 3.10 及以上对类型注解支持较好 |
| langchain | 1.x | 版本迭代快,以 pip 安装为准 |
| langchain-openai | 最新 | OpenAI 兼容接口封装 |
| langgraph | 0.2+ | 图编排框架 |
| langchain-chroma | 最新 | Chroma 向量库适配层 |
| fastapi | 0.110+ | Web 服务框架 |
| uvicorn | 0.30+ | ASGI 服务器 |
需要特别说明:LangChain 的 API 在 1.x 版本前后有过多次调整,不同小版本的导入路径可能不同。比如旧版本中 langchain.llms.OpenAI 这类写法在新版本已经迁移到了独立包 langchain-openai 中。建议以你实际安装版本的官方文档为准,本文重点演示实现思路。
2.2 安装依赖
创建一个虚拟环境并安装依赖:
如果你的网络环境无法访问 OpenAI 接口,或者出于数据安全考虑需要使用本地模型,可以参考 2.3 节配置兼容接口。
2.3 模型服务准备
本文示例采用 OpenAI 兼容接口,所以无论你用的是 OpenAI、通义千问、智谱、DeepSeek 还是本地 Ollama,只要服务暴露的是 /v1/chat/completions 格式的接口,都可以通过 ChatOpenAI 统一接入。
以本地 Ollama 为例,先启动服务并拉取一个对话模型:
然后在代码中指定 base_url 指向本地地址:
如果是调用云端模型,把 base_url 和 api_key 换成对应平台的配置即可。建议把 API Key 放到环境变量里,不要写死在代码中:
3. LangChain 快速入门:模型、提示词、输出解析与记忆
3.1 模型调用
LangChain 对各家大模型做了统一封装,你不需要关心底层 SDK 的差异。最基础的使用方式如下:
注意:invoke 返回的是 AIMessage 对象,真正的文本内容在 .content 属性里。这是 LangChain 1.x 和旧版本最大的习惯差异——以前很多示例直接打印 llm("问题"),新版本统一走 invoke 接口。
ChatOpenAI 中常用的参数有:
temperature:控制随机性,数值越高回答越发散,知识库问答建议 0~0.3。max_tokens:限制生成长度。timeout:请求超时时间,生产环境必须设置,避免模型服务卡死导致接口挂起。streaming:是否流式输出,Web 场景通常开True。
3.2 提示词模板
生产环境中不太可能直接裸调模型,你需要把用户输入嵌入到业务指令中。ChatPromptTemplate 用来做这件事:
ChatPromptTemplate 支持 system、human、ai 三种角色消息,花括号里的内容是变量占位符。核心优势是提示词和业务代码分离,需要调整语气或规则时直接改模板,不用动代码。
3.3 输出解析器
模型返回的是字符串,但业务系统往往需要结构化数据。StrOutputParser 是最常用的输出解析器,作用是直接从模型输出中提取字符串: