Skip to main content

00 · 环境准备:从零搭起能跑 LangChain 的机器

这是整套教程的”第 0 篇”——在小林学任何概念之前,他得先有一台能跑代码的机器。 所有命令、版本号、依赖关系都是本机实测(Windows + Miniconda + Python 3.11.15)。 读完这篇,你会有:一个独立的 conda 环境、一堆装好的 langchain 包、一个 .env 密钥文件、一段能跑的三轮对话代码。

开头的现象

小林拿到公司发的新电脑,老板说:“环境你自己配,配好跑通第一个例子给我看。” 小林打开终端,敲 python,弹出来的是 Windows 自带的 Python 3.13——他一查,这货连 pip 都没有,装包全靠 py -m pip,而且全世界只有一个 Python,装什么都装到这个全局环境里。 他想起同事老王说过的话:“Python 环境就像你的衣柜——你不分层,所有衣服堆一起,找一条裤子要翻三十分钟;你分层(conda 环境),每层放一季的衣服,换季直接把整层搬走。 小林决定:装 Miniconda,给 LangChain 单独开一个”衣柜层”(conda 环境),叫 learn-langchain
想验证”为什么需要独立环境”吗?随便建个临时环境 conda create -n test_env python=3.11 -y,在里面 pip install flask,再回到主环境 import flask——报错。两个环境互不干扰,这就是”分层”。

第一幕:装 Miniconda + 初始化终端(三步走)

下载安装包:别去官网,走清华源(官网在国外,下载慢到你怀疑人生)。 清华源地址(选最新的 Windows 安装包):
下载好后双击安装,一路下一步。安装时可以选择安装目录——小林装到了 D:\lib\miniconda3\(不占 C 盘,也方便管理)。真正决定”装完好不好用”的,是安装界面里那个勾选框:
勾不勾? 官网推荐不勾(避免 conda 跟系统 Python 的命令冲突)。但小林勾了——理由一句话:他要能在任意终端(PowerShell/VS Code/PyCharm)直接敲 conda,而不是每次先开专用终端。 风险可接受,收益是”随时随地可用”。 装完还没完——还要让 conda 初始化你的终端
这一步为什么必须做? 因为 conda activate 的原理是:conda 算出”激活要改哪些环境变量”,然后输出一串 PowerShell 赋值语句——这串语句必须有 conda init 注入的引导脚本接住并执行,环境才会真的切换。所以顺序是:装 → 勾 PATH → conda init powershell → 重启终端(看到 (base))→ 之后才能正常 conda create / conda activate

第二幕:配置 conda(先配源和路径,再建环境)

建环境之前,先花一分钟把 conda 配好——不然 conda create 会走默认官方源(可能很慢),环境也会建到默认目录。配好再建,事半功倍。

📍 先认识你的安装目录

小林的 Miniconda 装在 D:\lib\miniconda3\——这是安装时自己选的路径(不是默认的 C 盘用户目录)。 为什么特意提这个?因为后面所有配置(envs_dirspkgs_dirs)都围绕这个目录展开,你得先知道它长什么样:
如果你当初装到了默认位置(C 盘用户目录),路径会不一样,但目录结构相同——记住你自己的 envspkgs 在哪就行。判断方法:打开你安装 Miniconda 的那个文件夹,看到 envspkgs 两个子目录,就认对了。
想验证安装目录吗?在任意终端敲 conda info,看 base environment 那一行——它直接告诉你 Miniconda 装在哪。小林的输出是 base environment : D:\lib\miniconda3

🔧 你的真实配置文件长什么样(小林电脑实测)

conda 的配置都集中在一个文件:用户级 .condarc,在 C:\Users\<你的用户名>\.condarc 这是小林的 .condarc 真实内容(国内源 + 路径):
每个配置项是干嘛的: 两种配法(选一种):
配完验证(conda info 看关键几行):
⚠️ 关于 pip 源:小林的 pip config list 是空的(没配 pip 源)——他只配了 conda 的清华源,pip 装包还是走官方源。如果 pip install 很慢,可以配 pip 国内源:
想验证配置生效吗?跑 conda info,看 user config file / envs directories / package cache / channel URLs 四行——都对上了,说明配置成功,接下来建环境就会又快又稳地建到指定目录。

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

小林在任意终端里(重启过、带 (base) 前缀的终端),敲了三组命令,把环境建起来了:
然后装 langchain 生态包。小林一开始想 pip install langchain 一把梭,但老王拦住他:“langchain 主包是个’空壳’,真正干活的是各个集成包。你按需装,别一把梭。 小林按”需要什么装什么”的原则,装了这几类:

第四幕:langchain 包的”拆分哲学”——一个包变成十一个

小林看着 pip list 里那一排 langchain 包,突然意识到一个问题:“为什么 langchain 不做一个大而全的包,而要拆成这么多?” 他查了查 langchain 的历史,发现这是一个”血的教训换来的设计”:
拆分哲学一句话核心(langchain-core)定义接口,集成包实现”怎么连具体服务”,主包组装高层功能。 这样你只用智谱就只装 langchain-anthropic,不用为了一个对话拖上几十个用不上的依赖。 小林画了张依赖图(实测依赖关系):
小林的顿悟:所有包都依赖 langchain-core——它是整个生态的”地基”。而 langchain-deepseek 依赖 langchain-openai——说明 DeepSeek 底层就是 OpenAI 协议(第 01 篇他会验证这个)。看一个包的依赖,就能猜出它”是什么协议、站在谁的肩膀上”。
想验证依赖关系吗?pip show langchain-deepseek 看 Requires 一栏——会列出 langchain-corelangchain-openai。你装的每个包,pip show 都能看到它的”地基”。

第五幕:废弃的包——看到这些名字要警惕

小林在搜索教程时,频繁踩到一些”历史遗留”的包名。他专门整理了一张”避坑清单”:
小林的核心教训2024 年之前的教程,90% 是旧的。看到 from langchain.llms import OpenAI(老)、from langchain_community.xxx import(社区停更)——别照着抄,去查 pip install langchain-xxx 的官方集成包。装包前先 pip show 看它是不是活跃维护。
想验证”废弃包”吗?试着 pip install langchain-experimental 然后 import 它——能装上但会有 DeprecationWarning。再看看 langchain_community 的版本号停在 0.4.2 很久没动——这就是”停更”的信号。

第六幕:.env——密钥和模型配置不进代码

小林写代码时有个习惯:API key 绝不写进 .py 文件(会被 git 泄漏)。他建了一个 .env 文件(被 .gitignore 排除),放密钥和模型配置:
代码里用 python-dotenv 读取,密钥永远不进代码:
小林的配置哲学
  • 模型名和地址也放 .env——换模型只改 .env,不改代码(呼应第 01 篇”换供应商只改三行”)
  • .gitignore 里写 .env——防止密钥进 git 仓库
  • .env.example 是公开模板——放变量名和占位值,别人 clone 后照着填
想验证 .env 生效吗?from dotenv import load_dotenv; load_dotenv(); import os; print(os.environ.get("ZHIPU_MODEL"))——能打印出 glm-4.7 就说明读到了。把 .env 里的 ZHIPU_MODEL=glm-4.7 改成别的,重跑就生效(不用改代码)。

🔧 技术细节:这一章涉及的关键命令和配置

小林把环境准备阶段的所有”命令签名”整理成了一张速查卡(实测): ① conda 命令——环境管理
② conda config——配置(写入 ~/.condarc)
③ conda init——终端初始化
④ pip 命令——装包
⑤ Python 侧验证(包源码位置)
想验证吗?conda info 看 base environment / envs directories / channel URLs 三行;pip show langchain-deepseek 看 Requires 列(能看出它依赖 langchain-openai)。全部对上了,环境就配好了。

第七幕:第一个可运行示例——原始函数调用版(不用 |

小林想把”模板 → 模型 → 解析器”跑通,但他刻意不用第 07 篇那种 | 管道——他要先用最原始的函数调用看清楚每一步发生了什么,每个环节的数据长什么样。 他写了这段代码(也是 narrative-course/code/00_env_setup.py):
小林盯着运行输出,看到了他想要的完整数据流(每轮两个大 JSON): 第 1 轮·给模型的输入消息列表(只有 system + 当前问题,因为 history 还是空的):
第 1 轮·模型返回的 AIMessage(完整字段:content、response_metadata、usage_metadata、type、id、tool_calls):
第 2 轮·输入消息列表(history 滚雪球了:system + 第1轮 human + 第1轮 ai + 当前问题):
小林看着这三轮的输出,明白了这条”原始链路”的每个环节:
他发现了一个关键点parser.invoke(ai_msg) 接收的是 AIMessage,返回的是字符串——StrOutputParser 就是”剥壳取 content”。这跟他第 07 篇学的 | parser 是同一个东西,只是这次他亲眼看到了”壳”和”肉”。
想验证这个示例吗?把 00_env_setup.py 复制到你的项目目录(旁边要有 .env),python 00_env_setup.py——你会看到三轮对话,每轮完整打印:给模型的输入消息列表(JSON)+ 模型返回的 AIMessage(JSON)+ 转换后的文本。第 2 轮的输入里,第 1 轮的回复已经躺在历史里了。

边界——这套环境什么时候会坑你

小林用了一天,摸清了这套环境的边界: 能干的:独立环境隔离依赖、按需装集成包、.env 管密钥、原始函数调用看清数据流。 会坑你的
  • 忘记 conda activate learn-langchain——你 python 可能还在 base 环境,import langchain 直接 ModuleNotFoundError。终端提示符看到 (learn-langchain) 才算激活成功。
  • 装了 langchain 但没装 langchain-anthropic——from langchain_anthropic import ChatAnthropic 报错。主包是空壳,集成包才干活。
  • pip 装到了错误环境——如果没激活环境就 pip install,可能装进 base。conda activate,再确认 pip --version 指向 learn-langchain。
  • .env 没在代码运行目录——load_dotenv() 默认读当前目录的 .env,代码和 .env 不在一起就读不到。要么 .env 放代码同目录,要么 load_dotenv("路径/.env")
  • 密钥写进代码/提交 git——泄漏风险。.env 必须被 .gitignore 排除。
想验证”环境坑”吗?conda activate 一个不存在的环境试试,或者故意在 base 环境 import langchain_anthropic——报错信息会告诉你”没装对地方”。

结论(小林用一天换来的)

环境 = 独立 conda 环境(learn-langchain,Python 3.11)+ 按需安装的 langchain 集成包 + .env 管密钥。 langchain 拆分哲学:langchain-core 定义接口(地基),集成包实现”怎么连具体服务”,langchain 主包组装高层功能——看一个包的依赖就能猜它是什么协议。废弃包(langchain_community/langchain-classic)能用但别依赖。 第一个示例用原始函数调用(模板 → 模型 invoke → 解析器 → 历史滚雪球),不用 | 管道,为的是看清每一步的数据长什么样。

复现信号:什么时候你会想起这一章

  1. import langchain 报错——先 conda activate learn-langchain,再 pip list | findstr langchain 查装没装。
  2. 想改 conda 源/环境目录——编辑 C:\Users\<用户名>\.condarc(channels/envs_dirs/pkgs_dirs),改完 conda info 验证。
  3. 想看包源码——去 envs\learn-langchain\Lib\site-packages\langchain_xxx\ 翻。
  4. pip 下载慢——pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  5. from langchain_anthropic import ... 报错——主包装了但集成包没装,pip install langchain-anthropic
  6. 想换模型厂商——改 .env 的 ZHIPU_* / DEEPSEEK_* 配置,代码不用动。
  7. 看到 langchain_community 的教程——停更包,去查官方集成包。
  8. 想看”数据流”长什么样——用这篇的原始函数调用版,每步打印完整 JSON。
现在你的机器能跑 LangChain 了。小林要开始真正的冒险了——翻到第 01 篇:第一次对话