别再只玩聊天界面了——Ollama REST API 编程实战:把本地大模型变成你的自动化引擎
有了 Ollama,大多数人装完就停在了 O…
有了 Ollama,大多数人装完就停在了 Open WebUI 的聊天界面上——每天打开浏览器,敲几个问题,截个图发朋友圈,然后就没了。
但 Ollama 真正的价值不在聊天界面,在它背后那个安静跑在 11434 端口的 REST API。一旦你学会直接调用它,本地大模型就从一个”玩具聊天机器人”变成了可以嵌入脚本、自动化流程、甚至作为微服务后端跑在你内网里的生产力引擎。
这篇文章就带你从零开始,用最直白的方式把 Ollama API 用起来。不讲虚的,每个例子都可以直接复制运行。
一、Ollama API 基础:比你想的简单
Ollama 启动后,默认在 http://localhost:11434 暴露一组 REST API。你不需要 SDK,不需要鉴权,一个 curl 就能开工。
核心就两个 endpoint:
/api/generate—— 发送 prompt,获取回复(一次性)/api/chat—— 发送多轮对话消息(兼容 OpenAI 格式)
先来个最简单的测试:
curl http://localhost:11434/api/generate -d '{
"model": "qwen3:4b",
"prompt": "用一句话解释什么是REST API",
"stream": false
}'
返回的 JSON 里,response 字段就是你想要的答案。注意 stream: false ——如果不加这个,Ollama 默认用 SSE(Server-Sent Events)流式返回,一行一个 JSON 片段,适合打字机效果但不适合脚本处理。
还有个常用参数 temperature(0~2),控制生成内容的随机性。写代码建议 0.1-0.3,写文案建议 0.7-0.9。
二、实战一:Python 调用 Ollama,构建你自己的代码审查脚本
先看一个完整的 Python 脚本,功能是把某个目录下的所有 Python 文件发给大模型做代码审查,输出 Markdown 报告:
import os
import json
import requests
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL = "qwen3:14b" # 代码审查用大一点的模型
def review_file(filepath):
with open(filepath, "r") as f:
code = f.read()
prompt = f"""你是一个资深 Python 代码审查专家。请审查以下代码,按以下维度给出建议:
1. 潜在的 bug 或逻辑错误
2. 安全和性能问题
3. 可读性和 Python 最佳实践
只输出有问题的地方,如果代码没问题就说"代码质量良好,未发现明显问题"。
代码文件:{filepath}
---
{code}"""
resp = requests.post(OLLAMA_URL, json={
"model": MODEL,
"prompt": prompt,
"stream": False,
"temperature": 0.1
})
return resp.json()["response"]
# 遍历目录
report = []
for root, dirs, files in os.walk("./my_project"):
for fname in files:
if fname.endswith(".py"):
path = os.path.join(root, fname)
print(f"审查中: {path}")
result = review_file(path)
report.append(f"## {path}\n\n{result}\n\n---\n")
with open("code_review_report.md", "w") as f:
f.write("\n".join(report))
print("审查完成,报告已保存到 code_review_report.md")
这个脚本 50 行不到,但实用性拉满。你完全可以把 prompt 里的审查标准换成你团队的编码规范,一次批量检查整个项目。
三、实战二:流式输出,做一个终端里的 AI 聊天工具
流式输出(streaming)的关键是逐行解析 JSON。以下是一个极简终端聊天客户端:
import requests
import json
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL = "qwen3:4b"
def chat(prompt):
resp = requests.post(OLLAMA_URL, json={
"model": MODEL,
"prompt": prompt,
"stream": True
}, stream=True)
for line in resp.iter_lines():
if line:
data = json.loads(line)
print(data["response"], end="", flush=True)
if data.get("done"):
print()
break
if __name__ == "__main__":
while True:
user_input = input("\n你: ")
if user_input.lower() in ("exit", "quit"):
break
print("AI: ", end="", flush=True)
chat(user_input)
跑起来效果就是一个终端里的 AI 对话。没有前端依赖,没有 Docker,裸 Python 就能跑。写完这个我才意识到:大部分”AI 应用”本质就是几十行 HTTP 调用,剩下的全是产品包装。
四、实战三:curl 一行命令の妙用
有时候你不需要写 Python 脚本,只想在终端里快速用一下 AI。这些一行命令可以收藏:
1. 解释一段 Shell 命令:
echo '解释这条命令:find . -name "*.log" -mtime +7 -exec gzip {} \;' | \
curl -s http://localhost:11434/api/generate -d @- | jq -r '.response'
2. 快速翻译:
curl -s http://localhost:11434/api/generate -d '{
"model": "qwen3:4b",
"prompt": "把以下内容翻译成英文,只输出译文:本地大模型正在改变开发者构建应用的方式",
"stream": false
}' | jq -r '.response'
3. 用 jq 只提取答案(忽略 token 统计等元数据):
curl -s http://localhost:11434/api/generate \
-d '{"model":"qwen3:4b","prompt":"写一段Python快排","stream":false}' \
| jq -r '.response'
jq -r '.response' 这个小技巧能让你在任何 Shell 脚本里把 Ollama 当函数调用。
五、实战四:构建一个翻译微服务(Flask + Ollama)
如果你的内网有多台机器,完全可以把 Ollama 包装成一个翻译微服务,其他设备通过 HTTP 调用:
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
OLLAMA_URL = "http://localhost:11434/api/generate"
@app.route("/translate", methods=["POST"])
def translate():
data = request.json
text = data.get("text", "")
target_lang = data.get("target", "中文")
prompt = f"将以下内容翻译为{target_lang},只输出译文:\n{text}"
resp = requests.post(OLLAMA_URL, json={
"model": "qwen3:4b",
"prompt": prompt,
"stream": False
})
return jsonify({
"translation": resp.json()["response"].strip()
})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
内网其他机器直接 curl -X POST http://你的Ollama机器IP:5000/translate -H "Content-Type: application/json" -d '{"text":"Hello World","target":"中文"}' 就能用上。
更进一步,你可以用 Nginx 做反向代理加鉴权、用 systemd 做守护进程、用 Docker Compose 打包部署——这就把一个本地玩具变成了生产可用的内部服务。
六、踩坑记录和性能建议
写了这么多 API 调用脚本,我也踩了几个坑,一并分享:
- 并发限制:Ollama 默认同时只处理一个请求。如果你在一个脚本里循环发请求,第二个请求会排队等到第一个完成。解决办法是用
OLLAMA_NUM_PARALLEL=4环境变量提升并发数,但要注意显存——每个并发请求都会占用一份模型显存。 - 超时设置:大模型生成可能很慢(尤其用 CPU 推理时),Python 的
requests默认没有超时。一定要加requests.post(..., timeout=300),否则脚本可能永远卡住。 - /api/chat vs /api/generate:如果要做多轮对话,用
/api/chat,消息格式是[{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]。这和 OpenAI 的格式几乎一模一样,方便你后面换到云端 API。 - 模型预热:Ollama 首次加载模型需要几秒到几十秒。可以用
curl http://localhost:11434/api/generate -d '{"model":"qwen3:4b","keep_alive":-1}'让模型常驻内存,后续调用几乎零延迟。keep_alive: -1表示永不卸载。 - 结构化输出:如果你想让模型返回 JSON 而不是自然语言,在 prompt 里明确说”请以 JSON 格式返回”,并给出字段示例。2024 年以后的模型对 JSON 输出支持已经很好了。
七、总结:从”玩”到”用”的一步之遥
Ollama 的 API 设计得非常克制——没有复杂的鉴权机制,没有 SDK 依赖,就是纯 HTTP + JSON。这种极简设计反而让它成了本地 AI 开发的最佳入口:你可以用任何语言、任何框架、任何环境调用它,不需要学习新的抽象层。
我个人的实践是:
- 日常写代码时,终端里 alias 了一个
ai命令,其实就是 curl Ollama 的一行封装 - 项目里的 pre-commit hook 用 Ollama 做代码风格检查
- 内网跑了一个翻译微服务,全家设备都能用
- 自动化脚本里用 Ollama 做日志分析摘要,每天凌晨跑一次发邮件
这些场景没有一个是”打开聊天界面打字”能覆盖的。本地大模型真正的价值,是作为你整个工具链里一个随时可用的推理后端。
下一步?你可以试试:把 Ollama 接到 Telegram Bot、用 LangChain 做 RAG 检索增强、或者像我一样用 Tauri 写个本地桌面工具。API 通了之后,想象力是唯一的限制。
所有代码都在本地跑,零成本,零隐私泄露——这才是自部署 AI 的正确打开方式。
—— IT大叔,2026年8月
