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,而不是每次先开专用终端。 风险可接受,收益是”随时随地可用”。
装完还没完——还要让 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_dirs、pkgs_dirs)都围绕这个目录展开,你得先知道它长什么样:
envs 和 pkgs 在哪就行。判断方法:打开你安装 Miniconda 的那个文件夹,看到 envs 和 pkgs 两个子目录,就认对了。
想验证安装目录吗?在任意终端敲conda info,看base environment那一行——它直接告诉你 Miniconda 装在哪。小林的输出是base environment : D:\lib\miniconda3。
🔧 你的真实配置文件长什么样(小林电脑实测)
conda 的配置都集中在一个文件:用户级.condarc,在 C:\Users\<你的用户名>\.condarc。
这是小林的 .condarc 真实内容(国内源 + 路径):
两种配法(选一种):
conda info 看关键几行):
pip config list 是空的(没配 pip 源)——他只配了 conda 的清华源,pip 装包还是走官方源。如果 pip install 很慢,可以配 pip 国内源:
想验证配置生效吗?跑conda info,看user config file/envs directories/package cache/channel URLs四行——都对上了,说明配置成功,接下来建环境就会又快又稳地建到指定目录。
第三幕:创建 learn-langchain 环境 + 装包
小林在任意终端里(重启过、带(base) 前缀的终端),敲了三组命令,把环境建起来了:
pip install langchain 一把梭,但老王拦住他:“langchain 主包是个’空壳’,真正干活的是各个集成包。你按需装,别一把梭。”
小林按”需要什么装什么”的原则,装了这几类:
第四幕:langchain 包的”拆分哲学”——一个包变成十一个
小林看着pip list 里那一排 langchain 包,突然意识到一个问题:“为什么 langchain 不做一个大而全的包,而要拆成这么多?”
他查了查 langchain 的历史,发现这是一个”血的教训换来的设计”:
langchain-core——它是整个生态的”地基”。而 langchain-deepseek 依赖 langchain-openai——说明 DeepSeek 底层就是 OpenAI 协议(第 01 篇他会验证这个)。看一个包的依赖,就能猜出它”是什么协议、站在谁的肩膀上”。
想验证依赖关系吗?pip show langchain-deepseek看 Requires 一栏——会列出langchain-core和langchain-openai。你装的每个包,pip show都能看到它的”地基”。
第五幕:废弃的包——看到这些名字要警惕
小林在搜索教程时,频繁踩到一些”历史遗留”的包名。他专门整理了一张”避坑清单”: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 info看 base environment / envs directories / channel URLs 三行;pip show langchain-deepseek看 Requires 列(能看出它依赖 langchain-openai)。全部对上了,环境就配好了。
第七幕:第一个可运行示例——原始函数调用版(不用 |)
小林想把”模板 → 模型 → 解析器”跑通,但他刻意不用第 07 篇那种 | 管道——他要先用最原始的函数调用看清楚每一步发生了什么,每个环节的数据长什么样。
他写了这段代码(也是 narrative-course/code/00_env_setup.py):
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 → 解析器 → 历史滚雪球),不用 | 管道,为的是看清每一步的数据长什么样。
复现信号:什么时候你会想起这一章
import langchain报错——先conda activate learn-langchain,再pip list | findstr langchain查装没装。- 想改 conda 源/环境目录——编辑
C:\Users\<用户名>\.condarc(channels/envs_dirs/pkgs_dirs),改完conda info验证。 - 想看包源码——去
envs\learn-langchain\Lib\site-packages\langchain_xxx\翻。 - pip 下载慢——
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple。 from langchain_anthropic import ...报错——主包装了但集成包没装,pip install langchain-anthropic。- 想换模型厂商——改 .env 的 ZHIPU_* / DEEPSEEK_* 配置,代码不用动。
- 看到
langchain_community的教程——停更包,去查官方集成包。 - 想看”数据流”长什么样——用这篇的原始函数调用版,每步打印完整 JSON。