第一个推理程序:加载模型、输入提示词、生成文本的完整流程
准备工作:环境与依赖
先把环境搭好,别急着跑代码。我习惯用 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。
说白了,第一个推理程序就三步:
- 加载模型(指定路径、上下文长度)
- 调用
create_completion(传提示词、生成参数) - 从返回字典里提取文本
嗯,这里还要注意一点:模型加载通常需要 10~30 秒(取决于模型大小和硬件),但之后每次生成就很快了。所以如果是 Web 服务,建议启动时只加载一次模型实例,不要每次请求都重新加载。
知识结构一览
下面这张流程图把整个推理过程串起来了,你对照着看会很清楚:
你看,整个流程像流水线一样,每一步都有固定输入输出。我建议你先把上面那个完整示例跑通,再根据自己的需求调参。模型回答不满意?多半是 temperature 和 max_tokens 没调好。别急,多做几次实验就有感觉了。