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)