Skip to content

本地模型 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 ollama

Linux:一行脚本:

bash
curl -fsSL https://ollama.com/install.sh | sh

2.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/simple

4. 速度慢

CPU 推理 7B 模型约 2-5 token/s,体验差。优化:

  • 用更小模型(3B)。
  • 用有 N 卡的机器,Ollama 自动用 GPU。
  • num_thread 参数用更多 CPU 核心。

5. 中文能力差

llama3 系列中文偏弱。中文场景用 qwen2.5deepseek,都是国产、中文训练充分。

6. 模型名带 tag

Ollama 模型名带 tag,如 qwen2.5:7bqwen2.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
  • 踩坑:模型不调工具、显存占用、速度慢、中文要选国产模型。
  • 定位:实验/隐私/内网,生产仍推荐云端。

最后一章给个模型切换与对比总览,帮你选型。