用 LM Studio + TranslateGemma 4B 搭建本地翻译服务,并接入沉浸式翻译

本文记录一次本地部署小模型翻译服务的完整流程。目标是:在本地电脑运行 TranslateGemma 4B,通过 LM Studio 开启 OpenAI 兼容 API,然后让浏览器插件或局域网内其他设备调用这个本地翻译模型。

最终效果:

  • 模型运行在本地,不需要把网页文本发给云端大模型服务。
  • LM Studio 提供 OpenAI 兼容接口。
  • 沉浸式翻译通过自定义 AI 服务调用本地模型。
  • 其他局域网设备也可以通过 http://局域网IP:1234/v1 调用。

一、模型选择

官方模型地址是:

google/translategemma-4b-it

但 LM Studio 更适合加载 GGUF 格式模型,所以建议下载 GGUF 量化版:

mradermacher/translategemma-4b-it-GGUF

量化版本推荐:

Q4_K_M:质量和速度比较均衡,推荐优先选择
Q4_K_S:更省资源,适合先试跑
Q5_K_M:质量更好,内存够可以选
Q8_0:质量最高,但占用更大

如果是普通 Mac 或低显存机器,建议先从 Q4_K_MQ4_K_S 开始。

本次示例使用:

translategemma-4b-it.Q4_K_S.gguf

模型 API 标识符:

translategemma-4b-it

后面接入沉浸式翻译时,模型名就填这个。

二、在 LM Studio 中加载模型

打开 LM Studio,进入:

Models -> My Models

下载或导入 translategemma-4b-it 的 GGUF 模型。

加载成功后,在模型信息里能看到类似内容:

Format: GGUF
Quantization: Q4_K_S
Arch: gemma3
API Model Identifier: translategemma-4b-it

重点记住:

API Model Identifier: translategemma-4b-it

这个就是后续 API 请求里的 model 参数。

三、开启 LM Studio 本地 API

进入:

Developer -> Local Server

点击:

Load Model

选择刚才加载的 translategemma-4b-it

然后打开服务器开关,让状态变成:

Status: Running

推荐服务器设置:

Server Port: 1234
Require Authentication: 关闭
Serve on Local Network: 开启
Enable CORS: 开启

说明:

  • Server Port 默认是 1234,可以保持不变。
  • Require Authentication 本地测试可以关闭。
  • Serve on Local Network 开启后,局域网其他设备才能访问。
  • Enable CORS 建议开启,因为浏览器插件调用本地 API 时可能需要跨域支持。

启动成功后,LM Studio 会显示类似:

Reachable at: http://192.168.100.196:1234

这个地址就是本地服务地址。

OpenAI 兼容 Base URL:

http://192.168.100.196:1234/v1

完整聊天接口:

http://192.168.100.196:1234/v1/chat/completions

注意:把 192.168.100.196 换成你自己电脑的局域网 IP。

四、测试 LM Studio API

先测试模型列表:

curl http://192.168.100.196:1234/v1/models

如果能返回模型列表,说明 API 已经通了。

再测试一次翻译请求:

curl http://192.168.100.196:1234/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "translategemma-4b-it",
    "messages": [
      {
        "role": "user",
        "content": "Translate into Chinese: Hello, how are you?"
      }
    ],
    "temperature": 0
  }'

如果返回中文翻译,说明 LM Studio 这一层没有问题。

五、接入沉浸式翻译

打开沉浸式翻译设置,进入自定义 AI 翻译服务配置。

填写:

APIKEY: lm-studio
自定义 API 接口地址: http://192.168.100.196:1234/v1/chat/completions
自定义翻译服务名称: LM Studio
模型: translategemma-4b-it

如果页面里有:

输入自定义模型名称

需要勾选。

这里有一个容易填错的点:

不要只填 http://192.168.100.196:1234/v1

沉浸式翻译这个位置需要完整接口路径:

http://192.168.100.196:1234/v1/chat/completions

六、关键问题:修改 TranslateGemma 的提示词模板

直接测试时,可能会遇到下面这类错误:

Conversations must start with a user prompt.

或者:

User role must provide `content` as an iterable with exactly one item.

原因是 TranslateGemma 的默认 GGUF 模板比较特殊。它默认要求 user.content 是结构化数组,类似:

{
  "role": "user",
  "content": [
    {
      "type": "text",
      "source_lang_code": "en",
      "target_lang_code": "zh",
      "text": "Hello, how are you?"
    }
  ]
}

但沉浸式翻译发送的是普通 OpenAI Chat 格式:

{
  "role": "user",
  "content": "Translate the following text..."
}

所以需要在 LM Studio 里覆盖模型的 Prompt Template,让它兼容普通 OpenAI Chat 请求。

进入:

Models -> My Models -> translategemma-4b-it -> Inference -> 提示词模板

展开 提示词模板,选择自定义模板,然后把原模板替换成下面这份:

{{ bos_token }}
{%- set ns = namespace(system_text='') -%}

{%- for message in messages -%}
  {%- if message['role'] == 'system' -%}
    {%- if message['content'] is string -%}
      {%- set ns.system_text = ns.system_text + (message['content'] | trim) + '\n\n' -%}
    {%- endif -%}

  {%- elif message['role'] == 'user' -%}
{{ '<start_of_turn>user\n' }}
    {%- if ns.system_text -%}
{{ ns.system_text }}
      {%- set ns.system_text = '' -%}
    {%- endif -%}

    {%- if message['content'] is string -%}
{{ message['content'] | trim }}
    {%- elif message['content'] is iterable -%}
      {%- for item in message['content'] -%}
        {%- if item['type'] == 'text' -%}
{{ item['text'] | trim }}
        {%- endif -%}
      {%- endfor -%}
    {%- endif -%}
{{ '<end_of_turn>\n' }}

  {%- elif message['role'] == 'assistant' -%}
{{ '<start_of_turn>model\n' }}
    {%- if message['content'] is string -%}
{{ message['content'] | trim }}
    {%- endif -%}
{{ '<end_of_turn>\n' }}
  {%- endif -%}
{%- endfor -%}

{%- if add_generation_prompt -%}
{{ '<start_of_turn>model\n' }}
{%- endif -%}

这个模板做了两件事:

  • 允许请求第一条是 system 消息。
  • system 消息合并进第一条 user 消息,避免 TranslateGemma 模板报错。
  • 允许 user.content 是普通字符串,而不是 TranslateGemma 原生结构化数组。

保存模板后,按下面顺序重启:

Eject 卸载模型
重新 Load Model
重启 Local Server
回到沉浸式翻译点“测试服务”

如果测试成功,说明沉浸式翻译已经可以调用本地 TranslateGemma。

七、沉浸式翻译完整配置示例

如果你使用开发者设置里的 Edit Full User Config,可以参考下面的自定义服务配置。

其中 custom-ai-djztv3XF 是示例服务 ID,不同环境可能不一样。如果你已经有自己的 ID,只需要修改对应对象里的字段。

{
  "translationService": "custom-ai-djztv3XF",
  "translationServices": {
    "custom-ai-djztv3XF": {
      "APIKEY": "lm-studio",
      "apiUrl": "http://192.168.100.196:1234/v1/chat/completions",
      "extends": "custom-ai",
      "group": "custom",
      "model": "translategemma-4b-it",
      "name": "LM Studio",
      "type": "custom-ai",
      "visible": true,
      "assistantId": "",
      "enableAIContext": false,
      "temperature": 0,
      "systemPrompt": "",
      "multipleSystemPrompt": "",
      "systemMultiplePrompt": "",
      "prompt": "Translate the following text from {{from}} to {{to}}. Output only the translation, no explanation. Keep HTML tags and formatting if present:\n\n{{text}}",
      "multiplePrompt": "Translate the following text blocks from {{from}} to {{to}}. Output only the translations. Keep the %% separators exactly and keep the same number/order of blocks:\n\n{{text}}",
      "subtitlePrompt": "Translate the following subtitle text from {{from}} to {{to}}. Output only the translation:\n\n{{text}}"
    }
  },
  "userTranslationServices": {
    "translationService": "custom-ai-djztv3XF"
  }
}

实际配置时,最关键的是这几个字段:

APIKEY: lm-studio
apiUrl: http://192.168.100.196:1234/v1/chat/completions
model: translategemma-4b-it
temperature: 0

八、局域网访问和防火墙

如果其他设备无法访问,优先检查:

1. 两台设备是否在同一个局域网
2. LM Studio 是否开启 Serve on Local Network
3. LM Studio 是否显示 Status: Running
4. 访问地址是否使用了服务端电脑的局域网 IP
5. Windows/macOS 防火墙是否放行 LM Studio 或 TCP 1234 端口
6. 浏览器插件调用时是否开启了 CORS

测试命令:

curl http://192.168.100.196:1234/v1/models

如果这个命令在其他设备上可以返回模型列表,说明网络和服务都正常。

九、常见错误

1. 只填了 /v1,测试失败

沉浸式翻译的自定义 API 地址需要填完整路径:

http://192.168.100.196:1234/v1/chat/completions

不是:

http://192.168.100.196:1234/v1

2. 报错 Conversations must start with a user prompt

原因:插件发送了 system 消息,但 TranslateGemma 默认模板要求第一条必须是 user

解决:修改 LM Studio 的提示词模板,把 system 合并进 user

3. 报错 User role must provide content as an iterable

原因:TranslateGemma 默认模板要求专用结构化 content,但插件发送的是普通字符串。

解决:使用上文的通用兼容提示词模板。

4. 其他设备访问不了

优先检查防火墙和局域网访问设置。

Windows 上需要允许 LM Studio 入站访问,或者放行 TCP 端口:

1234

十、最终配置总结

LM Studio:

模型: translategemma-4b-it GGUF
量化: Q4_K_S 或 Q4_K_M
端口: 1234
Serve on Local Network: 开
Enable CORS: 开
API Model Identifier: translategemma-4b-it

沉浸式翻译:

APIKEY: lm-studio
API 地址: http://192.168.100.196:1234/v1/chat/completions
模型: translategemma-4b-it

关键修改:

覆盖 LM Studio 中 TranslateGemma 的提示词模板,使其兼容普通 OpenAI Chat 请求。

完成后,就可以用本地小模型为网页翻译提供服务。对于日常英文网页翻译,这套方案可以在不依赖云端 API 的情况下完成基本可用的翻译体验。

十一、M40 24GB 实测优化配置(2026 版)

下面这组参数基于实际使用测试,而不是纯理论推测。测试目标是提升沉浸式翻译网页翻译时的体感速度和翻译稳定性。

测试环境:

CPU: Xeon E5-2696 v3(18 核 36 线程)
内存: 64GB DDR3 ECC
GPU: NVIDIA Tesla M40 24GB
系统: Windows 10 Pro for Workstations
LM Studio: 0.3.x
用途: 沉浸式翻译网页翻译

1. 推荐模型量化

经过实际对比,Q4_K_SQ5_K_M 都能跑,但长期使用更推荐 Q5_K_M

Q4_K_S 的特点:

优点: 速度略快,占用更小
缺点: 部分专业术语存在漂移,长句准确率略低

Q5_K_M 的特点:

优点: 术语翻译更准确,长句稳定性更好,科技文章表现更佳
缺点: 生成速度下降约 5%

实测结果:

模型Prompt 速度生成速度总耗时
Q4_K_S360.64 tok/s36.92 tok/s5427.82 ms
Q5_K_M404.78 tok/s34.90 tok/s5645.36 ms

实际速度差异约 5%,但 Q5_K_M 的质量提升更明显。因此推荐:

速度优先: Q4_K_S
长期使用: Q5_K_M
综合推荐: Q5_K_M

本轮测试使用的是一段关于 Atlantic Meridional Overturning Circulation 的英文科普文本,参数为:

temperature: 0
max_tokens: 512
prompt tokens: 209
output tokens: 179
total tokens: 388

关键差异在术语处理上:

Q4_K_S: 大西洋南北洋环流
Q5_K_M: 大西洋经向环流

Q5_K_MAtlantic Meridional Overturning Circulation 的译法更接近常见专业表达,整体文风也更自然。本轮测试里,Q5_K_M 的生成速度比 Q4_K_S 慢约 5.5%,总推理耗时多约 4.0%,但质量收益更明显。

2. LM Studio 推荐参数

Context & Offload:

Context Length: 4096
GPU Offload: 全部卸载(Max)
KV Cache Offload: 开启
Keep Model In Memory: 开启
mmap(): 开启

Advanced:

CPU Threads: 16
Eval Batch Size: 4096
Physical Batch Size: 1024
Max Concurrent Predictions: 4
Unified KV Cache: 开启

如果出现不稳定、响应卡顿或显存压力偏高,可以回退为:

Eval Batch Size: 2048
Physical Batch Size: 512

Attention:

Flash Attention: 开启

KV Cache:

K Cache Quantization: Q8_0
V Cache Quantization: Q8_0

Sampling:

Temperature: 0
Top K: 1
Top P: 关闭,或设置为 1
Min P: 关闭
Repeat Penalty: 1.05

翻译任务推荐固定输出,Temperature 保持 0,能减少术语漂移和多余解释。

3. 沉浸式翻译推荐配置

AI 智能上下文:

建议: 关闭

原因是 TranslateGemma 本身就是专用翻译模型,开启 AI 智能上下文后会拉长 prompt,增加推理时间,但收益很小。

AI 专家:

建议: 通用

除非长期翻译医学、法律、学术论文等固定领域,否则不建议频繁切换 AI 专家。

请求策略:

每秒最大请求数: 4
每次请求最大文本长度: 2000
每次请求最大段落数: 6
每次字幕请求最大段落数: 6
Temperature: 0

本地模型更适合“少请求、大批量”,而不是“大量小请求”。例如 1200 字符 × 4 段 会产生更多 API 调用,调整到 2000 字符 × 6 段 后,通常能减少请求次数,网页翻译体感速度更好。

4. 推荐提示词

系统提示词可以精简为:

You are a professional translator.

Rules:
1. Translate into {{to}}.
2. Output translation only.
3. Keep paragraph structure unchanged.
4. Preserve HTML tags.
5. Preserve proper nouns, code and URLs.
6. Use %% between translated paragraphs when input contains %%.

多段提示词可以保持简单:

Translate to {{to}}:

{{text}}

5. 翻译质量主观评价

针对 BBC、Reuters、Wikipedia、Medium、GitHub README、技术博客和 AI 文章等场景,主观评价如下:

项目DeepLTranslateGemma Q5_K_M
准确性109
流畅性108.5-9
术语一致性109
长句处理108.5
科技文章109
本地部署010

以 AMOC 测试文本为例,Q4_K_S 能正确翻出大意,但术语更容易出现轻微漂移;Q5_K_M 在术语、长句和整体文风上更稳定。比如同一句中,Q5_K_MAtlantic Meridional Overturning Circulation 译为“大西洋经向环流”,比 Q4_K_S 的“大西洋南北洋环流”更适合科技文章语境。

综合评价:

DeepL: 100 分
TranslateGemma Q5_K_M: 90-95 分

对于技术博客、AI 文章和日常英文网页,TranslateGemma 4B Q5_K_M 已经达到长期可用水平。

6. 性能参考

本机实测:

Prompt: 约 400 tok/s
Generation: 约 35 tok/s

实际网页翻译体感:

普通新闻页面: 2-5 秒
长篇技术博客: 5-10 秒
维基百科词条: 3-8 秒

7. 最终推荐

模型:

TranslateGemma 4B Instruct Q5_K_M

LM Studio:

Context Length: 4096
GPU Offload: Max
CPU Threads: 16
Eval Batch Size: 4096
Physical Batch Size: 1024
Max Concurrent Predictions: 4
Flash Attention: 开启
KV Cache GPU: 开启
Keep Model In Memory: 开启
mmap: 开启
K Cache: Q8_0
V Cache: Q8_0
Temperature: 0
Top K: 1
Repeat Penalty: 1.05

沉浸式翻译:

每秒最大请求数: 4
每次请求最大文本长度: 2000
每次请求最大段落数: 6
每次字幕请求最大段落数: 6
AI 智能上下文: 关闭
AI 专家: 通用
Temperature: 0