零基础入门LangChain:5分钟搭建你的第一个LLM聊天应用
《零基础5分钟搭建LLM聊天应用:LangChain避坑指南》 本文记录了作者从零搭建LangChain应用的实战经验,重点解决本地LLM调用中的常见问题。通过Ollama和LangChain组合,实现对话历史管理、类型安全调用和响应解析。关键步骤包括:创建虚拟环境、安装必要依赖(强调langchain-community必须显式安装)、拉取phi3:mini模型,以及10行核心代码实现带上下文的
标题:零基础入门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,是因为没看清三件事:
langchain-community不是可选插件,是Ollama类的强制依赖;ollama serve必须在后台持续运行,不是ollama run一次就够了;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-mini或phi3)。
我踩过的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.14 或 2.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:mini≠phi3-mini)。
下一篇文章,我们将拆解 Ollama 类的内部逻辑,并手写一个 PromptTemplate,强制 LLM 回答带 ✅/❌ emoji —— 不靠提示词玄学,靠结构化约束。
如果你也在 pip install 后盯着红色报错发过呆,欢迎在评论区留言你的「第一坑」。
(我已整理好前20条高频报错的速查表,留言“速查表”即可获取 PDF 版)
系列预告 · 第2篇
《LangChain核心组件详解:Chain、PromptTemplate与LLM的协同实践》
→ 直接对比实验:同一问题「北京今天天气如何?」
• 不用 PromptTemplate:LLM 自由发挥,输出含温度、湿度、穿衣建议、甚至编造PM2.5数值;
• 用了 PromptTemplate:输出严格为 JSON 格式 {"temperature": "22°C", "condition": "晴"}。
截图实测,拒绝概念空谈。
更多推荐


所有评论(0)