105-Ollama本地部署-Llama3-Qwen2-Modelfile-REST-API

文章目录

  • 【105.Python+AI】把大模型从云端搬回家:Ollama一行命令跑Llama3、Qwen2
    • 导入语
    • [1 ~> 安装与启动:一行命令跑起大模型](#1 ~> 安装与启动:一行命令跑起大模型)
      • [1.1 安装](#1.1 安装)
      • [1.2 跑起第一个模型](#1.2 跑起第一个模型)
      • [1.3 模型怎么选:看显存下菜](#1.3 模型怎么选:看显存下菜)
    • [2 ~> Modelfile:把你的角色设定"焊"进模型](#2 ~> Modelfile:把你的角色设定"焊"进模型)
    • [3 ~> REST API:从玩具到服务](#3 ~> REST API:从玩具到服务)
      • [3.1 杀手锏:OpenAI SDK 无缝兼容](#3.1 杀手锏:OpenAI SDK 无缝兼容)
      • [3.2 全链路回顾](#3.2 全链路回顾)
    • [4 ~> 什么时候该回到云端](#4 ~> 什么时候该回到云端)
    • [思考 && 总结](#思考 && 总结)
    • 结尾

【105.Python+AI】把大模型从云端搬回家:Ollama一行命令跑Llama3、Qwen2

📖 文章简介: 本文系统讲解Ollama本地大模型部署的完整用法,是"零成本、零泄露风险"玩转开源大模型的最短路径。文章从"为什么要本地跑模型"的三个真实动机切入------数据不出内网的合规要求、调API调到手软的费用账单、没网环境也能用的自由度;随后按上手顺序展开:Ollama安装(Windows/Mac/Linux三平台一分钟装完)、模型拉取(ollama run一行命令跑起Llama3/Qwen2,模型仓库的选型与显存对照表)、Modelfile自定义(基于基础模型定制专属角色的System Prompt、温度等参数的固化方法,相当于"打包一个自己的模型")、REST API调用(localhost:11434标准接口,curl与requests两种调用姿势)、与OpenAI SDK的无缝兼容(改两行代码让既有项目从云端切到本地)。文末附"本地模型什么时候不够用、该回到云端"的判断标准,配以Mermaid流程图展示从安装到API调通的完整链路,适合所有想把大模型部署到自己机器上的开发者阅读参考。


🎬 个人主页: 源码骑士

专栏传送门: 《Android开发基础》《python基础课程》

⭐️热衷从源码视角拆解技术底层原理,将复杂架构讲得通俗易懂


🎬 源码骑士的简介:

5年Android Framework系统开发经验,曾主导多项系统级性能优化专项

技术栈覆盖Android系统全链路(Binder/Handler/AMS/WMS/启动流程)及Java后端全家桶(Spring + MyBatis + Redis + Oracle)

累计产出原创技术文章100+篇,文章以流程图为特色,被读者评价为"看一篇胜过啃一周源码"


导入语

前面几十篇文章,我们调的大模型都在云端------OpenAI、DeepSeek、通义千问,一个API Key走天下。方便是真方便,但有三类场景,云端方案天然别扭:

bash 复制代码
场景一:数据不能出门
  医疗记录、合同文本、内部代码------公司规定数据不出内网
  云端API再方便也一票否决

场景二:账单扛不住
  批量处理十万条数据的任务,API费用算下来大几千
  而你的4090显卡正躺在机箱里吃灰

场景三:环境没有网
  内网开发机、出差路上、 demo现场网络拉胯
  云端模型直接失联

这三类场景的答案都是同一个:把模型搬回自己机器跑。 而2024年之后,这件事的门槛低到了一行命令------功臣就是 Ollama。


1 ~> 安装与启动:一行命令跑起大模型

1.1 安装

bash 复制代码
# Mac / Linux:
curl -fsSL https://ollama.com/install.sh | sh

# Windows:
官网下载 OllamaSetup.exe,一路下一步
# 装完托盘区出现小羊驼图标即成功

1.2 跑起第一个模型

bash 复制代码
# 拉取并运行 Qwen2.5 7B(首次自动下载约4.7GB,之后秒启)
ollama run qwen2.5:7b

# 或者 Llama3.1 8B
ollama run llama3.1:8b

看到>>>提示符,就可以直接对话了。是的,从安装到和7B模型聊天,总共两条命令------CUDA驱动、Python环境、依赖地狱这些传统部署的拦路虎,Ollama全部替你消化掉了。

1.3 模型怎么选:看显存下菜

模型规模 量化后体积 所需显存/内存 能力画像
1.5B ~ 3B 1~2GB 4GB 内存即可 能对话,逻辑弱,适合嵌入式
7B ~ 8B 4~5GB 8GB 显存或16GB内存 日常任务够用,性价比甜点
14B 8~9GB 16GB 显存 明显更聪明,中高端显卡
32B+ 18GB+ 24GB+ 显存 接近商用API水平,发烧友向

经验建议:从7B起步。它是对话、摘要、分类等日常任务的性价比甜点;跑出瓶颈再升级,别一上来拉70B把机器跑成幻灯片。


2 ~> Modelfile:把你的角色设定"焊"进模型

每次调用都塞一遍System Prompt太啰嗦,Ollama支持用Modelfile把设定固化成"新模型":

dockerfile 复制代码
# Modelfile
FROM qwen2.5:7b

# 固化系统角色------之后每次对话都自带这个人设
SYSTEM """
你是"码上Reviews"团队的资深代码评审员。
评审风格:先肯定优点,再指出问题,问题按严重程度排序,
每条问题附带修改建议和示例代码。
"""

# 固化推理参数
PARAMETER temperature 0.3
PARAMETER num_ctx 8192
bash 复制代码
# 基于Modelfile创建专属模型
ollama create code-reviewer -f Modelfile

# 像普通模型一样使用
ollama run code-reviewer

可以把它理解成**"模型级Dockerfile"**:基础镜像是开源模型,你在上面叠加人设和参数,create出一个团队共享的定制模型。第92篇写的角色Prompt、第88篇的System设计,在这里都能直接固化。


3 ~> REST API:从玩具到服务

Ollama启动后自带HTTP服务(默认localhost:11434),这是它从"聊天玩具"变成"开发基建"的关键:

bash 复制代码
# curl 直接调
curl http://localhost:11434/api/generate -d '{
  "model": "qwen2.5:7b",
  "prompt": "用一句话解释什么是向量数据库",
  "stream": false
}'
python 复制代码
import requests

resp = requests.post("http://localhost:11434/api/generate", json={
    "model": "qwen2.5:7b",
    "prompt": "用一句话解释什么是向量数据库",
    "stream": False,
})
print(resp.json()["response"])

3.1 杀手锏:OpenAI SDK 无缝兼容

Ollama内置了OpenAI兼容接口------意味着你之前写的所有调用OpenAI的代码,改两行就能切到本地

python 复制代码
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",   # ← 改动一:指向本地
    api_key="ollama",                        # ← 改动二:随便填,本地不校验
)

resp = client.chat.completions.create(
    model="qwen2.5:7b",                      # ← 改动三:换模型名
    messages=[{"role": "user", "content": "你好"}],
)

这个兼容层的价值巨大:云端和本地可以随意切换------开发调试用本地(免费、快、不泄露),生产上量切云端(强模型、高并发),一套代码两种活法。

3.2 全链路回顾

#mermaid-svg-s7KXw6467IJGitox{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-s7KXw6467IJGitox .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-s7KXw6467IJGitox .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-s7KXw6467IJGitox .error-icon{fill:#552222;}#mermaid-svg-s7KXw6467IJGitox .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-s7KXw6467IJGitox .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-s7KXw6467IJGitox .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-s7KXw6467IJGitox .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-s7KXw6467IJGitox .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-s7KXw6467IJGitox .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-s7KXw6467IJGitox .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-s7KXw6467IJGitox .marker{fill:#333333;stroke:#333333;}#mermaid-svg-s7KXw6467IJGitox .marker.cross{stroke:#333333;}#mermaid-svg-s7KXw6467IJGitox svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-s7KXw6467IJGitox p{margin:0;}#mermaid-svg-s7KXw6467IJGitox .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-s7KXw6467IJGitox .cluster-label text{fill:#333;}#mermaid-svg-s7KXw6467IJGitox .cluster-label span{color:#333;}#mermaid-svg-s7KXw6467IJGitox .cluster-label span p{background-color:transparent;}#mermaid-svg-s7KXw6467IJGitox .label text,#mermaid-svg-s7KXw6467IJGitox span{fill:#333;color:#333;}#mermaid-svg-s7KXw6467IJGitox .node rect,#mermaid-svg-s7KXw6467IJGitox .node circle,#mermaid-svg-s7KXw6467IJGitox .node ellipse,#mermaid-svg-s7KXw6467IJGitox .node polygon,#mermaid-svg-s7KXw6467IJGitox .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-s7KXw6467IJGitox .rough-node .label text,#mermaid-svg-s7KXw6467IJGitox .node .label text,#mermaid-svg-s7KXw6467IJGitox .image-shape .label,#mermaid-svg-s7KXw6467IJGitox .icon-shape .label{text-anchor:middle;}#mermaid-svg-s7KXw6467IJGitox .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-s7KXw6467IJGitox .rough-node .label,#mermaid-svg-s7KXw6467IJGitox .node .label,#mermaid-svg-s7KXw6467IJGitox .image-shape .label,#mermaid-svg-s7KXw6467IJGitox .icon-shape .label{text-align:center;}#mermaid-svg-s7KXw6467IJGitox .node.clickable{cursor:pointer;}#mermaid-svg-s7KXw6467IJGitox .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-s7KXw6467IJGitox .arrowheadPath{fill:#333333;}#mermaid-svg-s7KXw6467IJGitox .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-s7KXw6467IJGitox .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-s7KXw6467IJGitox .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s7KXw6467IJGitox .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-s7KXw6467IJGitox .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s7KXw6467IJGitox .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-s7KXw6467IJGitox .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-s7KXw6467IJGitox .cluster text{fill:#333;}#mermaid-svg-s7KXw6467IJGitox .cluster span{color:#333;}#mermaid-svg-s7KXw6467IJGitox div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-s7KXw6467IJGitox .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-s7KXw6467IJGitox rect.text{fill:none;stroke-width:0;}#mermaid-svg-s7KXw6467IJGitox .icon-shape,#mermaid-svg-s7KXw6467IJGitox .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-s7KXw6467IJGitox .icon-shape p,#mermaid-svg-s7KXw6467IJGitox .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-s7KXw6467IJGitox .icon-shape .label rect,#mermaid-svg-s7KXw6467IJGitox .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-s7KXw6467IJGitox .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-s7KXw6467IJGitox .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-s7KXw6467IJGitox :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是

命令行对话
程序集成
安装Ollama
ollama run 拉取模型

按显存选规模
需要定制人设?
编写 Modelfile

SYSTEM+参数固化
ollama create

生成专属模型
基础模型直接用
本地服务 localhost:11434
调用方式
ollama run 交互式
REST API / OpenAI SDK

改两行代码无缝切换


4 ~> 什么时候该回到云端

本地部署不是万能的,这几条边界要清醒:

bash 复制代码
该用云端的信号:

□ 任务需要顶尖推理能力(复杂数学、长链条逻辑)
  → 7B本地模型和GPT-4级别的差距是肉眼可见的

□ 并发要求高(几十人同时用)
  → 单卡Ollama并发很弱,这是vLLM的战场(第108篇)

□ 需要最新知识或超长上下文(>32K)
  → 本地小模型的上下文窗口和知识新鲜度都受限

□ 团队没有显卡资源
  → 纯CPU能跑7B,但速度只适合演示不适合生产

一句话:本地是"够用、可控、免费"的基本盘,云端是"最强、最快、最贵"的增强包------成熟的架构是两者混合调度(第110篇专门讲多模型热切换)。


思考 && 总结

  1. 本地部署的三类刚需场景: 数据不出内网、批量任务省账单、离线环境可用------中一条就值得部署。
  2. 上手只需两条命令: 装Ollama、ollama run qwen2.5:7b;模型选型从7B甜点起步,看显存下菜。
  3. Modelfile是模型级Dockerfile: 基础模型+SYSTEM人设+参数,create出团队共享的定制模型。
  4. OpenAI兼容层是杀手锏: base_url指向本地、api_key随便填------既有代码改两行,云端本地自由切换。
  5. 认清边界: 顶尖推理、高并发、超长上下文回云端;本地是基本盘,云端是增强包。

跑起来了,但你会立刻发现一个新问题:官方给的都是量化后的模型,GGUF、Q4_K_M这些后缀是什么意思?为什么量化到4bit还能用、精度到底损失多少?下一篇把量化技术彻底讲透:GGUF、GPTQ、AWQ、bitsandbytes四大方案全对比。


结尾

各位小伙伴,本文的内容到这里就全部结束了,源码骑士在这里再次感谢您的阅读!

源码骑士 --- Android Framework & 全栈开发

👀 关注:跟博主一起从源码视角深耕底层原理,见证每一次成长

❤️ 点赞:让优质内容被更多人看见,让知识传递更有力量

收藏:把核心知识点存好,在需要时随时查、随时用

💬 评论:分享你的经验或疑问,评论区一起交流避坑

🔄 一键四连:不要忘记给博主"一键四连"哦!

🗡️ 寄语:技术之路难免有困惑,但同行的人会让前进更有方向

结语:一条命令、一只羊驼、一个跑在自己机器上的7B模型------大模型从"云端的神坛"走进"你的终端",就是Ollama这两年干成的事。本地这个基本盘,今晚就可以搭起来。不要忘记给博主"一键四连"哦!

相关推荐
晚安code44 分钟前
MCP Server 开发入门:手把手写一个能跑的 Server,三种协议怎么选
python·ai编程
CTA量化套保1 小时前
量化脚本准备实盘了吗?TqSdk 上线前工程检查
人工智能·python
青 春 记 忆1 小时前
零基础入门python07:让程序记住数据——JSON文件和异常处理
开发语言·windows·python·json·python3.11
清水白石0081 小时前
Python 如何设计一个线程安全的缓存?从锁策略、LRU 到工程化实战
python·安全·缓存
qq_22589174661 小时前
基于Flask的城市地铁客流量数据预测系统设计与实现
后端·python·flask
W_326001 小时前
Python 常用标准 / 第三方库:random、tqdm、turtle、jieba 用法
开发语言·python
OptimizationMaster1 小时前
Python对视频文件分类,“横屏”和“竖屏”
python·视频
XLYcmy2 小时前
PDF论文处理器 - 功能总结
数据库·python·pdf·csv·pymupdf·dify·文本分割