第一个推理程序:加载模型、输入提示词、生成文本的完整流程

准备工作:环境与依赖

先把环境搭好,别急着跑代码。我习惯用 llama-cpp-python 这个包,你直接用 pip 装就行:

pip install llama-cpp-python

如果你有 GPU,装支持 CUDA 的版本更快——在命令行加个参数:

CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install llama-cpp-python

然后去 Hugging Face 下载一个 GGUF 格式的模型。新手建议先用 Q4_K_M 量化版,比如 llama-2-7b-chat.Q4_K_M.gguf,文件大概 4GB,普通显卡也能跑。我习惯把模型放到项目根目录下的 models/ 文件夹里,路径清爽,不容易搞混。

加载模型的核心代码

加载模型其实就一行:

from llama_cpp import Llama

llm = Llama(
    model_path="models/llama-2-7b-chat.Q4_K_M.gguf",
    n_ctx=2048,
    n_threads=4
)

参数不多,但每个都有讲究。我这里列个表,你以后调参直接查:

参数 作用 我常用的值
model_path 模型文件的路径(绝对或相对) models/xxx.gguf
n_ctx 上下文窗口大小,影响能记住多少历史对话 2048(够用),显存大就 4096
n_threads 推理时使用的 CPU 线程数 你的物理核心数(比如 4 或 8)
n_gpu_layers 把多少层放到 GPU 上计算,默认 0(纯 CPU) 显卡不错就设 40,全量跑 GPU
verbose 是否打印加载日志,默认 True 调试用 True,上线设 False

注意路径坑:我曾经直接把模型文件放在桌面,然后写了个相对路径 model.gguf,结果脚本报找不到文件。后来养成习惯:要么用绝对路径,要么把模型放到项目目录下,用相对路径 models/xxx.gguf 最稳。

输入提示词 & 生成文本

模型加载好了,接下来就是喂提示词。调用方法很简单:

prompt = "Q: 什么是二叉树?\nA:"
response = llm.create_completion(
    prompt,
    max_tokens=256,
    temperature=0.7
)

create_completion 会返回一个字典,里面包含 tokens、choices、usage 等字段。我们实际需要用的一般只有 response["choices"][0]["text"],这就是模型生成的文本。

看个完整示例:

from llama_cpp import Llama

llm = Llama(
    model_path="models/llama-2-7b-chat.Q4_K_M.gguf",
    n_ctx=2048,
    n_threads=4,
    verbose=False
)

prompt = "用一句话解释什么是递归。"
result = llm.create_completion(prompt, max_tokens=128, temperature=0.5)

answer = result["choices"][0]["text"]
print("模型回答:", answer)

你看,从加载模型到输出回答,核心代码不到 10 行。运行后控制台就会打印出模型生成的一句话。

每个参数都影响生成质量

这几个参数特别关键,我单独拎出来说:

  • max_tokens:生成长度的上限。设 256 算中等,我写长文分析时会设 1024,但注意显存会跟着涨。
  • temperature:控制随机程度。0 表示确定输出(总是选最高概率词),1 表示非常随机。问答类任务我常用 0.3~0.5,创意写作开到 0.8。
  • top_p:核采样,通常设 0.9 左右。与 temperature 二选一即可,我倾向于只用 temperature。
  • stop:停止词。比如你设 stop=["\n"],模型生成到换行就停,很适合生成短答案。

小技巧:第一次跑时把 verbose=True 打开,你能看到模型文件加载用了多久、有多少层移到了 GPU,这些日志对排查性能问题特别有用。

避坑指南与优化建议

这些年我踩过不少坑,挑几个最常见的提醒你:

  • n_ctx 设置过大导致显存爆掉:我写过 n_ctx=8192,结果 8GB 显存直接 OOM。其实大部分对话场景 2048 就够用,别盲目开大。
  • CPU 推理太慢:如果纯用 CPU,生成一个 token 可能要半秒。这时候可以加个 n_gpu_layers=40,把大部分层扔给 GPU,速度能快 5-10 倍。
  • 提示词格式不匹配:不同模型训练时用的对话模板不一样。LLaMA 2 原版期待 "[INST] 指令 [/INST]" 这种格式。你直接输入纯文本也能生成,但效果会偏。建议去模型卡片里查一下它的 prompt template。

说白了,第一个推理程序就三步:

  1. 加载模型(指定路径、上下文长度)
  2. 调用 create_completion(传提示词、生成参数)
  3. 从返回字典里提取文本

嗯,这里还要注意一点:模型加载通常需要 10~30 秒(取决于模型大小和硬件),但之后每次生成就很快了。所以如果是 Web 服务,建议启动时只加载一次模型实例,不要每次请求都重新加载。

知识结构一览

下面这张流程图把整个推理过程串起来了,你对照着看会很清楚:

第一个推理程序的完整流程 1. 安装依赖 pip install llama-cpp-python 2. 加载模型 Llama(model_path, n_ctx, …) 3. 配置参数 max_tokens, temperature 4. 输入提示词 prompt = "Q: …" 5. 生成与输出 response["choices"][0]["text"] 注意:模型格式必须是 GGUF 其他格式需转换工具。 我第一次用 GGML 旧格式 跑了半天没结果…… 提示词格式影响很大 LLaMA 2 用 [INST] [/INST] LLaMA 3 用 <|begin_of_text|> 不对应就胡言乱语。

你看,整个流程像流水线一样,每一步都有固定输入输出。我建议你先把上面那个完整示例跑通,再根据自己的需求调参。模型回答不满意?多半是 temperature 和 max_tokens 没调好。别急,多做几次实验就有感觉了。