Python 调用 llama.cpp 运行的模型

文章目录

    参考前文,安装了 llama.cpp,并且部署好了一个本地翻译模型。

    llama.cpp 在 Windows 11 上安装,并下载运行第一个本地模型

    接下来,就是如何使用程序通过接口调用大模型了。例如:

    llama-server -m Hy-MT2-1.8B-Q6_K.gguf --port 8080
    

    运行起来之后,如何用 Python 调用模型,执行翻译任务。

    Hello World

    """
    Hy-MT2 翻译客户端 —— 调用本地 llama-server
    前置条件:llama-server -m Hy-MT2-1.8B-Q6_K.gguf --port 8080
    """
    from openai import OpenAI
    
    client = OpenAI(
        api_key="not-needed",
        base_url="http://127.0.0.1:8080/v1"
    )
    
    def translate(text, target_lang="English", source_lang="Chinese"):
        prompt = (
            f"Translate the following text from {source_lang} to {target_lang}. "
            f"Note that you should only output the translated result "
            f"without any additional explanation:\n\n{text}"
        )
    
        response = client.chat.completions.create(
            model="Hy-MT2-1.8B-Q6_K",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.1,
            max_tokens=1024,
            stream=False
        )
        return response.choices[0].message.content.strip()
    
    # 测试
    if __name__ == "__main__":
        samples = [
            ("今天天气真好,我们去散步吧。", "English"),
            ("I love programming.", "Chinese"),
            ("La vie est belle.", "English"),
        ]
        for text, target in samples:
            print(f"[{target}] {translate(text, target_lang=target)}")
    

    执行结果:

    > python .\translate.py
    [English] The weather is really nice today. Let’s go for a walk.
    [Chinese] 我喜欢编程。
    [English] Life is beautiful.
    

    下面说明一下这段 Python 代码的实现逻辑。

    为何使用 openai 库

    因为 llama-server 完全兼容 OpenAI 的 Chat Completions 接口,可以直接用官方 openai 库调用,这样做的好处是,以后切换到其他方案,就不需要修改调用逻辑了。

    当然也可以使用 http 请求的方法:

    import requests
    
    def translate(text, target_lang="English", source_lang="Chinese"):
        prompt = (
            f"Translate the following text from {source_lang} to {target_lang}. "
            f"Output only the translated text, no explanations.\n\n{text}"
        )
    
        response = requests.post(
            "http://127.0.0.1:8080/v1/chat/completions",
            json={
                "model": "Hy-MT2-1.8B-Q6_K",   # 与启动时的 --alias 一致(如有设置)
                "messages": [
                    {"role": "user", "content": prompt}
                ],
                "temperature": 0.1,
                "max_tokens": 512
            },
            timeout=120
        )
        response.raise_for_status()
        return response.json()["choices"][0]["message"]["content"]
    
    # 使用示例
    result = translate("今天天气真好,我们去散步吧。", target_lang="English")
    print(result)
    

    Hy-MT2 专用提示词模板

    Hy-MT2 是腾讯推出的翻译专用模型,官方推荐使用明确的指令格式。所以,才加入了这部分逻辑:

    def build_hymt2_prompt(text, target_lang, source_lang="Chinese"):
        """Hy-MT2 官方推荐的翻译提示词"""
        return (
            f"Translate the following text from {source_lang} to {target_lang}. "
            f"Note that you should only output the translated result "
            f"without any additional explanation:\n\n{text}"
        )
    
    # 中文提示词版本(可选)
    def build_hymt2_prompt_zh(text, target_lang="英语"):
        return (
            f"将以下文本翻译成{target_lang},"
            f"注意只需要输出翻译后的结果,不要额外解释:\n\n{text}"
        )
    

    也可以根据自己需要增加定制化的提示词。

    这段代码翻译一篇 10000 字的文章,可行么

    直接用之前那段代码一次性翻译 10000 字的文章,基本不可行。主要会卡在以下几个地方:

    • 上下文长度不够:Hy-MT2-1.8B 的上下文窗口通常只有 8K token 左右(即使大一点也有限)。10000 个汉字大约对应 10000~15000+ token,输入本身就可能超过模型上限。如果 llama-server 启动时没指定 –ctx-size,默认可能只有 512/2048,更容易直接报错或截断。
    • max_tokens=1024 太小:这是输出 token 上限。10000 字文章的译文长度通常也接近 10000 字,对应 token 数远超 1024。结果就是翻译到一半被硬截断,后面全丢了。
    • 超时与内存压力:一次性请求长文本,推理时间会很长,timeout=120 可能不够;同时 KV cache 占用大,1.8B 模型虽然小,但长上下文仍可能爆内存或变得极慢。
    • 翻译质量下降:长文本一次性输入,模型容易“遗忘”前文、重复、漏译,尤其是 1.8B 这种小模型。