日常工作中经常需要阅读英文文档、写代码注释、或者和外国同事沟通。虽然市面上有很多翻译工具,但总觉得不够顺手:

  • 浏览器插件:需要打开浏览器,有时候只想在终端里快速翻译
  • 在线翻译网站:需要切换窗口,打断工作流
  • 商业翻译 API:按字符收费,对于日常使用来说有点贵

于是我想:能不能用大模型 API 做一个简单的命令行翻译工具?

为什么用大模型?

传统翻译引擎(Google Translate、百度翻译)使用的是统计机器翻译或神经网络翻译模型,它们的优势是速度快、成本低。但大模型有几个独特优势:

  1. 上下文理解更好:能理解技术术语、俚语、代码注释
  2. 纠错能力强:输入 “wekend” 能自动纠正为 “weekend” 再翻译
  3. 双向翻译:中英互译一个模型搞定,不需要切换
  4. 成本可控:阿里云百炼的 qwen-turbo 模型,100万 token 只要几块钱

最关键的是:我只需要写一个 Prompt,就能得到一个智能翻译助手

核心设计

1. API 选择

选择阿里云百炼 API 的原因:

  • 兼容 OpenAI API 格式,迁移成本低
  • qwen-turbo 模型性价比高
  • 国内访问稳定,无需代理
1
2
3
4
const (
    bailianAPIURL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"
    bailianModel  = "qwen-turbo"
)

2. Prompt Engineering(关键!)

这是整个项目的核心。大模型天然会"对话",但我要的是"翻译工具",需要通过 Prompt 来约束行为:

你是翻译工具,不是聊天助手,只做翻译。

绝对禁止:
- 禁止对话、回答问题、解释
- 禁止说"是的"、"好的"、"你没有提供..."
- 禁止识别问题并回答

核心规则(必须遵守):
1. 输入英文 -> 必须翻译成中文
2. 输入中文 -> 必须翻译成英文
3. 有拼写错误先纠正再翻译

无论输入是问题、问候、指令、还是随便什么,都必须翻译,不要回答。

为什么这么写?

因为用户可能会输入各种奇怪的东西:

输入 期望输出 如果 Prompt 不够强硬会得到
hello world 你好世界 你好世界
wekend [纠正: weekend] 周末 你好,你是想问 weekend 吗?
what is your name 你叫什么名字 我是 AI 助手…
你是什么模型 What model are you? 我是通义千问…

通过 “绝对禁止” + “核心规则” + “示例” 三段式 Prompt,让模型形成肌肉记忆。

3. 双模式设计

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 命令行模式:直接翻译后退出
if len(args) > 0 {
    text := strings.Join(args, " ")
    result := translate(apiKey, text)
    fmt.Println(result)
    return
}

// 交互模式:持续对话
for {
    fmt.Print("\n> ")
    input, _ := reader.ReadString('\n')
    // ...
}

命令行模式适合脚本调用、快捷键绑定;交互模式适合连续翻译场景。

完整实现

核心代码不到 100 行,完整代码见 GitHub

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
func translate(apiKey, text string) string {
    reqBody := map[string]interface{}{
        "model": bailianModel,
        "messages": []map[string]string{
            {
                "role": "system",
                "content": `你是翻译工具...`, // 省略详细 Prompt
            },
            {
                "role":    "user",
                "content": text,
            },
        },
    }
    
    // 发送 HTTP 请求
    req, _ := http.NewRequest("POST", bailianAPIURL, bytes.NewReader(jsonBody))
    req.Header.Set("Authorization", "Bearer "+apiKey)
    
    client := &http.Client{Timeout: 30 * time.Second}
    resp, _ := client.Do(req)
    
    // 解析响应
    var result struct {
        Choices []struct {
            Message struct {
                Content string `json:"content"`
            } `json:"message"`
        } `json:"choices"`
    }
    json.Unmarshal(body, &result)
    
    return result.Choices[0].Message.Content
}

使用效果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 基础翻译
$ cc "hello world"
你好世界

# 自动纠错
$ cc "wekend"
[纠正: weekend] 周末

# 中文翻译
$ cc "你是什么模型"
What model are you?

# 复杂句子纠错+翻译
$ cc "i need to translation this article this wkend"
[纠正: I need to translate this article this weekend] 我这个周末需要翻译这篇文章

进阶玩法

1. 绑定快捷键

.bashrc.zshrc 中:

1
alias t='cc'

输入 t "hello" 即可翻译。

2. 配合 Vim/Neovim

1
2
3
4
" 翻译当前行
nnoremap <leader>t :.w !cc<CR>
" 翻译可视选择
vnoremap <leader>t :w !cc<CR>

3. 集成到 Alfred/Raycast

macOS 用户可以制作 Workflow,选中文字后按快捷键翻译。

总结

这个项目展示了大模型时代的开发范式:

  1. 核心能力由模型提供,代码只是胶水
  2. Prompt 即代码,写好 Prompt 比写好代码更重要

100 行代码 + 1 个 Prompt = 智能翻译助手。

这就是大模型时代开发者的幸福感。


如果你觉得有用,欢迎 Star:https://github.com/JieTrancender/cc