本地 Ollama AI 实战:写作助手、代码生成、翻译、新闻摘要等日常场景

本地 AI 不是为了炫技,是用起来才有价值。这几个场景我每天用,脚本都写好了直接跑。


写作助手

写邮件、写报告前丢给 AI 润色。Python 脚本:

PYTHON
#!/usr/bin/env python3
import sys, requests

def polish(text, mode="润色"):
    prompts = {
        "润色": "请润色以下文字,使其更专业流畅:nn",
        "翻译": "请将以下中文翻译成英文:nn",
        "精简": "请将以下文字精简到一半长度,保留核心意思:nn",
    }
    resp = requests.post("http://localhost:11434/api/chat", json={
        "model": "qwen2.5:7b",
        "messages": [{"role": "user", "content": prompts[mode] + text}],
        "stream": False,
        "options": {"temperature": 0.7, "num_ctx": 2048}
    })
    return resp.json()["message"]["content"]

if __name__ == "__main__":
    mode = sys.argv[1] if len(sys.argv) > 1 else "润色"
    text = sys.stdin.read() or input("输入:n")
    print(polish(text, mode))

用法:echo "今天开了个会" | python3 write.py 润色


代码生成

忘记某个函数怎么写,描述需求让 AI 写:

PYTHON
#!/usr/bin/env python3
import requests, sys, json

def generate(desc):
    resp = requests.post("http://localhost:11434/api/chat", json={
        "model": "qwen2.5-coder:7b",
        "messages": [
            {"role": "system", "content": "只输出代码,不要解释。如有潜在bug在注释里标注。"},
            {"role": "user", "content": desc}
        ],
        "stream": True,
        "options": {"temperature": 0.3}
    })
    for line in resp.iter_lines():
        if line:
            print(json.loads(line).get("message", {}).get("content", ""), end="", flush=True)
    print()

if __name__ == "__main__":
    generate(" ".join(sys.argv[1:]) or input("描述:n"))

python3 code.py "写一个带重试的HTTP GET函数"


长文总结

论文、长文章不想看?让 AI 总结。文本太长就分段处理再汇总:

PYTHON
#!/usr/bin/env python3
import requests, sys

def summarize(text):
    if len(text) > 8000:
        chunks = [text[i:i+8000] for i in range(0, len(text), 8000)]
        summaries = []
        for i, c in enumerate(chunks):
            print(f"处理 {i+1}/{len(chunks)}...")
            r = requests.post("http://localhost:11434/api/chat", json={
                "model": "qwen2.5:7b",
                "messages": [{"role": "user", "content": f"总结以下要点:nn{c}"}],
                "stream": False
            })
            summaries.append(r.json()["message"]["content"])
        r = requests.post("http://localhost:11434/api/chat", json={
            "model": "qwen2.5:7b",
            "messages": [{"role": "user", "content": f"综合成一份完整总结(300字以内):nn" + "n---n".join(summaries)}],
            "stream": False
        })
        return r.json()["message"]["content"]
    r = requests.post("http://localhost:11434/api/chat", json={
        "model": "qwen2.5:7b",
        "messages": [{"role": "user", "content": f"总结以下内容(300字内):nn{text}"}],
        "stream": False
    })
    return r.json()["message"]["content"]

if __name__ == "__main__":
    text = open(sys.argv[1]).read() if len(sys.argv) > 1 else sys.stdin.read()
    print(summarize(text))

pdftotext paper.pdf - | python3 summarize.py


批量翻译

翻译整个文件,按段落处理避免一次性输入太多:

PYTHON
#!/usr/bin/env python3
import requests, sys, time

def translate(text):
    r = requests.post("http://localhost:11434/api/chat", json={
        "model": "qwen2.5:7b",
        "messages": [
            {"role": "system", "content": "专业翻译。只输出翻译结果,不要解释。"},
            {"role": "user", "content": text}
        ],
        "stream": False,
        "options": {"temperature": 0.3}
    })
    return r.json()["message"]["content"]

with open(sys.argv[1]) as f:
    text = f.read()
paras = text.split('nn')
result = []
for i, p in enumerate(paras):
    if p.strip():
        print(f"{i+1}/{len(paras)}...")
        result.append(translate(p.strip()))
        time.sleep(0.5)
    else:
        result.append(p)
out = sys.argv[2] if len(sys.argv) > 2 else sys.argv[1] + ".translated"
with open(out, 'w') as f:
    f.write('nn'.join(result))
print(f"完成:{out}")

Shell 命令助手

忘记命令怎么用,直接问:

BASH
# 一行搞定
curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen2.5:7b",
  "prompt": "找出 7 天前修改的 log 文件并删除,给出 shell 命令。只输出命令。",
  "stream": false
}' | jq -r '.response'

调优

简单任务(翻译、润色、正则)用 qwen2.5:3b,10~15 t/s。复杂任务(代码、总结)用 qwen2.5:7b。temperature 翻译和代码设 0.2~0.3,创意写作设 0.7。num_ctx 日常 2048 够了,减少内存占用。

发表评论