Skip to main content

00 · 环境准备:能跑起来,才有后面的一切

本片目标:从零搭起能跑 LangChain 的机器——装 Miniconda、配 conda、建 learn-langchain 环境、装齐所有包、配好 .env、跑通第一段”能验证”的代码。 数据字典:.condarc 配置项、包版本一览、.env 变量、数据文件清单。

1. 上集回顾

这是第 0 篇,没有上一篇。但整个系列的逻辑必然性从这里开始:
你的目标是把 LangChain 学到能搭 RAG 对话机器人。而 LangChain 是一个生态(十几个包),不是一个大包。装错了、装少了、装到别的环境里,后面每一篇的代码都会报 ModuleNotFoundError。所以第一篇必须是”环境”——不是因为它简单,而是因为它是后面所有代码能运行的地基
另外,你本机可能没有独立的 Python 环境、没有 conda——这些都要从零配。这套教程的所有命令都是 Windows + Miniconda + Python 3.11 实测

2. 第一幕:装 Miniconda(三步走)

为什么要 Miniconda(而不是直接装 Python):Python 环境就像衣柜——不分层,所有包堆一起,装什么都互相干扰。conda 能建独立环境层learn-langchain),每层放一套依赖,互不污染。 ① 下载:别去官网(国外,下载慢),走清华源:
② 安装:一路下一步。两个关键点:
  • 安装目录:建议装到非 C 盘(如 D:\lib\miniconda3),不占系统盘;
  • 勾选Add Miniconda3 to my PATH environment variable ☑ ——勾了才能在任意终端直接敲 conda(官网默认不勾,但勾了更方便,风险可接受)。
③ 验证:打开新终端,确认 conda 真的进了环境变量(PATH):
安装时添加了哪些环境变量(Miniconda 安装器自动改的,主要是 PATH):
没勾选 “Add to PATH” 怎么办:装完发现 where.exe conda 报”找不到”,不用重装——手动把上面三个路径加进用户 PATH 即可,或者装完在开始菜单用 “Anaconda Prompt (miniconda3)” 快捷方式(它自带 PATH),后续课程命令照常能跑。

3. 第二幕:conda init + 配置 .condarc

3.1 conda init(终端初始化)

装完 conda 还不能直接用 conda activate——需要让 conda 往你的终端配置($PROFILE)注入引导脚本:
重启后如何验证conda init 会在 C:\Users\<你>\Documents\WindowsPowerShell\profile.ps1 注入引导脚本,每次新开终端自动执行 conda activate 'base'验证方式:新开一个终端,看提示符前面有没有 (base)
如果新终端提示符没有 (base),但 conda activate learn-langchain 能正常切换(提示符变 (learn-langchain)),说明 conda 本身已工作——只是你的终端没有加载 conda 注入的引导脚本(profile.ps1),重新检查 conda init powershell 是否执行过、终端是否完全关闭后重新打开(不是新开标签页)。
为什么必须做conda activate 的原理是——conda 算出要改哪些环境变量,输出一串 PowerShell 赋值语句,这串语句必须有 init 注入的引导脚本接住并执行,环境才会真的切换。

3.2 配置 .condarc(先配源和路径,再建环境)

建环境之前先配 conda——不然下载走官方源(慢),环境建到默认目录。配置文件在 C:\Users\<你>\.condarc
数据字典:.condarc 配置项
为什么 6 个源pkgs/main 是主通道(绝大多数包);pro/r/free/ 是清华镜像的历史/专用通道(装极老包时能找到);conda-forge 是社区源镜像(有些包只在 conda-forge 有);defaults 是官方兜底。strict 模式下按列表顺序逐个找,main 找不到才往后走。
配置方式(二选一)
验证conda infobase environment / envs directories / channel URLs 三行。
pip 源(可选):pip 装包慢可配国内源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

4. 第三幕:创建 learn-langchain 环境 + 装包

4.1 建环境

4.2 装包(本系列全套)

注意:langchain 主包是”空壳”,真正干活的是各集成包。按需装,别一把梭。

5. 数据字典:包版本一览(本机实测,2026-08)

包拆分哲学(为什么这么多包)
为什么拆:LangChain 0.x 时代一个大包装所有东西,升级一个组件整个包跟着动。1.x 拆成”核心定义接口 + 集成包实现具体服务”。你只用智谱就只装 langchain-anthropic。

6. .env:密钥和模型配置不进代码

.env 放在项目根目录(已被 .gitignore 排除),密钥永远不进 .py 文件:
数据字典:.env 变量
验证 .env 生效python -c "from dotenv import load_dotenv; load_dotenv(); import os; print(os.environ.get('ZHIPU_MODEL'))"——能打印出 glm-4.7 就说明读到了。

7. 数据文件(RAG 的”原料”)


8. 弃用包避坑(看到就绕道)

下表全部经本机实测验证(2026-08),langchain 主包 1.3.14 已不再包含 llms/chains/vectorstores 这些旧模块——用 0.x 写法会直接 ModuleNotFoundError
识别方法:pip show <包> 看维护状态;import 时报 ModuleNotFoundError 的 0.x 写法直接绕道。2024 年之前的教程 90% 是旧的,看到 langchain_community/langchain.chains/from langchain.llms 别照着抄。 为什么 langgraph 装着却不用langchain 主包把 langgraph 列为硬依赖(1.x 设计如此),所以 pip install langchain 就自动装上。但”装了”≠“必须用”——本系列刻意不用它的 API(图编排),全部用 LCEL 管道完成,少学一个框架、少踩一类坑。

9. 验证 ①:环境检查脚本

配套代码 code/00_env_check.py——打印所有关键包版本 + 数据文件 + .env 变量名(不含值),全绿就说明环境 OK。
预期输出(节选,本机实测)

10. 验证 ②:第一个可运行示例(原始函数调用版,不用 |

环境检查过了,但你还没”看到” LangChain 干活。这段示例刻意不用第 09 篇的 | 管道——用最原始的函数调用看清每一步:模板拼消息 → 模型返回 AIMessage → 解析器剥壳 → 历史滚雪球。全程打印完整 JSON 数据字典。 配套代码 code/00_env_setup.py
预期输出(节选,本机实测 2026-08)
这个示例的意义:你亲眼看到了三件事——① 输入是消息列表不是字符串;② 模型返回的是 AIMessage 对象不是字符串;③ “记忆”就是把历史消息不断 append 进列表。这三点是后面全部概念的地基。

11. 边界

  • 没激活环境import langchain 直接 ModuleNotFoundError。看终端提示符是 (learn-langchain) 才算激活。
  • 装错环境 → 没激活就 pip install,可能装进 base。先激活再装。
  • 忘记 conda init + 重启终端conda activate 不生效。新终端提示符没有 (base)conda activate 报错。重跑 conda init powershell 再完全重启终端。
  • 安装时没勾 “Add to PATH”where.exe conda 报”找不到”,但 conda 已装好。手动把 D:\lib\miniconda3...\Scripts...\condabin 加进用户 PATH(或直接用开始菜单的 Anaconda Prompt),不用重装。
  • load_dotenv() 找不到 .env → 它不是”只读当前目录”,而是从调用者 .py 文件所在目录逐级向上搜索 .env(实测:在 code/ 子目录跑也能读到项目根的 .env)。搜不到的场景:调用文件与 .env 不在同一棵目录树(如从 C:\Windows 跑)→ 返回 False、变量为空。稳妥做法:load_dotenv(PROJECT_ROOT / ".env") 显式传绝对路径(本系列 code/ 里都是这么写的)。
  • 密钥写进代码 → 泄漏风险。.env 必须被 .gitignore 排除。

推荐资料(延伸阅读)


12. 未完待续

环境好了,模型连上了。第 01 篇要回答第一个”为什么”:我直接 requests.post 调智谱 API 不就行了,为什么要 LangChain? 01 · 为什么需要 LangChain