本地 AI 不是为了炫技,是用起来才有价值。这几个场景我每天用,脚本都写好了直接跑。
写作助手
写邮件、写报告前丢给 AI 润色。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 写:
#!/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 总结。文本太长就分段处理再汇总:
#!/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
批量翻译
翻译整个文件,按段落处理避免一次性输入太多:
#!/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 命令助手
忘记命令怎么用,直接问:
# 一行搞定
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 够了,减少内存占用。