导语
在全球化日益普及的今天,多语言内容的需求呈爆炸式增长。无论是技术文档、博客文章、研究报告还是个人笔记,将其翻译成不同语言能够极大地扩展其受众范围和影响力。然而,传统的翻译方式,如人工翻译成本高昂且耗时,而使用在线翻译服务(如 Google Translate, DeepL 等)又可能涉及数据隐私、API 调用费用以及网络连接限制等问题。
对于追求效率、数据隐私和成本效益的开发者、内容创作者和技术爱好者来说,有没有一种方法可以在本地、离线、且低成本地进行高质量的批量翻译呢?答案是肯定的!随着本地大型语言模型(LLM)技术的成熟和普及,我们现在可以在自己的计算机上运行强大的 AI 模型来完成各种任务,包括文本翻译。
而对于 ServBay 用户来说,这一切变得更加简单和集成化。ServBay,作为一款强大的集成式 Web 开发环境,不仅仅提供了便捷的 Web 服务器、数据库、语言环境管理,其最新版本更是紧随技术潮流,内置了对 AI/LLM 的支持,特别是集成了广受欢迎的 Ollama 框架。这意味着您无需复杂的配置,就能在 ServBay 环境中轻松部署和管理本地 AI 模型,并利用其强大的能力。
本教程将基于 ServBay,详细指导您如何:
-
了解 ServBay 最新的 AI/LLM 支持,特别是其集成的 Ollama 功能。
-
在 ServBay 中轻松安装和配置 Ollama 服务。
-
通过 ServBay 的图形化界面搜索、下载和管理适用于翻译任务的 Ollama 模型。
-
编写一个 Python 脚本,利用 ServBay 提供的 Ollama API 接口,实现对指定文件夹(例如
docs
)下所有 Markdown (.md
) 文件的自动化批量翻译。
通过本教程,您将掌握一种强大、私密且高效的本地文档翻译解决方案,充分发挥 ServBay 和本地 AI 的潜力。让我们开始这段激动人心的本地 AI 之旅吧!

第一部分:ServBay 的 AI / LLM 新纪元:拥抱本地智能
ServBay 一直致力于为开发者提供一站式、高效便捷的本地开发环境。从多版本 PHP、Python、Java、.Net、Node.js 管理,到 Nginx/Apache/Caddy 切换,再到 MySQL/PostgreSQL/MongoDB 数据库支持,ServBay 极大地简化了开发环境的搭建和维护工作。现在,ServBay 再次走在了前沿,将强大的 AI/LLM 能力集成到了其核心功能中,为用户开启了本地智能化的新篇章。
- 集成 Ollama:本地 LLM 的瑞士军刀
ServBay 的 AI 功能核心是集成了 Ollama。Ollama 是一个开源项目,旨在让用户能够轻松地在本地运行大型语言模型,如 Llama 3, Mistral, Phi-3, Gemma3 等。它将模型的设置、运行和管理过程大大简化,提供了一个标准的 API 接口,使得开发者可以像调用云服务一样方便地与本地模型进行交互。
ServBay 集成 Ollama 带来了诸多优势:
-
一键安装与配置: ServBay 提供了一个专门的图形化界面来管理 Ollama。用户无需手动下载 Ollama、配置环境变量或管理复杂的依赖。只需在 ServBay 的 AI 面板中启用并进行简单配置,即可拥有一个随时可用的本地 LLM 服务。
-
可视化 配置管理 : ServBay提供了丰富的配置选项,如模型下载线程数(
Model Download Threads
)、绑定 IP 和端口(Bind IP
,Bind Port
- 默认为127.0.0.1:11434
,这是 Ollama 的标准配置)、调试开关(Debug
,Flash Attention
,No History
,No Prune
,Schedule Spread
,Multi-user Cache
)、缓存类型(K/V Cache Type
)、GPU 优化(GPU Overhead
)、连接保持(Keepalive
)、加载超时(Load Timeout
)、最大加载模型数(Max loaded models
)、最大队列(Max Queue
)、并行处理数(Parallel Num.
)、LLM 库路径(LLM Library
)、模型存储路径(Models folder
)以及访问来源控制(origins
)。这使得用户可以根据自己的硬件和需求精细调整 Ollama 的运行参数,而无需记忆命令行参数。 -
统一的生态系统: 将 Ollama 集成到 ServBay 中,意味着您的 Web 开发环境和 AI 推理环境可以在同一个管理平台下协同工作。这为开发需要 AI 功能的 Web 应用(如智能客服、内容生成、本地数据分析等)提供了极大的便利。
- 便捷的模型管理
仅仅有一个运行框架是不够的,选择和管理合适的 AI 模型同样重要。ServBay 在这方面也做得非常出色:
-
模型市场与搜索: ServBay 提供了一个模型列表界面,用户可以直接搜索 Ollama 官方模型库中的可用模型(如截图中搜索
deeps
显示了deepseek-r1
的不同版本)。 -
一键下载与删除: 对于搜索到的模型,界面清晰地展示了模型的名称(包含标签,如
latest
,1.5b
,7b
等)、基础模型、参数量(Parameters
)、文件大小(File Size
)以及操作按钮(下载+
或删除🗑️
)。用户只需点击按钮,ServBay 就会自动处理模型的下载和存储(存储路径可在 Ollama 配置中指定,默认为/Applications/ServBay/db/ollama/models
)。 -
本地模型概览: 在
Ollama Config
界面(第一张截图)的左侧列表,展示了当前已经下载到本地的模型(如alfred
,all-minilm
,codellama
等)。这让用户对自己拥有的本地 AI "大脑"一目了然。
- 本地 AI 的核心价值
为什么要在 ServBay 中使用本地 AI(通过 Ollama)进行翻译,而不是继续使用在线服务呢?
-
数据隐私与安全: 这是最核心的优势。所有的数据处理都在您自己的电脑上完成,您的文档内容无需发送到任何第三方服务器。对于包含敏感信息或商业机密的文档,这是至关重要的。
-
成本效益: 本地运行 LLM 无需支付 API 调用费用。虽然初始可能需要一定的硬件投入(尤其是需要 GPU 加速时),但对于大量或频繁的任务,长期成本远低于按量付费的云服务。
-
离线可用性: 一旦模型下载到本地,您就可以在没有网络连接的情况下进行翻译或其他 AI 任务,这对于网络不稳定的环境或需要完全离线的场景非常有用。
-
定制化与控制: 您可以自由选择最适合您任务和硬件的模型,可以尝试不同的模型版本和参数,甚至进行微调(Fine-tuning,虽然 ServBay 本身不直接提供微调功能,但本地化的 Ollama 环境为此打下了基础)。
-
低延迟 : 请求直接发送到本地运行的服务,通常比通过互联网调用远程 API 延迟更低,响应更快。
总而言之,ServBay 通过集成 Ollama,极大地降低了用户使用本地大型语言模型的门槛,将其强大的 AI 能力无缝融入到熟悉的开发环境中,为实现像文档批量翻译这样的高级自动化任务提供了坚实的基础。

第二部分:在 ServBay 中安装和配置 Ollama 及模型
现在,让我们一步步在 ServBay 中设置好 Ollama 服务,并下载一个适合翻译任务的模型。
步骤 1:导航到 ServBay 的 AI 配置
-
启动 ServBay 应用程序。
-
在 ServBay 主界面的左侧导航栏中,找到并点击 AI。
-
在 AI 的子菜单中,点击 Ollama 。您应该会看到类似第一张截图所示的
Ollama Config
界面。
步骤 2:检查并(可选)调整 Ollama 配置
ServBay 通常会提供一套合理的默认配置,对于初次使用或基本任务来说,往往无需修改。但了解这些选项有助于您未来进行优化:
-
Ollama 服务状态: 界面顶部通常会有一个开关或状态指示灯(截图中是绿点),确保 Ollama 服务是开启状态。如果 ServBay 提供启动/停止按钮,请确保其处于运行状态。
-
Bind IP 和 Bind Port: 默认的
127.0.0.1
和11434
是标准配置,意味着 Ollama 服务只监听来自本机的请求,端口为 11434。这是我们稍后 Python 脚本需要连接的地址。通常无需更改。 -
Models folder: 这是存放下载的 LLM 模型的路径。截图显示为
/Applications/ServBay/db/ollama/models
。您可以根据需要修改到具有足够磁盘空间的其他位置,但请确保路径存在且 ServBay 有写入权限。记下这个路径,虽然脚本不直接用,但了解模型在哪里有好处。 -
Model Download Threads: 下载模型时的并发线程数。如果您的网络状况良好,可以适当增加以加快下载速度。默认为 10。
-
其他选项(如 GPU Overhead, Max loaded models 等): 这些是更高级的性能调优选项。如果您有兼容的 GPU(NVIDIA 或 Apple Silicon),Ollama 通常会自动检测并使用。
Max loaded models
限制了同时加载到内存/显存中的模型数量,这取决于您的 RAM/VRAM 大小。对于批量翻译任务,通常一次只加载一个模型,默认值一般足够。 -
Origins: 这是 CORS(跨源资源共享)设置,用于控制哪些 Web 页面(来源)可以访问 Ollama API。默认包含
http://localhost
和http://127.0.0.1
的各种变体,通常足够本地脚本或本地 Web 应用访问。
重要提示: 如果您修改了任何配置,请务必点击界面右下角的 Save 按钮来保存更改。如果遇到问题,可以尝试点击 Reset 恢复到默认设置。
步骤 3:导航到模型管理界面
-
在 ServBay 左侧导航栏的 AI 分类下,点击 Models (Ollama) 。
-
您将看到类似第二张截图所示的模型管理界面。这里会列出可供下载的模型,以及您本地已安装的模型。
步骤 4:搜索并下载翻译模型
现在我们需要选择并下载一个适合翻译任务的 LLM。LLM 的翻译能力通常与其通用指令遵循能力和多语言训练数据有关。一些不错的选择可能包括(截至撰写时):
-
Llama 3 系列 (e.g.,
llama3:8b
): Meta AI 的最新开源模型,具有强大的通用能力和不错的指令遵循,通常也能处理翻译任务。8B 版本对硬件要求相对适中。 -
Mistral 系列 (e.g.,
mistral:7b
): 另一个非常受欢迎的高性能开源模型,以效率著称。 -
DeepSeek Coder/LLM 系列 (e.g.,
deepseek-llm:7b-chat
): 虽然 DeepSeek 以编码能力闻名,但其通用聊天模型通常也具备翻译能力。截图中的deepseek-r1
可能是其某个变体或特定版本。 -
专门的翻译模型(如果 Ollama 库中有): 有时会有专门为翻译优化的模型,但通用强指令模型往往效果也很好。
执行搜索和下载:
-
在模型管理界面的顶部搜索框中,输入您想查找的模型名称,例如输入
llama3
或mistral
。 -
界面会动态显示匹配的模型列表,包括不同的参数大小(如 7b, 8b, 70b 等)和标签(如
latest
,instruct
,chat
)。 -
选择模型时考虑:
- 参数量(Parameters): 如
7b
(70亿),8b
(80亿),70b
(700亿)。参数量越大,通常能力越强,但对内存(RAM)和显存(VRAM)的要求也越高,推理速度也越慢。对于批量翻译,7b
或8b
模型通常是一个很好的起点,能在性能和资源消耗之间取得平衡。 - 标签:
instruct
或chat
标签的模型通常更擅长遵循指令(如"请将以下文本翻译成...")。 - 文件大小(File Size): 注意模型文件可能很大(几 GB 到几十 GB),确保您的磁盘空间充足。
- 参数量(Parameters): 如
-
找到您想要下载的模型版本(例如
llama3:8b
),点击其右侧的 下载图标(通常是一个向下的箭头)。 -
ServBay 将开始下载模型。您可以看到下载进度。下载时间取决于您的网络速度和模型大小。
步骤 5:验证模型安装
模型下载完成后,它应该会出现在 Ollama Config
界面的左侧已安装模型列表中,并且在 Models (Ollama)
界面中,该模型的操作按钮可能会变成删除图标(🗑️
)。
步骤 6:确认 Ollama 服务正在运行
确保在 Ollama Config
界面顶部的状态指示灯显示为绿色或运行状态。ServBay 通常会在您启动应用或启用 AI 功能时自动启动 Ollama 服务。如果服务未运行,请查找启动按钮并启动它。
至此,您的 ServBay 环境已经配置好了 Ollama 服务,并且下载了一个可用于翻译的本地 LLM。接下来,我们将编写 Python 脚本来调用这个本地 AI 服务。
第三部分:编写 Python 脚本实现批量翻译
现在我们拥有了一个在本地运行并通过 API (http://127.0.0.1:11434
) 提供服务的 LLM。接下来,我们将编写一个 Python 脚本来自动化翻译流程:遍历指定的 docs
文件夹下的所有 Markdown 文件,并将它们的内容发送给 Ollama 进行翻译,最后将翻译结果保存到新的文件中。
准备工作
- Python 环境 : 确保您的系统安装了 Python。您可以在终端(Terminal)中运行
python --version
或python3 --version
来检查。ServBay 自带 Python 3。如果未安装,请从ServBay的软件包
-Python
中安装。

requests
库: 我们需要requests
库来向 Ollama API 发送 HTTP 请求。如果尚未安装,可以在终端中运行:
bash
pip install requests
# 或者
pip3 install requests
- 创建项目结构:
markdown
1. 创建一个项目文件夹,例如 `servbay_translator`。
2. 在 `servbay_translator` 文件夹内,创建一个名为 `docs` 的子文件夹。将您需要翻译的 Markdown 文件(`.md`)放入 `docs` 文件夹及其子文件夹中。例如:
3. servbay_translator/
├── docs/
│ ├── introduction.md
│ ├── chapter1/
│ │ └── setup.md
│ └── chapter2/
│ └── usage.md
└── translate_script.py (我们将创建这个文件)
4. 脚本会自动创建一个 `translated_docs` 文件夹来存放翻译后的文件,保持原始的目录结构。
Python 脚本 ( translate_script.py
)
python
import os
import requests
import json
import time
# --- 配置常量 ---
# Ollama API 的地址和端口 (与 ServBay 配置一致)
OLLAMA_API_URL = "http://127.0.0.1:11434/api/generate"
# 您在 ServBay 中下载并希望用于翻译的模型名称 (确保与 Ollama 中存在的模型名称完全一致)
# 例如: "llama3:8b", "mistral:7b", "deepseek-llm:7b-chat" 等
MODEL_NAME = "llama3:8b" # <--- 修改为您选择的模型名称!
# 源 Markdown 文件所在的目录
SOURCE_DIR = "docs"
# 存放翻译后文件的目录 (脚本会自动创建)
TARGET_DIR = "translated_docs"
# 您希望将文档翻译成的目标语言
TARGET_LANGUAGE = "Simplified Chinese" # 例如: "French", "German", "Japanese", "Spanish", "中文 (简体)"
# 可选:在请求之间添加延迟(秒),以避免过载或让系统有时间响应
REQUEST_DELAY = 1 # 1秒延迟,根据需要调整
# --- Ollama API 调用函数 ---
def translate_text_ollama(text_to_translate, model_name, target_language):
"""
使用 Ollama API 翻译给定的文本。
Args:
text_to_translate (str): 需要翻译的原始文本。
model_name (str): 要使用的 Ollama 模型名称。
target_language (str): 目标翻译语言。
Returns:
str: 翻译后的文本,如果出错则返回 None。
"""
# 构建清晰的翻译指令 prompt
prompt = f"""Translate the following Markdown text into {target_language}.
Preserve the original Markdown formatting (like headings, lists, bold text, code blocks, etc.).
Only output the translated text, without any introductory phrases like "Here is the translation:".
Original Text:
---
{text_to_translate}
---
Translated Text ({target_language}):"""
headers = {'Content-Type': 'application/json'}
data = {
"model": model_name,
"prompt": prompt,
"stream": False, # 设置为 False 以获取完整响应,而不是流式输出
# 可选参数,根据需要调整,例如 temperature 控制创造性 (较低值更保守)
# "options": {
# "temperature": 0.3
# }
}
try:
print(f" Sending request to Ollama (model: {model_name})...")
response = requests.post(OLLAMA_API_URL, headers=headers, json=data, timeout=300) # 增加超时时间到300秒
response.raise_for_status() # 检查 HTTP 错误 (例如 404, 500)
response_data = response.json()
# 从响应中提取翻译后的文本
# Ollama 的 /api/generate 响应结构通常在 'response' 字段中包含完整输出
if 'response' in response_data:
translated_text = response_data['response'].strip()
print(f" Translation received (length: {len(translated_text)} chars).")
return translated_text
else:
print(f" Error: 'response' key not found in Ollama output: {response_data}")
return None
except requests.exceptions.RequestException as e:
print(f" Error calling Ollama API: {e}")
return None
except json.JSONDecodeError:
print(f" Error decoding JSON response from Ollama: {response.text}")
return None
except Exception as e:
print(f" An unexpected error occurred during translation: {e}")
return None
# --- 主处理逻辑 ---
def process_directory(source_base, target_base):
"""
递归遍历源目录,翻译 .md 文件并保存到目标目录。
"""
print(f"\nProcessing directory: {source_base}")
for item in os.listdir(source_base):
source_path = os.path.join(source_base, item)
target_path = os.path.join(target_base, item)
if os.path.isdir(source_path):
# 如果是子目录,递归处理
print(f"- Found subdirectory: {item}")
process_directory(source_path, target_path)
elif os.path.isfile(source_path) and item.lower().endswith(".md"):
# 如果是 Markdown 文件,进行翻译
print(f"- Found Markdown file: {item}")
# 确保目标文件的父目录存在
target_file_dir = os.path.dirname(target_path)
if not os.path.exists(target_file_dir):
print(f" Creating target directory: {target_file_dir}")
os.makedirs(target_file_dir)
# 检查目标文件是否已存在,如果存在则跳过(可选)
# if os.path.exists(target_path):
# print(f" Skipping, target file already exists: {target_path}")
# continue
try:
# 读取源文件内容
print(f" Reading source file: {source_path}")
with open(source_path, 'r', encoding='utf-8') as f_in:
original_content = f_in.read()
if not original_content.strip():
print(" Skipping empty file.")
continue
# 调用 Ollama 进行翻译
translated_content = translate_text_ollama(original_content, MODEL_NAME, TARGET_LANGUAGE)
if translated_content:
# 写入翻译后的内容到目标文件
print(f" Writing translated file: {target_path}")
with open(target_path, 'w', encoding='utf-8') as f_out:
f_out.write(translated_content)
print(" Translation complete for this file.")
else:
print(f" Failed to translate file: {source_path}. Skipping.")
# 在两次API请求之间添加延迟
if REQUEST_DELAY > 0:
print(f" Waiting for {REQUEST_DELAY} second(s)...")
time.sleep(REQUEST_DELAY)
except Exception as e:
print(f" Error processing file {source_path}: {e}")
else:
print(f"- Skipping non-Markdown file or other item: {item}")
# --- 脚本入口 ---
if __name__ == "__main__":
print("Starting Markdown Bulk Translation Process...")
print(f"Source Directory: {SOURCE_DIR}")
print(f"Target Directory: {TARGET_DIR}")
print(f"Target Language: {TARGET_LANGUAGE}")
print(f"Using Ollama Model: {MODEL_NAME} at {OLLAMA_API_URL}")
print("-" * 30)
# 检查源目录是否存在
if not os.path.isdir(SOURCE_DIR):
print(f"Error: Source directory '{SOURCE_DIR}' not found.")
print("Please create the 'docs' directory and place your Markdown files inside.")
exit(1)
# 检查/创建目标目录
if not os.path.exists(TARGET_DIR):
print(f"Creating target directory: {TARGET_DIR}")
os.makedirs(TARGET_DIR)
# 开始处理
try:
process_directory(SOURCE_DIR, TARGET_DIR)
print("\n" + "=" * 30)
print("Batch translation process finished!")
print(f"Translated files are saved in the '{TARGET_DIR}' directory.")
except Exception as e:
print(f"\nAn error occurred during the process: {e}")
代码解释:
-
导入库 (
import os, requests, json, time
) :os
: 用于文件和目录操作(遍历目录、检查路径、创建目录等)。requests
: 用于向 Ollama API 发送 HTTP POST 请求。json
: 用于处理 API 请求和响应中的 JSON 数据(虽然这里主要用requests
内建的 json 处理)。time
: 用于在请求之间添加延迟 (time.sleep
)。
-
配置常量:
OLLAMA_API_URL
: Ollama 生成 API 的端点。务必与 ServBay 配置中的 IP 和端口匹配。MODEL_NAME
: 关键! 必须精确匹配您在 ServBay 中下载并希望使用的模型名称(包括标签)。请根据您实际下载的模型修改此项。SOURCE_DIR
: 包含原始.md
文件的文件夹名称。TARGET_DIR
: 保存翻译后.md
文件的文件夹名称。TARGET_LANGUAGE
: 您希望翻译成的目标语言名称。使用清晰的语言名称,如 "Simplified Chinese", "French", "German"。LLM 通常能理解这些自然语言指令。REQUEST_DELAY
: 在处理完一个文件后等待多少秒再处理下一个。这有助于避免因请求过快导致 Ollama 服务过载或本地机器资源耗尽,尤其是在处理大量文件或使用资源密集型模型时。
-
translate_text_ollama
函数:-
接收原始文本、模型名称和目标语言作为输入。
-
构建 Prompt: 这是与 LLM 沟通的关键。我们构造了一个清晰的指令,告诉模型:
- 任务是"将以下 Markdown 文本翻译成 [目标语言]"。
- 强调要"保留原始 Markdown 格式"。这对于文档翻译非常重要。
- 要求"只输出翻译后的文本",避免模型添加额外的解释性语句(如 "Here is the translation:")。
- 使用
---
分隔符清晰地标示出原始文本。
-
准备 API 请求 : 设置请求头 (
Content-Type: application/json
) 和请求体 (data
)。model
: 指定要使用的模型。prompt
: 我们精心构造的指令。stream: False
: 我们希望一次性获得完整的翻译结果,而不是流式接收片段。options
(注释掉的可选部分): 可以传递额外的 Ollama 参数,如temperature
(控制输出的随机性/创造性,对于翻译通常设置较低值如 0.2-0.5 较好)。
-
发送请求 : 使用
requests.post
发送请求到 Ollama API。设置了较长的timeout
(300秒) 以应对大型文件或较慢的模型响应。 -
错误处理:
response.raise_for_status()
: 检查 HTTP 层面是否有错误(如 404 Not Found, 500 Internal Server Error)。try...except
块捕获网络请求错误 (requests.exceptions.RequestException
)、JSON 解析错误 (json.JSONDecodeError
) 和其他意外错误。
-
解析响应 : 如果请求成功,从返回的 JSON 数据中提取
response
字段,这通常包含了 LLM 生成的完整文本(即翻译结果)。.strip()
用于移除可能存在的前后空白。 -
返回结果 : 返回翻译后的文本,或在出错时返回
None
。
-
-
process_directory
函数:-
这是一个递归函数,用于处理目录结构。
-
接收当前要处理的源目录路径 (
source_base
) 和对应的目标目录路径 (target_base
)。 -
使用
os.listdir
获取当前目录下的所有文件和子目录。 -
遍历:
-
如果是子目录 : 打印信息,并递归调用
process_directory
处理该子目录,传递更新后的源路径和目标路径。 -
如果是文件且以
.md
结尾:- 打印信息。
- 创建目标目录 : 使用
os.path.dirname
获取目标文件的预期父目录,如果该目录不存在,则使用os.makedirs
创建它(makedirs
会创建所有必需的中间目录)。 - 读取源文件 : 使用
with open(...)
以 UTF-8 编码读取.md
文件内容。 - 跳过空文件: 如果文件内容为空,则跳过。
- 调用翻译函数 : 将文件内容传递给
translate_text_ollama
函数进行翻译。 - 写入目标文件 : 如果翻译成功(返回非
None
),则以 UTF-8 编码将翻译结果写入到对应的目标路径文件。 - 处理失败: 如果翻译失败,打印错误信息并跳过该文件。
- 应用延迟 : 调用
time.sleep(REQUEST_DELAY)
等待指定秒数。
-
如果不是
.md
文件或目录: 打印跳过信息。
-
-
-
主执行块 (
if name == "__main__":
) :-
这是脚本的入口点。
-
打印启动信息,显示配置参数。
-
检查源目录 : 确保
SOURCE_DIR
存在,如果不存在则报错退出。 -
创建目标目录 : 如果
TARGET_DIR
不存在,则创建它。 -
启动处理 : 调用
process_directory
函数,从顶层源目录 (SOURCE_DIR
) 和目标目录 (TARGET_DIR
) 开始处理。 -
完成与错误捕获 : 使用
try...except
捕获整个过程中的潜在错误,并在结束后打印完成消息或错误信息。
-
第四部分:运行脚本与注意事项
如何运行脚本:
- 打开终端 (Terminal) 。
- 导航到项目目录 : 使用
cd
命令进入您创建的servbay_translator
文件夹。
bash
cd /Applications/ServBay/www/servbay_translator
- 确保 ServBay 和 Ollama 服务正在运行 : 回到 ServBay 界面,确认 AI -> Ollama 服务处于活动状态。 4. 运行 Python 脚本:
bash
python translate_script.py
# 或者如果您的系统默认 python 是 v2,请使用 python3
# python3 translate_script.py
-
观察输出: 脚本将开始运行,并在终端中打印处理进度,包括正在处理哪个目录、哪个文件,发送请求的状态,以及翻译结果的简要信息或错误。
-
检查结果 : 脚本运行完成后,检查
translated_docs
文件夹。您应该会看到与docs
文件夹结构相同的目录,其中包含翻译后的.md
文件。打开几个文件检查翻译质量和 Markdown 格式的保留情况。
注意事项与潜在优化:
-
模型选择与翻译质量:
- 翻译质量高度依赖于您选择的 LLM (
MODEL_NAME
)。不同的模型在不同语言对和文本类型上的表现可能差异很大。 - 尝试不同的模型(如
llama3
,mistral
,qwen
,gemma3
等的不同变体)和参数大小,找到最适合您需求的。 - 对于特定语言对,可能存在专门微调过的模型效果更好,可以关注 Ollama 社区或 Hugging Face 等平台寻找。
- 翻译质量高度依赖于您选择的 LLM (
-
Prompt 工程:
-
translate_text_ollama
函数中的prompt
对翻译结果影响很大。您可以尝试调整指令,例如:- 更明确地指定源语言(如果 LLM 需要)。
- 对格式保留提出更具体的要求。
- 尝试不同的措辞风格(正式、非正式)。
-
如果翻译结果不理想,首先尝试改进 prompt。
-
-
Markdown 格式保留:
- 虽然 prompt 中要求保留格式,但 LLM 有时仍可能丢失或错误处理复杂的 Markdown 语法(如嵌套列表、表格、代码块语言标识符等)。
- 翻译后务必抽查,特别是格式复杂的部分。可能需要手动修正。
-
性能与资源消耗:
-
运行 LLM 是计算密集型任务。翻译速度取决于您的 CPU、内存(RAM)以及是否有 GPU 加速。
-
大型模型(如 7B+)在没有 GPU 的情况下可能会非常慢。ServBay 的 Ollama 集成通常会自动利用可用的 GPU(NVIDIA 或 Apple Silicon)。您可以在 ServBay 的 Ollama 配置中查看相关设置。
-
如果遇到性能瓶颈或系统卡顿:
- 增加
REQUEST_DELAY
的值。 - 尝试使用参数量更小的模型(如 3B 或 4B),或者使用经过量化(Quantized)的模型(通常在模型名称中带有
q4
,q5
,q8
等标识),它们牺牲少量精度换取更快的速度和更低的资源占用。ServBay 的模型管理界面通常会列出这些量化版本。 - 在 ServBay 的 Ollama 配置中,检查
Max loaded models
和Parallel Num.
是否设置合理(对于单任务批量处理,通常不需要很高)。
- 增加
-
-
处理大型文件:
-
非常大的 Markdown 文件可能导致:
- Ollama 处理超时(脚本中设置了 300 秒,可能需要更长)。
- 超出模型的上下文窗口限制(Context Window Limit),导致内容被截断或翻译不完整。
- 消耗大量内存。
-
对于超大文件,可能需要实现分块(Chunking) 策略:将大文件分割成多个小块(例如按段落或固定字数),分别发送给 Ollama 翻译,然后再将结果合并。这会增加脚本的复杂度。
-
-
错误处理与重试:
- 脚本包含了基本的错误处理,但可以进一步增强。例如,实现自动重试机制:当 API 调用失败(如网络波动或 Ollama 临时无响应)时,等待一段时间后自动重试几次。
- 记录更详细的错误日志,方便排查问题。
-
增量翻译:
- 当前脚本每次运行时会处理所有文件(除非您手动取消)。可以修改脚本,使其检查目标文件是否存在且其修改时间是否晚于源文件,如果满足条件则跳过,实现增量翻译,只翻译新增或修改过的文件。
-
并发处理:
- 如果您的硬件足够强大(特别是多核 CPU 或强劲 GPU),并且 Ollama 配置允许并行处理 (
Parallel Num.
> 0),可以考虑使用 Python 的multiprocessing
或threading
库来并发处理多个文件,以加快整体翻译速度。但这会显著增加资源消耗和代码复杂度。
- 如果您的硬件足够强大(特别是多核 CPU 或强劲 GPU),并且 Ollama 配置允许并行处理 (
结语:开启您的本地 AI 之旅
恭喜您!通过本教程,您已经成功利用 ServBay 内置的 Ollama 功能,搭建了一个本地、私密、且自动化的 Markdown 文档批量翻译流程。您不仅了解了 ServBay 在 AI/LLM 方面的强大集成能力,还掌握了如何通过简单的 Python 脚本与本地运行的大型语言模型进行交互,解决实际问题。
这种本地 AI 的解决方案,其核心优势在于数据完全掌握在自己手中 ,无需担心隐私泄露或高昂的 API 费用。同时,它赋予了您极大的灵活性和控制权,您可以自由选择模型、调整参数、优化流程,甚至在离线环境下工作。
ServBay 作为一款优秀的集成开发环境,通过拥抱 Ollama,再次证明了其与时俱进的特性,为开发者和技术爱好者提供了一个探索和应用前沿 AI 技术的便捷平台。文档翻译仅仅是冰山一角,您可以基于此框架,探索更多本地 AI 的应用场景,例如:
-
代码生成与解释: 使用像
codellama
或deepseek-coder
这样的模型辅助编程。 -
文本摘要与信息提取: 快速理解长文档或报告的核心内容。
-
内容创作与润色: 生成博客文章、邮件草稿、创意写作等。
-
本地知识库问答: 结合 RAG (Retrieval-Augmented Generation) 技术,让 LLM 基于您的本地文档回答问题。
未来,随着本地 LLM 技术的不断发展和 ServBay 功能的持续迭代,我们有理由相信,在个人电脑上运行强大、高效、安全的 AI 应用将变得越来越普遍。现在,就从这个批量翻译项目开始,尽情探索 ServBay 和 Ollama 为您带来的本地 AI 的无限可能吧!