离职后随笔——通过大模型做多语言翻译
·
1、在windows笔记本作为工作站
2、下载 HY-MT1.5-7B-Q4_K_M.gguf 混元模型
3、创建excel表格,写上词条和语言,中文是必须要写的
4、运行脚本
from llama_cpp import Llama
import time
import pandas as pd
import os
import re
from pathlib import Path
# ====================== 配置项(仅需修改这里)======================
MODEL_PATH = "models/HY-MT1.5-7B-Q4_K_M.gguf" # 你的GGUF模型路径
EXCEL_PATH = "你的多语言词条表.xlsx" # 你的翻译表格路径
RES_DIR = "res/values" # 所有XML统一放此目录
# ==================================================================
lang_map = {
"zh": "中国",
"en": "英语",
"ja": "日语",
# 可扩展其他语言:
"fr": "法语",
"de": "德语",
"it": "意大利语",
}
# 3. Qwen模型翻译核心函数(严格遵循翻译规则)
def qwen_translate(llm, text: str, target_lang: str):
# 构建符合Qwen规则的Prompt
prompt = f"""[INST] 执行翻译任务:
1. 中文文本:{text}
2. 目标语言:{target_lang}
3. 核心规则:
- 严格保留文本中的 %d/%s 等占位符,位置/格式不变;
- 仅翻译占位符外的中文内容,占位符不做任何修改;
- 只输出纯{target_lang}翻译结果,无解释、无备注、无多余文字。 [/INST]"""
try:
# 调用Qwen模型(参数严格遵循规则)
output = llm.create_completion(
prompt=prompt,
max_tokens=64,
temperature=0.0,
stop=["[/INST]", "\n", "。", ":"],
echo=False,
repeat_penalty=1.5
)
# 提取并清洗结果
result = output["choices"][0]["text"].strip()
# 去除前缀(如"翻译结果:""答案:")
for prefix in ["翻译结果:", "答案:", "译文:", ":"]:
if prefix in result:
result = result.split(prefix)[-1].strip()
# 校验:占位符数量一致(可选,增强鲁棒性)
src_placeholder = len(re.findall(r"%[ds]", text))
res_placeholder = len(re.findall(r"%[ds]", result))
if src_placeholder != res_placeholder and src_placeholder > 0:
print(f"占位符数量不一致:原文[{text}] → 译文[{result}]")
return ""
return result
except Exception as e:
print(f"翻译失败[{text}→{target_lang}]:{e}")
return ""
def generate_strings_xml(df, res_dir):
"""生成 strings-{lang}.xml 文件,统一放在 values 目录下"""
# 读取语言列(跳过第一列“词条”)
lang_cols = df.columns[1:].tolist()
print(f"\n📋 检测到语言:{lang_cols}")
# 创建 values 目录(确保存在)
Path(res_dir).mkdir(parents=True, exist_ok=True)
for lang in lang_cols:
# 文件名格式:strings-{lang}.xml(如 strings-en.xml)
xml_filename = f"strings-{lang}.xml"
xml_path = Path(res_dir) / xml_filename
# 生成 XML 内容(标准 Android 格式)
xml_lines = [
'<?xml version="1.0" encoding="utf-8"?>',
'<resources>'
]
for _, row in df.iterrows():
key = row["词条"].strip()
value = row[lang].strip()
# 关键:XML 特殊字符转义(避免文件解析报错)
value = value.replace("&", "&") \
.replace("<", "<") \
.replace(">", ">") \
.replace("\"", """) \
.replace("'", "'")
xml_lines.append(f' <string name="{key}">{value}</string>')
xml_lines.append('</resources>')
# 写入文件(UTF-8 编码适配多语言)
with open(xml_path, "w", encoding="utf-8") as f:
f.write("\n".join(xml_lines))
print(f"生成文件:{xml_path}")
def init_qwen_model(model_path: str):
"""初始化千问模型(多核加速配置)"""
try:
# 核心提速参数:n_threads设为CPU核心数的2倍(比如8核设16)
llm = Llama(
model_path=model_path,
n_ctx=1024, # 短文本翻译缩小上下文,减少内存占用
n_threads=16, # 根据你的CPU核心数调整(关键提速)
n_batch=512, # 批处理大小,提升推理吞吐
verbose=False, # 关闭冗余日志
n_gpu_layers=0 # 有NVIDIA显卡请改为20~30(GPU加速)
)
print("大模型加载成功!")
return llm
except Exception as e:
print(f"模型加载失败:{str(e)}")
return None
if __name__ == "__main__":
# 1. 初始化模型
llm = init_qwen_model(MODEL_PATH)
if not llm:
exit(1)
# 2. 读取 Excel 表格
try:
df = pd.read_excel(EXCEL_PATH, dtype=object)
df = df.fillna("")
for col in df.columns:
df[col] = df[col].astype(str)
print(f"成功读取表格:{df.shape[0]} 条词条,{df.shape[1]-1} 种语言")
except Exception as e:
print(f"读取表格失败:{e}")
exit(1)
# 3. 动态获取语言列表(从表头读取,不写死)
lang_list = df.columns[1:].tolist()
source_lang = "中文"
# 4. 批量翻译
for lang in lang_list:
if lang == "zh":
continue # 中文列无需翻译
print(f"\n开始翻译 → {lang}")
for i, row in df.iterrows(): #把表格里的每一行,依次取出来处理”
cn_text = row["zh"].strip() # 从表格当前行里,找到列名为 “zh”(中文列)的单元格内容 删掉文本开头 / 结尾的空格、换行、制表符(比如 “你好”→“你好”)
if not cn_text:
print(f"跳过空词条(行{i+1})")
continue
trans_result = qwen_translate(llm, cn_text, lang_map[lang])
df.at[i, lang] = trans_result
time.sleep(0.3) # 避免模型过载
# 5. 生成所有 strings-{lang}.xml 文件(统一放 values 目录)
generate_strings_xml(df, RES_DIR)
# 6. 保存翻译后的表格(方便核对)
output_excel = "translated_result.xlsx"
df.to_excel(output_excel, index=False)
print(f"\n全部完成!")
print(f"翻译结果表格:{os.path.abspath(output_excel)}")
print(f"所有XML文件路径:{os.path.abspath(RES_DIR)}")
# 释放模型资源
llm.close()
5、等待生成多语言文件,

更多推荐
所有评论(0)