从 0 到 1 手写一个 DeepSeek 翻译 CLI:附流式输出与批量翻译
一、效果预览
装好之后,翻译一句话就像这样:
$ python translator.py "The quick brown fox jumps over the lazy dog" 中文
敏捷的棕色狐狸跳过了懒狗
$ python translator.py "今天天气不错,我们出去走走吧" 英语
The weather is nice today, let's go out for a walk.
要翻译成日语、法语、德语?改一下第二个参数即可:
$ python translator.py "How are you doing today?" 日语
今日は調子はどうですか?
整个过程无需打开浏览器、无需登录、无需切换输入法——这正是命令行工具的「零摩擦」价值。
二、为什么是大模型翻译 + DeepSeek?
先说「为什么用大模型做翻译」。相比传统规则引擎和早期统计机器翻译,大语言模型(LLM)的优势在于结合上下文理解语义:它能处理一词多义、口语化表达、专业术语,甚至保留原文语气,而不是逐词硬翻。
在众多模型服务里选 DeepSeek,理由有三:
- 成本极低。DeepSeek 按 token 计费,定价在主流大模型中处于亲民档位;翻译场景单次消耗 token 有限,个人开发者几乎可忽略成本。
- 中文底子扎实。作为国产模型,中英互译乃至中日、中韩等语种间的翻译质量稳定,对中文语境的把握尤其准确。
- OpenAI 兼容协议。DeepSeek 开放平台提供与 OpenAI 对齐的 Chat Completions 接口(
/chat/completions),一个标准 HTTP POST 即可调用,无需引入重量级 SDK,也便于日后无缝迁移到其他兼容服务。
具体价格与模型上下文长度以 DeepSeek 开放平台 最新文档为准。
三、环境准备
1. 申请 API Key
- 打开 DeepSeek 开放平台,注册并登录。
- 进入「API Keys」页面,点击「创建 API Key」。
- 复制生成的 key(形如
sk-xxxxxxxxxxxxxxxx),务必妥善保存,页面关闭后无法再次查看。
2. 安装依赖
整个工具只依赖一个第三方库 requests:
pip install requests
四、完整代码
新建 translator.py,把下面这段代码贴进去,替换 API_KEY 即可:
import sys
import requests
API_KEY = "sk-xxxxxxxxxxxxxxxx" # 换成你自己的 Key
API_URL = "https://api.deepseek.com/chat/completions"
def translate(text, target="中文"):
headers = {"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"}
prompt = f"请将以下内容翻译成{target},只输出译文,不要任何解释:\n\n{text}"
payload = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.3,
}
resp = requests.post(API_URL, headers=headers, json=payload, timeout=30)
resp.raise_for_status()
return resp.json()["choices"][0]["message"]["content"].strip()
def main():
if len(sys.argv) < 2:
print("用法:python translator.py \"要翻译的内容\" [目标语言]")
sys.exit(1)
text = sys.argv[1]
target = sys.argv[2] if len(sys.argv) > 2 else "中文"
try:
print(translate(text, target))
except Exception as e:
print(f"翻译失败:{e}")
if __name__ == "__main__":
main()
去掉空行,核心逻辑恰好 30 行上下。
五、逐块拆解:每行代码在做什么
1. 配置常量
API_KEY = "sk-xxxxxxxxxxxxxxxx"
API_URL = "https://api.deepseek.com/chat/completions"
API_KEY:身份凭证,随每个请求通过请求头传递。API_URL:DeepSeek 的对话补全端点。该接口与 OpenAI 协议对齐,返回结构也保持一致(见第 5 节)。
2. 请求头
headers = {"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"}
Authorization: Bearer <key> 是标准鉴权方式;Content-Type 声明请求体为 JSON。
3. Prompt 设计(全段最关键的一行)
prompt = f"请将以下内容翻译成{target},只输出译文,不要任何解释:\n\n{text}"
这行最容易被低估。Prompt 质量直接决定译文质量与可解析性。 这里刻意加了「只输出译文,不要任何解释」的约束,否则模型可能先来一句「好的,以下是翻译结果:」,污染输出。对机器可读的接口而言,约束输出格式比追求辞藻更重要。
4. 请求体参数
payload = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.3,
}
| 参数 | 说明 |
|---|---|
model | deepseek-chat 为通用对话模型,翻译场景足够;追求更强推理可换 deepseek-reasoner |
messages | 对话消息列表,role 区分 system / user / assistant |
temperature | 采样温度,取值 0~2。设为 0.3 让输出更确定、更忠实原文,抑制「自由发挥」 |
翻译是「高确定性」任务,
temperature不宜过高;同理还可叠加top_p进一步收紧采样分布。
5. 发起请求与结果解析
resp = requests.post(API_URL, headers=headers, json=payload, timeout=30)
resp.raise_for_status()
return resp.json()["choices"][0]["message"]["content"].strip()
json=payload:requests自动完成 JSON 序列化与编码。raise_for_status():非 2xx 状态码直接抛异常,把错误暴露出来而非静默吞掉。- 返回体为标准结构:
choices[0].message.content即模型回复,strip()清理首尾空白。
6. 命令行参数
text = sys.argv[1]
target = sys.argv[2] if len(sys.argv) > 2 else "中文"
第一个参数为待译文本,第二个参数(可选)为目标语言,缺省翻译为中文。
六、运行演示
# 英文 → 中文(默认)
python translator.py "Machine learning is transforming every industry"
# 中文 → 英文
python translator.py "这个方案能大幅降低我们的运营成本" 英语
# 指定其他目标语言
python translator.py "What time does the train leave?" 法语
译文直接打印在终端,复制即用。
提示:在 Windows 的 PowerShell / CMD 中,含空格或特殊字符的文本务必用双引号包裹,否则会被按空格拆成多个参数。
七、进阶玩法
30 行是起点,下面是几个可叠加的工程化方向。
1. 流式输出(Streaming)
长文本翻译时,非流式要等完整响应返回。开启 stream=True 可逐 token 打印,体验更接近 ChatGPT:
payload["stream"] = True
resp = requests.post(API_URL, headers=headers, json=payload, stream=True)
for line in resp.iter_lines():
if line:
chunk = line.decode("utf-8").removeprefix("data: ")
if chunk != "[DONE]":
print(chunk, end="")
2. 交互模式(REPL)
不想每次都敲完整命令?加一个循环即可连续翻译:
while True:
line = input("翻译内容(q 退出)> ")
if line.lower() == "q":
break
print(translate(line))
3. 翻译整个文件
读入、翻译、写回,适合长文档批处理:
with open("input.txt", encoding="utf-8") as f:
content = f.read()
with open("output.txt", "w", encoding="utf-8") as f:
f.write(translate(content))
4. 批量翻译海外内容:采集 + 翻译一条龙
真实业务里,待译原文往往散落在海外新闻站、论文库、电商评论区,而不是躺在本地。这类场景的完整链路是「采集原文 → 批量翻译 → 落库」。
采集这一步,海外站点普遍有反爬策略,单 IP 高频请求极易被限流甚至封禁。此时可接入亿牛云代理 IP,通过动态代理 IP 池轮换请求来源,让采集链路更稳定,再把抓取的原文批量交给上面的 translate() 处理。亿牛云这类爬虫代理服务,正是为「大规模数据采集」而设计的;配合本文的翻译脚本,即可搭出一套「海外内容采集 + 自动翻译」的完整流水线。
5. 自动检测源语言
把 Prompt 改为「请将以下内容翻译成{target},先自动识别源语言,只输出译文」,模型会自动判断输入是中文还是英文,省去手动指定方向。
八、避坑指南
- API Key 安全:切勿把
sk-开头的 Key 提交到公开仓库。更稳妥的做法是从环境变量读取:
import os
API_KEY = os.environ.get("DEEPSEEK_API_KEY", "")
- 常见错误码:
401鉴权失败(Key 错误或失效)、402余额不足、429触发限流、5xx服务端异常。遇到429建议按返回的Retry-After退避重试,而不是立即高频重打。 - 上下文截断:单次请求有上下文长度上限,翻译长文档时应先按段落/章节拆分,逐段调用再拼接,避免超出窗口导致截断。
- 跨境访问稳定性:如果你的脚本需要同时调用 OpenAI、Claude 等海外模型做对照翻译,跨境网络抖动会成为不稳定因素,必要时可通过亿牛云等代理 IP 服务保障连接质量。
更多推荐



所有评论(0)