在本地运行大语言模型——Ollama

195 阅读4分钟

前言:接触 AI 已经有一段时间了,从最开始用 ChatGPT 写点脚本,到尝试接入 API 做应用,越用越觉得:云端模型固然强大,但隐私、延迟和费用真的是绕不开的坑。最近正好学到了 Ollama —— 一个能让大语言模型在本地跑起来的工具。折腾了一下之后,发现它真的把复杂的事情简化了很多。

Ollama:让本地跑大模型变简单

Ollama 是个开源项目,目标就是降低“本地跑大模型”的门槛。它帮你把复杂的模型管理、推理调用都封装好了,留给开发者一个熟悉的 API 接口。换句话说:

  • 数据安全:数据全程在本地,不用担心外泄
  • 延迟更低:没有网络传输环节,响应快
  • 费用一次性:模型下好就能无限用,不再受 API 计费绑架
  • 完全掌控:可以换模型、改参数,随心折腾

对习惯了 OpenAI API 的开发者来说,迁移到 Ollama 基本没啥学习成本。


快速上手:用 Next.js 做一个本地对话接口

这里给一个最常见的场景:在 Next.js 里接入 Ollama,做一个对话接口。

1. 安装 Ollama 并启动模型

去官网下载Ollama:ollama.com/download

// 下载并启动一个模型,比如 deepseek-r1:1.5b
ollama run deepseek-r1:1.5b

image.png

Ollama 默认会在本地 11434 端口开一个 API 服务,后面所有请求都走这个接口。

image.png


2. Next.js 创建 API 路由

在项目中新建一个 API 路由,代理请求到 Ollama:

// app/api/chat/route.ts
import { NextRequest } from 'next/server'
import {
  Message,
  ChatRequest,
  ChatResponse
} from '@/types/chat'

const OLLAMA_API_URL = 'http://localhost:11434/api/chat'
const MODEL_NAME = 'deepseek-r1:1.5b'

export async function POST(request: NextRequest) {
  try {
    const body: { messages: Message[] } = await request.json()

    const ollamaRequestBody: ChatRequest = {
      model: MODEL_NAME,
      messages: body.messages,
      stream: false
    }

    const response = await fetch(OLLAMA_API_URL, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(ollamaRequestBody)
    })

    if (!response.ok) {
      const errorText = await response.text()
      return Response.json({
        error: `Ollama API ERROR: ${errorText}`
      })
    }

    const ollamaData: ChatResponse = await response.json()
    return Response.json(ollamaData)
  } catch (err) {
    console.error('Chat API Error', err)
    return Response.json({ status: 500 })
  }
}

写一层代理,让前端只调 /api/chat,而不用直接连 11434 端口,后期扩展更方便。


3. 定义 TypeScript 类型

// types/chat.ts
export type Message = {
  role: 'user' | 'assistant' | 'system' | 'tool';
  content: string;
}

export type ChatResponse = {
  model: string;
  created_at: string;
  message: Message;
  done: boolean;
  total_duration: number;
  load_duration: number;
  prompt_eval_count: number;
  prompt_eval_duration: number;
  eval_count: number;
  eval_duration: number;
}

export type ChatRequest = {
  model: string;
  messages: Message[];
  stream?: boolean; // 默认是 false
}

定义类型后,前后端交互会更清晰,避免传参写错。


4. 前端调用接口

const sendMessage = async (message: string) => {
  const response = await fetch('/api/chat', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      messages: [
        { role: 'user', content: message }
      ]
    }),
  });

  const data = await response.json();
  console.log('AI 回复:', data.message.content);
};

调用方式和常见的云端 API 没啥区别,迁移成本几乎为零。

成品展示:

image.png

更进阶的玩法

Ollama 不止是跑模型,还提供了很多实用功能。

模型管理

# 查看已下载的模型
ollama list

# 下载新模型
ollama pull llama2

# 删除模型
ollama rm llama2

# 创建自定义模型
ollama create my-model -f Modelfile

随时切换不同模型,甚至能写 Modelfile 自定义一个属于自己的模型。


GPU 加速

如果你有 NVIDIA 显卡,可以让推理速度直接起飞:

# 启动时检查 GPU 支持
ollama serve --gpu

# 指定 GPU 加速的层数
OLLAMA_GPU_LAYERS=35 ollama run llama2

一般 8GB 显存就能带来比较明显的提升。


自定义配置

Ollama 支持通过 Modelfile 来控制模型参数:

FROM llama2
PARAMETER temperature 0.7
PARAMETER stop "AI:"
SYSTEM """你是一个乐于助人的助手"""

可以设定模型风格,比如回答的温度、停止符、系统提示等。


能派上用场的地方

说了半天,Ollama 适合拿来干什么?结合几个常见场景:

  • 企业内部问答系统:数据留在公司本地,安全合规
  • 离线助手:出差、飞机上或者没网的时候依旧能用
  • 科研教学:研究人员可以本地测试不同模型,不受 API 限制
  • 个人隐私场景:比如写日记、处理文件,更安心

总结

Ollama 让“在本地跑大模型”变得像用 API 一样简单。它解决了隐私、延迟和费用的问题,还给开发者更多可控性和自由度。

未来随着硬件更强、模型更轻量,本地 AI 会越来越普及。无论是做企业应用还是个人项目,Ollama 都值得一试。