File size: 4,058 Bytes
1e495f3 42742c6 1e495f3 69f7e51 1e495f3 69f7e51 1e495f3 |
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
from logging import getLogger
from pathlib import Path
from llama_cpp import Llama
from functools import lru_cache
from lib.utils import Timer
logger = getLogger(__name__)
LLM_SYS_PROMPT_EN= """
你是一名专业的同声传译员,正在为 GOSIM 会议提供英中翻译服务。你的任务是准确、流畅地翻译发言内容。
请遵循以下要求:
1. 语言风格:翻译成中文时,请使用自然、流畅、符合现代汉语口语习惯的表达方式。避免生硬、逐字翻译的痕迹,要让听众容易理解。
2. 专业术语:**请优先参考下方提供的术语对照表进行翻译。** 对于对照表中未包含的术语,如果该术语有公认的标准翻译,请使用标准翻译;如果没有或不确定,请保留英文原文。不要用通俗词汇替代专业术语。
3. 专有名词:对于专有名词,如会议名称 "GOSIM"、人名、公司名、项目名、特定技术名称等,请保留其原始英文不做翻译。
4. 流畅性与准确性:在追求口语化的同时,务必保证信息传达的准确性。
5. 输出:请直接输出翻译结果,不要添加任何额外的解释或说明。
**专业术语对照表:**
* driver: 驱动
* bus: 总线
* mask: 掩码
* preemption: 抢占
* register: 寄存器
* Library: 库
* biases: 偏移
* OpenAGI: OpenAGI
* LLaMA Factory: LLaMA Factory
* OPENGL: OPENGL
现在,请将以下内容翻译成中文:
"""
LLM_SYS_PROMPT_ZH = """
你是一位中英文翻译专家。请将以下中文文本翻译成英文,遵循以下要求:
翻译要求:
- 保留原文英文内容:以下内容请保持原始英文形式,不进行翻译或改写:
- 技术术语与专业词汇
- 产品名称、品牌名称
- 代码片段、函数名、变量名
- 专有名词、缩写、首字母缩略词(如 API、NLP、RAG 等)
- 翻译符合英文表达习惯,流畅自然,不生硬直译。
- 保持专业性与准确性,清晰传达原意。
- 如遇原文表达模糊或逻辑不清的情况,允许适度调整语序或措辞,以增强英文表述的清晰度和逻辑性。
注意:
若难以确定某个词汇是否需要翻译,请优先保留原始英文形式。
不需添加额外解释或注释,仅翻译正文内容。
特别注意,翻译的内容只能包含英文,不能包含其他的语言。
文本:"""
MODEL_PATH = Path("/Users/jeqin/work/code/Translator/python_server/moyoyo_asr_models/qwen2.5-1.5b-instruct-q5_0.gguf")
class QwenTranslator:
def __init__(self, model_path=MODEL_PATH, system_prompt_en=LLM_SYS_PROMPT_EN, system_prompt_zh=LLM_SYS_PROMPT_ZH) -> None:
with Timer("load llm"):
self.llm = Llama(
model_path=str(model_path),
chat_format="chatml",
n_gpu_layers=-1,
verbose=False)
self.sys_prompt_en = system_prompt_en
self.sys_prompt_zh = system_prompt_zh
self._warmup()
def to_message(self, prompt, src_lang, dst_lang):
"""构造提示词"""
return [
{"role": "system", "content": self.sys_prompt_en if src_lang == "en" else self.sys_prompt_zh},
{"role": "user", "content": prompt},
]
def _warmup(self):
self.translate(prompt="how are you?", src_lang="en", dst_lang="zh")
@lru_cache(maxsize=10)
def translate(self, prompt, src_lang, dst_lang):
message = self.to_message(prompt, src_lang, dst_lang)
with Timer("llm inference") as t:
output = self.llm.create_chat_completion(messages=message, temperature=0)
return output['choices'][0]['message']['content'], t.duration
if __name__ == '__main__':
model_dir = Path("/Users/jeqin/work/code/Translator/moyoyo_asr_models")
qwen2 = (model_dir / "qwen2.5-1.5b-instruct-q5_0.gguf").as_posix()
qwen3 = (model_dir / "Qwen_Qwen3-1.7B-Q4_K_M.gguf").as_posix()
translator = QwenTranslator(qwen3)
text, time_cost =translator.translate("今天天气怎么样?", "zh", "en")
print(text)
print(time_cost) |