| 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) |