实战案例

三个可独立运行的小例子:终端问答、OpenAI 兼容客户端、定制编程助手。请先完成 安装ollama pull gemma4(或你的替代模型)。


案例 1:本地问答 CLI

目标: 在终端里多轮提问,历史留在进程内,输入空行或 /bye 结束。

#!/usr/bin/env python3
from ollama import chat

MODEL = "gemma4"
messages = [
    {"role": "system", "content": "你是本地知识助手。不知道就说不知道,不要编造链接。"},
]

print(f"本地问答(模型 {MODEL})。空行或 /bye 退出。")
while True:
    user = input("你: ").strip()
    if user in {"", "/bye"}:
        break
    messages.append({"role": "user", "content": user})
    reply = chat(model=MODEL, messages=messages)
    text = reply.message.content
    messages.append({"role": "assistant", "content": text})
    print(f"助手: {text}\n")
pip install ollama
python qa_cli.py

验证: 连续两轮提到同一专有名词,第二轮应能接上上下文。换模型只改 MODEL。要持久化历史,把 messages 写成 JSON;要查本地文档,先走 Embeddings,再接到 LangChain RAG


案例 2:OpenAI 兼容的迷你 Python 客户端

目标: 不引入官方 ollama 包,只用 openai 包打 /v1,方便以后改回云厂商。

from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1/", api_key="ollama")

def ask(prompt: str, model: str = "gemma4") -> str:
    stream = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": "用简体中文、条目清晰地回答。"},
            {"role": "user", "content": prompt},
        ],
        stream=True,
    )
    chunks: list[str] = []
    for event in stream:
        delta = event.choices[0].delta.content or ""
        print(delta, end="", flush=True)
        chunks.append(delta)
    print()
    return "".join(chunks)

if __name__ == "__main__":
    ask("列出 Ollama 本机 API 与 OpenAI 兼容基址。")

Windows 上若只想用系统自带能力、不写 Python,等价探测:

Invoke-RestMethod -Method Post `
  -Uri "http://localhost:11434/v1/chat/completions" `
  -ContentType "application/json" `
  -Body '{"model":"gemma4","messages":[{"role":"user","content":"Say this is a test"}]}'

验证: 运行时 ollama ps 应出现 gemma4。把 base_url 改成错误端口应立即失败,说明没有误打到公网 OpenAI。


案例 3:自定义 Modelfile 编程助手

目标: 固定代码审查人设与偏低温度,供 Cursor / CLI 复用。

Modelfile

FROM gemma4
PARAMETER temperature 0.2
PARAMETER num_ctx 8192
PARAMETER num_predict 1024
SYSTEM """你是严谨的编程助手。
- 先指出缺陷,再给最小补丁。
- 不要编造未出现的 API。
- 默认读者使用 Python 3.11+ 与 PowerShell 7。
- 回答使用简体中文,代码标识符保持英文。
"""
ollama create kenhuang-coder -f Modelfile
ollama run kenhuang-coder

用原生 API 冒烟:

curl.exe http://localhost:11434/api/chat -d "{\"model\":\"kenhuang-coder\",\"stream\":false,\"messages\":[{\"role\":\"user\",\"content\":\"审查:def add(a,b): return a+b\"}]}"

在 Cursor 里把模型名填 kenhuang-coder,Base URL 仍为 http://localhost:11434/v1,见 应用集成

想换中文底座:把 FROM 改成 Library 里的 qwen2.5(或当前等价标签)再 create 一个新名字,避免覆盖。


反模式

反模式改进
每个脚本复制 2KB system promptModelfile + create
容器里 localhost:11434 连宿主机host.docker.internal
用 70B Q8 硬跑 8GB 机器小 Q4 或 :cloud
聊天模型当 embeddingLibrary 里的 embed 模型
把 11434 映射到公网且无鉴权仅 localhost 或反代 + 认证

下一步

评论