标题:零基础入门LangChain:5分钟搭建你的第一个LLM聊天应用

——终端报错、重装Ollama六次、喝完半杯凉咖啡后,我写下了这份可100%复现的实操指南


我为什么在凌晨1点还在改pip install命令?

上周三晚上,我想快速验证一个想法:用本地模型读会议纪要PDF,自动提取「谁在什么时间前完成什么事」。
直接调 Ollama REST API?写了30行代码后卡住了——

  • 第二轮提问时,LLM完全不记得上一句问了啥;
  • 换个模型(从phi3:mini切到qwen2:1.5b),得手动改6处URL和参数;
  • system prompt硬编码在字符串里,一加换行就报JSON解析错误……

直到我把官方文档里这行代码真正跑通:

llm.invoke([HumanMessage(content="你好")])

我才意识到:LangChain 不是“另一个大框架”,而是把 LLM 当成函数用的最小执行单元封装
它不训练模型,也不托管服务,只做一件事:让你少写重复的胶水代码。

而我那晚反复失败,不是因为不会写Python,是因为没看清三件事:

  1. langchain-community 不是可选插件,是 Ollama 类的强制依赖
  2. ollama serve 必须在后台持续运行,不是 ollama run 一次就够了;
  3. phi3:mini 的冒号 : 是模型标识符的一部分,写成 phi3-mini 就连不上。

这篇就是为你省下那3分钟发呆+两杯凉咖啡写的。所有命令均在 macOS Sonoma + Python 3.11.8 + Ollama 0.3.12 终端实测通过。


LangChain 真正帮你省掉的,是这三段必写代码

别被“Chain”吓住。它解决的全是调原生API时你不得不手写、且每次都要修bug的逻辑。我们用真实问题对照看:

问题1:每次请求都要拼接 messages 列表,稍错格式就 422
→ 原生写法(易错):

{"messages": [{"role": "user", "content": "你好"}], "temperature": 0.3}

→ LangChain 写法(类型安全):

llm.invoke([HumanMessage(content="你好")])

✅ 自动转成 LLM 可接收格式,字段名、嵌套层级、角色枚举全由 langchain_core.messages 校验。

问题2:响应返回的是带 metadata 的 dict,你却只想取 .content
→ 原生解析(易漏):

response.json()["message"]["content"]  # 但有些模型返回的是 ["response"] 字段

→ LangChain 解析(开箱即用):

response = llm.invoke([...])
print(response)  # 直接输出字符串:"你好!我是phi3..."

✅ 默认提取 content 字段,避免手动遍历响应结构。

问题3:对话历史要自己存 Redis/文件,还要处理 session ID 和过期
→ 原生管理(重复劳动):

# 存历史 → 取历史 → 合并新消息 → 传给LLM → 再存回去

→ LangChain 管理(一行初始化):

from langchain_core.chat_history import InMemoryChatMessageHistory
history = InMemoryChatMessageHistory()
history.add_message(HumanMessage(content="你好"))
history.add_message(AIMessage(content="你好!"))
llm.invoke(history.messages)  # 直接传入对象列表

InMemoryChatMessageHistory 是内存级实现,适合本地验证;生产环境换 RedisChatMessageHistory 仅需改初始化方式,业务逻辑零改动。

它不是魔法,是把 LLM 当作标准函数调用的协议层


实操:5分钟跑通(严格按顺序执行,跳步必报错)

✅ 前置确认:已安装 Ollama,终端执行 ollama list 能看到空列表或已有模型

步骤1:建干净虚拟环境(防包冲突)
python -m venv langchain-env
source langchain-env/bin/activate  # macOS/Linux
# Windows 用户:langchain-env\Scripts\activate.bat
步骤2:安装两个必须包(少一个都 import 失败)
pip install --upgrade pip
pip install langchain langchain-community
pip install ollama

⚠️ 注意:langchain-core 是底层依赖,会被自动安装;但 langchain-community 不会自动带进来,必须显式安装。这是 90% 新手首次 import langchain_community.llms 报错的根源。

步骤3:拉取并验证模型(选 phi3:mini,2GB,国内源 30 秒内)
ollama pull phi3:mini
# 手动测试是否能响应(关键!)
ollama run phi3:mini
# 输入 "hi" → 应立刻返回响应 → Ctrl+C 退出

✅ 如果卡住或报 pull failed,请先执行 ollama serve(新开终端运行,保持后台常驻)。

步骤4:写 chat_simple.py(核心逻辑仅 10 行)

chat_simple.py 中,我们用三行代码完成对话历史管理:

  • 初始化 InMemoryChatMessageHistory
  • .add_message() 记录人类和 AI 消息;
  • history.messages(对象列表)传给 llm.invoke()
from langchain_community.llms import Ollama
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.chat_history import InMemoryChatMessageHistory

# 1. 初始化本地LLM(model名必须与 ollama list 输出完全一致)
llm = Ollama(model="phi3:mini", temperature=0.3)

# 2. 创建内存对话历史
history = InMemoryChatMessageHistory()

# 3. 添加初始对话(模拟已有上下文)
history.add_message(HumanMessage(content="你好"))
history.add_message(AIMessage(content="你好!我是phi3,很高兴认识你。"))

# 4. 发起新提问并获取响应(重点:传 history.messages,不是字符串!)
history.add_message(HumanMessage(content="你叫什么名字?"))
response = llm.invoke(history.messages)
print("LLM回复:", response)

运行:

python chat_simple.py

✅ 预期输出(首次运行约 3–5 秒,后续秒回):

LLM回复: 我的名字是Phi-3,是微软推出的轻量级语言模型。

⚠️ 关键避坑提示:

  • 若报 ConnectionError: Failed to connect to http://localhost:11434 → 执行 ollama serve(另开终端,保持运行);
  • 若报 ValidationError: Input should be a valid dictionary or object → 缺 langchain-community,补 pip install langchain-community
  • 若报 ImportError: cannot import name 'Ollama' → 检查 pip list | grep langchain,确认 langchain-community 已安装;
  • 若输出为空或超时 → ollama list 确认模型名是 phi3:mini(不是 phi3-miniphi3)。

我踩过的5个坑,按发生顺序整理成解决方案

报错现象 根本原因 修复命令 验证方式
ImportError: cannot import name 'Ollama' langchain-community 未安装 pip install langchain-community python -c "from langchain_community.llms import Ollama" 不报错
ConnectionError: Failed to connect to http://localhost:11434 ollama serve 未运行 新开终端执行 ollama serve 浏览器访问 http://localhost:11434/health 返回 {"status":"ok"}
ValidationError: Input should be... llm.invoke() 传了字符串而非 HumanMessage 列表 改为 llm.invoke([HumanMessage(content="你好")]) 运行成功并打印字符串响应
ollama run phi3:mini 卡住无响应 模型未完整拉取或磁盘空间不足 ollama rm phi3:mini && ollama pull phi3:mini ollama list 显示 phi3:mini 且 SIZE > 0B
ModuleNotFoundError: No module named 'pydantic.v1' Python < 3.9 或 pydantic 版本冲突 pip install "pydantic<2" 或升级 Python ≥ 3.9 python -c "import pydantic; print(pydantic.VERSION)" 输出 1.10.142.x(LangChain v0.3+ 兼容)

Windows 用户补充:若 ollama run 提示权限错误,请以管理员身份运行终端;项目路径避免含中文或空格(推荐 C:\langchain-demo)。


这5分钟教会我的事:从 invoke() 开始,才是真入门

LangChain 的学习起点不是 Chain,不是 Agent,而是这一行:

llm.invoke([HumanMessage(content="你好")])

它代表了整个生态的契约:

  • 输入必须是 BaseMessage 对象列表;
  • 输出默认是 str
  • 错误几乎全是缺失依赖或配置偏差,极少是语法错误。

所以,当你再看到报错:

  • ValidationError → 先检查 pip list 是否有 langchain-community
  • ConnectionError → 先执行 ollama serve 并确认端口;
  • ImportError → 先核对模块名大小写和冒号(phi3:miniphi3-mini)。

下一篇文章,我们将拆解 Ollama 类的内部逻辑,并手写一个 PromptTemplate,强制 LLM 回答带 ✅/❌ emoji —— 不靠提示词玄学,靠结构化约束。

如果你也在 pip install 后盯着红色报错发过呆,欢迎在评论区留言你的「第一坑」。
(我已整理好前20条高频报错的速查表,留言“速查表”即可获取 PDF 版)


系列预告 · 第2篇
《LangChain核心组件详解:Chain、PromptTemplate与LLM的协同实践》
→ 直接对比实验:同一问题「北京今天天气如何?」
• 不用 PromptTemplate:LLM 自由发挥,输出含温度、湿度、穿衣建议、甚至编造PM2.5数值;
• 用了 PromptTemplate:输出严格为 JSON 格式 {"temperature": "22°C", "condition": "晴"}
截图实测,拒绝概念空谈。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐