> ## Documentation Index
> Fetch the complete documentation index at: https://www.yuan111.asia/doc/llms.txt
> Use this file to discover all available pages before exploring further.

# RAG 对话机器人：LangChain 工程文档式系列教程

# RAG 对话机器人：LangChain 工程文档式系列教程

> **目标**：学完本系列，你能从零搭建一个知识问答 RAG 对话机器人。
> **路线**：从"规定性最少"的概念开始，一步步看到每个概念**为什么必然出现**（逻辑必然性），最终拼出完整系统。
> **原则**：不用 LangGraph、不用依赖它的 agent、不用任何弃用包——全部用 langchain 1.x 官方活跃维护的 API。

***

## 一、这套教程回答的问题

| 你可能会问                           | 本系列在第几篇回答 |
| ------------------------------- | --------- |
| LangChain 到底是干嘛的？我直接调 API 不行吗？  | 01        |
| 模型返回的到底是什么东西？为什么老讲消息？           | 02        |
| 为什么要模板？手拼字符串不行吗？                | 03        |
| 怎么让输出变成我要的格式 / 一个字一个字出来？        | 04、05     |
| 模型怎么记住我说过的话？                    | 06        |
| 怎么把公司文档变成模型能用的知识？               | 07        |
| 怎么让机器懂"意思相近"？                   | 08        |
| 知识库问答整条链路怎么搭？（老板要的东西）           | 09        |
| 检索结果不准怎么办？对话+知识库怎么结合？           | 10        |
| 生产环境并发、异步、网络到底怎么回事？             | 12        |
| langchain\_core 里到底有哪些模块？哪些值得学？ | 13        |
| 怎么把机器人变成 HTTP API 给前端用？         | 14        |
| 完整的后端项目长什么样？                    | 15        |

***

## 二、核心方法论：规定性展开 + 逻辑必然性

**规定性（prescriptivity）**：一个概念对你（代码编写者）施加的**约束数量**。

* 规定性越少 = 概念越简单、越自由、约束越少；
* 规定性越多 = 概念越复杂、越精确、越接近生产现实。

整套课程的顺序就是**规定性从少到多的展开**，并且每一步都是上一步**逼出来的**（逻辑必然性）：

```
规定性 0 → 1 → 2 → 3 → ... → 生产级

01 模型调用（规定性 1：一个类、一个方法）
  ↓ 必然而然：各家 API 协议不同、返回结构不同 → 需要统一信封
02 消息类（规定性 2：System/Human/AI 三种角色 + 9 字段）
  ↓ 必然而然：手拼字符串列表脆弱、没法插历史 → 需要模板
03 模板（规定性 3：变量插值 + 历史槽位）
  ↓ 必然而然：模型返回文本又慢又难解析 → 需要剥壳 + 流式
04 输出解析与流式（规定性 4：StrOutputParser / stream）
  ↓ 必然而然：业务要的是 JSON，不是散文 → 需要结构化契约
05 结构化输出（规定性 5：Pydantic 蓝图）
  ↓ 必然而然：模型每轮都是金鱼脑 → 需要会话状态
06 记忆（规定性 6：历史滚雪球 + 会话隔离）
  ↓ 必然而然：模型不知道公司文档 → 需要外部知识注入
07 文档与切分（规定性 7：Document + TextSplitter）
  ↓ 必然而然：全文档塞不进上下文 → 需要先召回相关内容
08 向量化与向量库（规定性 8：Embedding + Chroma + Retriever）
  ↓ 必然而然：检索→拼上下文→生成 要串成一条链 → 需要组合协议
09 RAG 组装（规定性 9：LCEL 管道 / Runnable 协议）
  ↓ 必然而然：粗排不准、问答要带历史 → 需要精排 + 对话式 RAG
10 重排序与对话式 RAG（规定性 10）
  ↓ 必然而然：模型只能“说”不能“做”，算日期查系统只能写死 → 需要工具协议
11 工具调用（规定性 11：@tool / bind_tools / 手动循环）
  ↓ 必然而然：一次问答多次调用，生产要吞吐、要并发、要懂底层 → 需要执行模型
12 并发与网络模型（规定性 12：线程池 / 事件循环 / httpx）
  ↓ 必然而然：钻进了 langchain_core 内部 → 该看看整个地基了
13 langchain_core 全地图（盘点，不新增规定性）
  ↓ 必然而然：内部再厉害，得能被外部调用 → 需要服务化
14 FastAPI 服务化（规定性 14：HTTP API）
  ↓ 必然而然：生产级 = 配置化 + 索引管线 + 错误处理 + 可部署
15 完整后端项目（规定性 15：工程化封装）
```

**每一篇都遵循同一固定结构**（这是本系列与普通教程最大的区别）：

1. **上集回顾** —— 上一篇结尾必然有个"还差什么"，本篇来解决它
2. **数据字典** —— 本篇涉及的关键类：字段、数据类型、结构示例（JSON）
3. **关键方法** —— 方法签名 + 参数 + 返回值
4. **进程线程模型** —— 这段代码在哪个线程跑、阻塞不阻塞、并发在哪
5. **网络模型** —— 底层走了什么 HTTP 请求、协议、流式、超时、重试
6. **可运行验证** —— 配套 `code/` 代码，亲手跑一遍看输出
7. **边界** —— 这个概念什么时候不适用、坑在哪

***

## 三、目录

> 逻辑顺序 = 认知依赖：先懂"模型返回什么 / 怎么构造输入"（01~~05），再学会话与知识（06~~10），然后工具与底层（11~~13），最后上线（14~~15）。

| 篇  | 标题                                                                     | 本片学会什么                                  | 新增规定性 | 配套代码                                          |
| -- | ---------------------------------------------------------------------- | --------------------------------------- | ----- | --------------------------------------------- |
| 00 | [环境准备](/doc/doc/enterprise-rag-course/00-环境准备)                             | 装 Miniconda、配 conda、建环境、装包、.env、数据文件    | —     | `code/00_env_check.py` `code/00_env_setup.py` |
| 01 | [为什么需要 LangChain](/doc/doc/enterprise-rag-course/01-为什么需要LangChain)        | ChatModel 统一接口、invoke                   | 1     | `code/01_first_chat.py`                       |
| 02 | [消息类数据字典](/doc/doc/enterprise-rag-course/02-消息类数据字典)                       | 消息类型、AIMessage 九字段、三协议                  | 2     | `code/02_messages.py`                         |
| 03 | [ChatPromptTemplate](/doc/doc/enterprise-rag-course/03-模板与历史槽位)            | 模板、MessagesPlaceholder                  | 3     | `code/03_prompt.py`                           |
| 04 | [输出解析与流式](/doc/doc/enterprise-rag-course/04-输出解析与流式)                       | StrOutputParser、stream、SSE              | 4     | `code/04_streaming.py`                        |
| 05 | [结构化输出](/doc/doc/enterprise-rag-course/05-结构化输出)                           | with\_structured\_output、Pydantic       | 5     | `code/05_structured.py`                       |
| 06 | [记忆与会话](/doc/doc/enterprise-rag-course/06-记忆与会话)                           | 三方案：list 手搓 / InMemory / 弃用对比           | 6     | `code/06_memory.py`                           |
| 07 | [文档与切分](/doc/doc/enterprise-rag-course/07-文档与切分)                           | Document、RecursiveCharacterTextSplitter | 7     | `code/07_load_split.py`                       |
| 08 | [向量化与向量库](/doc/doc/enterprise-rag-course/08-向量化与向量库)                       | Embedding、Chroma、Retriever              | 8     | `code/08_embed_search.py`                     |
| 09 | [RAG 组装](/doc/doc/enterprise-rag-course/09-RAG组装)                          | LCEL 管道、RunnablePassthrough             | 9     | `code/09_rag.py`                              |
| 10 | [重排序与对话式 RAG](/doc/doc/enterprise-rag-course/10-重排序与对话式RAG)                | CrossEncoder、历史感知检索                     | 10    | `code/10_rerank.py`                           |
| 11 | [工具调用](/doc/doc/enterprise-rag-course/11-工具调用)                             | @tool、bind\_tools、手动执行循环                | 11    | `code/11_tools.py`                            |
| 12 | [并发与网络模型](/doc/doc/enterprise-rag-course/12-并发与网络模型)                       | 线程池、事件循环、httpx                          | 12    | `code/12_async_bench.py`                      |
| 13 | [langchain\_core 全地图](/doc/doc/enterprise-rag-course/13-langchain_core全地图) | 36 模块、5 家族、避坑                           | 盘点    | `code/13_core_map.py`                         |
| 14 | [FastAPI 服务化](/doc/doc/enterprise-rag-course/14-FastAPI服务化)                | 同步/异步路由、SSE、部署                          | 14    | `code/14_api.py`                              |
| 15 | [完整后端项目](/doc/doc/enterprise-rag-course/15-完整后端项目)                         | 配置化、索引管线、错误处理                           | 15    | `project/`                                    |

***

## 四、版本与环境（本机实测）

| 项                        | 值                                                      |
| ------------------------ | ------------------------------------------------------ |
| conda 环境                 | `learn-langchain`（Python 3.11.15）                      |
| langchain                | 1.3.14                                                 |
| langchain-core           | 1.5.1                                                  |
| langchain-anthropic      | 1.5.3（智谱 glm-4.7，Anthropic 协议）                         |
| langchain-openai         | 1.4.1（DeepSeek 备选）                                     |
| langchain-chroma         | 已装（Chroma 向量库）                                         |
| langchain-huggingface    | 已装（bge-small-zh-v1.5 embedding）                        |
| langchain-text-splitters | 1.1.2                                                  |
| fastapi / uvicorn        | 0.141.1 / 0.51.0                                       |
| 数据文件                     | `data/新人培训手册.md`、`data/十五五就业优先.txt`、`data/十五五教育规划.txt` |
| API 配置                   | `.env`（ZHIPU\_\* 主 / DEEPSEEK\_\* 备）                   |

## 五、明确不用什么（为什么）

| 不用                                       | 原因                                                                                                                                          |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **LangGraph**                            | 编排框架，依赖它的 agent 都要求你会"图"的概念；本系列用 LCEL 管道即可覆盖 RAG 全部需求，更简单直接。⚠️ 注意：`langchain` 主包 1.x 把 langgraph 列为**硬依赖**（装 langchain 自动带上），本系列不用它的 API 即可 |
| **create\_agent / create\_react\_agent** | 依赖 LangGraph 的 agent 工厂                                                                                                                     |
| **langchain-classic**                    | 1.x 把旧链（RetrievalQA、create\_retrieval\_chain）搬进这个"养老院"包，已停止演进（本机实测 1.0.8 为最新）                                                               |
| **langchain-community**                  | 停更包（0.4.2 最后一版，PyPI 实测无新版），向量库等集成已迁到官方集成包                                                                                                   |
| **langchain-experimental**               | 实验性，API 不稳定                                                                                                                                 |
| **0.x 时代的写法**                            | `from langchain.llms import OpenAI`、`from langchain.vectorstores import ...` 等——langchain 1.x 已移除这些模块，实测报 `ModuleNotFoundError`             |

> 识别弃用包的方法：`pip show <包>` 看是否活跃维护；看到 `from langchain_community`、`from langchain.chains`、`langchain-classic` 都要警惕。

***

## 六、怎么开始

1. 从 [00-环境准备](/doc/doc/enterprise-rag-course/00-环境准备) 开始，把环境跑通。
2. 每篇读完，运行配套代码（`code/` 目录），亲手看到输出。
3. 每篇的"数据字典"和"进程线程模型 / 网络模型"是重点——它们回答"这个东西到底是什么数据结构、底层到底怎么跑的"。
4. 第 15 篇是把前面所有零件拼成完整系统的最终交付。

现在，从[第 00 篇：环境准备](/doc/doc/enterprise-rag-course/00-环境准备)开始。
