Appearance
本地模型 Ollama
前面所有模型都要联网、要 API Key、要付费。如果你想完全免费、数据不出本机、断网也能跑,就用 Ollama——在本地跑开源大模型的工具。本章讲怎么把它接进 LangGraph。
一、Ollama 简介
Ollama 是一个本地运行开源大模型的桌面/命令行工具,类似"大模型的 Docker"。它把模型权重管理、推理引擎、HTTP API 全打包好,一行命令就能跑起一个模型。
特点:
- 完全免费,不收 API 费。
- 数据不出本机,隐私最好。
- 断网可用,模型下载到本地。
- API 兼容 OpenAI 格式,很多工具直接能接。
支持的模型:Llama3、Qwen2.5、DeepSeek、Mistral、Phi3、Gemma 等主流开源模型。
二、安装 Ollama
2.1 三平台安装
Windows:去 https://ollama.com/download 下载 OllamaSetup.exe,双击安装即可。装完默认后台运行,监听 localhost:11434。
macOS:同样官网下载,或用 Homebrew:
bash
brew install ollamaLinux:一行脚本:
bash
curl -fsSL https://ollama.com/install.sh | sh2.2 启动服务
Windows/macOS 装完会有个图标,默认开机自启。Linux 手动启动:
bash
ollama serve验证服务在跑:
bash
curl http://localhost:11434
# 返回 "Ollama is running"2.3 拉取模型
bash
# 通义千问 7B(中文好,推荐新手)
ollama pull qwen2.5:7b
# Llama3.2 3B(小,老电脑能跑)
ollama pull llama3.2:3b
# DeepSeek-R1 7B(推理强)
ollama pull deepseek-r1:7b
# 查看已拉模型
ollama list模型大小:7B 约 4-5GB,3B 约 2GB。第一次拉要下载,之后离线可用。
2.4 硬件要求
- 7B 模型:约需 8GB 显存或 16GB 内存(CPU 推理也能跑,慢)。
- 3B 模型:4GB 显存/8GB 内存够。
- 没 N 卡也能用,Ollama 自动用 CPU,只是慢。
三、ChatOllama 用法
3.1 安装
bash
pip install langchain-ollama -i https://pypi.tuna.tsinghua.edu.cn/simple旧版用 langchain-community 里的 ChatOllama,推荐用新的 langchain-ollama,更新更及时。
3.2 最简调用
python
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage
llm = ChatOllama(
model="qwen2.5:7b",
temperature=0,
base_url="http://localhost:11434", # 默认值,可省略
)
resp = llm.invoke([HumanMessage(content="你好,用一句话介绍自己")])
print(resp.content)3.3 常用参数
python
llm = ChatOllama(
model="qwen2.5:7b",
temperature=0,
num_ctx=4096, # 上下文窗口 token 数
num_predict=1024, # 最大输出 token
)num_ctx 要注意:默认只有 2048,做智能体会"忘事",建议设 4096 或更高(吃内存/显存)。
3.4 流式
python
for chunk in llm.stream([HumanMessage(content="写一首五言绝句")]):
print(chunk.content, end="", flush=True)四、本地模型的工具调用
这是关键也是最容易踩坑的地方。不是所有本地模型都支持工具调用,要选对模型:
| 模型 | 工具调用 | 备注 |
|---|---|---|
qwen2.5:7b / qwen2.5:14b | ✅ 支持 | 中文+工具调用,首选 |
llama3.1:8b 及以上 | ✅ 支持 | 英文为主 |
llama3.2:3b | ⚠️ 部分支持 | 小模型易出错 |
deepseek-r1:7b | ❌ 推理模型,不擅长工具 | 适合纯推理 |
phi3 / gemma2 | ❌/⚠️ 不稳 | 不推荐做智能体 |
新手做智能体首选 qwen2.5:7b:中文好、工具调用稳、7B 大小适中。
用法和云端模型一样:
python
from langchain_core.tools import tool
@tool
def add(a: float, b: float) -> float:
"""两数相加。"""
return a + b
llm = ChatOllama(model="qwen2.5:7b", temperature=0)
llm_with_tools = llm.bind_tools([add])
resp = llm_with_tools.invoke("3+5=?")
print(resp.tool_calls)五、在 LangGraph 中构建本地智能体
python
from langchain_ollama import ChatOllama
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent
@tool
def add(a: float, b: float) -> float:
"""两数相加。"""
return a + b
@tool
def multiply(a: float, b: float) -> float:
"""两数相乘。"""
return a * b
@tool
def get_weather(city: str) -> str:
"""查城市天气,支持北京/上海。"""
return {"北京": "晴 25°C", "上海": "多云 28°C"}.get(city, "未知")
agent = create_react_agent(
model=ChatOllama(model="qwen2.5:7b", temperature=0, num_ctx=4096),
tools=[add, multiply, get_weather],
prompt="你是中文助手,按需调工具,简体中文回答。",
)
result = agent.invoke({
"messages": [HumanMessage(content="查上海天气,再算 25 乘以 4")]
})
print(result["messages"][-1].content)完全本地跑、零 API 费用、数据不外泄。
六、完整可运行示例
python
from langchain_ollama import ChatOllama
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent
# 1. 基础对话
llm = ChatOllama(model="qwen2.5:7b", temperature=0, num_ctx=4096)
print("=== 基础对话 ===")
print(llm.invoke([HumanMessage(content="用一句话介绍 LangGraph")]).content)
# 2. 流式
print("\n=== 流式 ===")
for chunk in llm.stream([HumanMessage(content="写一句关于编程的话")]):
print(chunk.content, end="", flush=True)
print()
# 3. 工具调用 ReAct
@tool
def add(a: float, b: float) -> float:
"""两数相加。"""
return a + b
@tool
def get_weather(city: str) -> str:
"""查城市天气,支持北京/上海。"""
return {"北京": "晴 25°C", "上海": "多云 28°C"}.get(city, "未知")
print("\n=== ReAct 智能体 ===")
agent = create_react_agent(
llm, [add, get_weather],
prompt="你是中文助手,按需调工具,简体中文回答。",
)
r = agent.invoke({"messages": [HumanMessage(content="北京天气?算 80+90")]})
print(r["messages"][-1].content)七、常见踩坑
1. 本地模型不调工具
最常见问题。表现为 tool_calls 为空,模型直接"嘴上回答"。原因:
- 模型不支持工具调用(如 deepseek-r1)。换
qwen2.5:7b。 - 工具描述写得太差。改 docstring,加示例。
num_ctx太小,工具 schema 占满了上下文。设num_ctx=4096+。
2. 显存/内存占用高
7B 模型加载占 5GB+。跑智能体时模型常驻显存,长时间不用可以关掉:
bash
# Windows/macOS:关掉 Ollama 应用
# Linux
pkill ollama跑多个模型会同时占多份资源,按需切换。
3. 流式不生效
有些模型在 Ollama 里流式表现不一致。确保 ChatOllama 没禁用流式,并升级版本:
bash
pip install -U langchain-ollama ollama -i https://pypi.tuna.tsinghua.edu.cn/simple4. 速度慢
CPU 推理 7B 模型约 2-5 token/s,体验差。优化:
- 用更小模型(3B)。
- 用有 N 卡的机器,Ollama 自动用 GPU。
- 调
num_thread参数用更多 CPU 核心。
5. 中文能力差
llama3 系列中文偏弱。中文场景用 qwen2.5 或 deepseek,都是国产、中文训练充分。
6. 模型名带 tag
Ollama 模型名带 tag,如 qwen2.5:7b、qwen2.5:14b。tag 写错会报"model not found"。用 ollama list 看准确名字。
八、何时用本地模型
| 场景 | 推荐 |
|---|---|
| 学习练手、不想花钱 | ✅ Ollama |
| 隐私敏感(医疗/金融内部数据) | ✅ Ollama |
| 内网/断网部署 | ✅ Ollama |
| 要最强能力 | ❌ 云端 GPT/Claude/Qwen-Max |
| 高并发生产 | ❌ 本地性能跟不上 |
| 复杂工具调用 | ⚠️ 用云端更稳 |
本地模型定位:实验、隐私、内网。生产环境要稳还是要靠云端大模型。
九、小结
- Ollama 让开源大模型本地一键跑,免费、隐私好、断网可用。
ChatOllama(model="qwen2.5:7b")接进 LangGraph,和云端模型 API 一致。- 工具调用要选对模型,首选
qwen2.5:7b。 - 踩坑:模型不调工具、显存占用、速度慢、中文要选国产模型。
- 定位:实验/隐私/内网,生产仍推荐云端。
最后一章给个模型切换与对比总览,帮你选型。