4、纯文本推理基础:使用main命令进行文本生成、理解上下文窗口(context size)、温度与top_p采样参数调优

好,咱们进入正题。

纯文本推理,说白了就是让模型「读一段话,接下一段话」。这是多模态推理的基石。你想想看,如果连纯文本都玩不转,后面加图片、加音频就更别想了。

我个人习惯,拿到一个新模型,第一件事就是跑一遍纯文本生成。不是为了看效果,而是为了摸清它的「脾气」——上下文窗口多大、温度该设多少、top_p要不要动。这些参数调好了,后面才能省心。

4.1 用main命令跑通第一个文本生成

llama.cpp 的 main 命令,就是你的主力工具。用法其实很简单:

./main -m models/qwen2.5-7b-instruct-q4_k_m.gguf \
       -p "请用一句话解释什么是量子纠缠" \
       -n 128 \
       --temp 0.7 \
       --top-p 0.9

解释一下这几个参数:

  • -m:模型路径。我建议用绝对路径,省得找半天。
  • -p:提示词(prompt)。就是你要问的问题。
  • -n:生成的最大 token 数。128 够用,想写长文可以设 512 或 1024。
  • --temp:温度。控制随机性,后面细讲。
  • --top-p:核采样。也是控制随机性的。

跑完之后,你会看到模型输出的文本。嗯,这里要注意:第一次跑可能很慢,因为要加载模型。后面就快了。

小技巧: 如果模型输出乱码,八成是 prompt 格式不对。指令模型通常需要特定的模板,比如 <|im_start|>user\n...<|im_end|>\n<|im_start|>assistant\n。我建议先查一下模型的官方文档。

4.2 理解上下文窗口(Context Size)

上下文窗口,就是模型一次能「记住」多少内容。单位是 token,不是汉字。一个汉字大约占 1-2 个 token。

举个例子:

  • 如果 context size 是 4096,模型最多能处理约 2000-3000 个汉字。
  • 如果 context size 是 32768,那就是 16000-20000 个汉字。

我在项目中遇到过一个问题:用 7B 模型做长文档摘要,context size 设了 8192,结果模型输出到一半就开始「胡言乱语」。后来发现,模型的有效上下文其实只有 4096,超过这个数,注意力就开始「飘」了。

怎么设置?用 -c 参数:

./main -m models/qwen2.5-7b-instruct-q4_k_m.gguf \
       -p "请总结以下文章..." \
       -c 8192 \
       -n 512
避坑指南: 我曾经把 context size 设得比模型支持的最大值还大,结果直接 OOM(内存溢出)。建议先查模型文档,或者用 --memory-f32 参数看看内存占用。一般 7B 模型,context size 设 4096 比较稳妥。

为什么会这样?因为 context size 越大,KV cache 占的内存就越多。公式是:内存占用 ≈ context size × 层数 × 头数 × 精度。你想想看,从 4096 翻到 8192,内存直接翻倍。

4.3 温度(Temperature)与 top_p 采样参数调优

这两个参数,说白了就是控制模型「敢不敢冒险」。温度低,模型就保守,输出确定性高;温度高,模型就「放飞自我」,输出更随机。

参数 取值范围 效果 典型场景
温度(temp) 0.0 - 2.0 低值:输出稳定、重复性高;高值:输出多样、可能跑题 0.7 用于对话,1.2 用于创意写作
top_p 0.0 - 1.0 低值:只从概率最高的词中选;高值:考虑更多候选词 0.9 用于通用场景,0.5 用于代码生成

我个人习惯,先固定 top_p 为 0.9,然后调温度。为什么?因为 top_p 的作用是「截断低概率词」,而温度是「重新分配概率」。两者配合使用,效果更好。

举个例子:

# 保守模式:适合代码生成、事实问答
./main -m models/qwen2.5-7b-instruct-q4_k_m.gguf \
       -p "用Python写一个快速排序" \
       --temp 0.2 \
       --top-p 0.5

# 创意模式:适合故事写作、头脑风暴
./main -m models/qwen2.5-7b-instruct-q4_k_m.gguf \
       -p "写一个关于时间旅行的短故事" \
       --temp 1.0 \
       --top-p 0.95
核心要点:
  • 温度 0.0 就是「贪心采样」,每次都选概率最高的词。输出稳定但无聊。
  • 温度 1.0 就是「原始概率分布」,不做任何调整。
  • 温度 > 1.0 就是「鼓励冒险」,但容易跑题。
  • top_p 0.9 的意思是:只从累计概率达到 90% 的词中选。剩下的 10% 直接扔掉。

嗯,这里要提醒一句:不要同时把温度和 top_p 都设得很高。我曾经试过 temp=1.5, top_p=0.99,结果模型输出了一堆「意识流」文字,完全没法看。建议先调温度,再微调 top_p。

4.4 知识体系总览

下面这张图,帮你理清本章的核心逻辑:

纯文本推理核心知识体系 main命令基础 -m -p -n 参数 上下文窗口 -c 参数 / KV Cache 采样参数调优 --temp / --top-p 模型加载 prompt格式 token计数 内存占用 温度调优 top_p调优 核心原则:先跑通 → 再调参 → 最后优化 温度控制「敢不敢冒险」,top_p控制「从哪些词里选」

4.5 实战建议

最后,给你几个实战建议:

  1. 先跑默认参数:别一上来就调参。先用 temp=0.7, top_p=0.9 跑一遍,看看效果。
  2. 观察输出质量:如果输出太重复,就调高温度;如果输出太散,就调低温度。
  3. 注意 context size 上限:我建议设成模型支持的最大值的 80%,留点余量。
  4. 善用 --repeat-penalty:如果模型总爱重复同一句话,可以设 --repeat-penalty 1.1 来惩罚重复。
我的个人习惯: 每次调参只改一个参数。改完跑一次,对比输出。这样你才知道到底是哪个参数起了作用。别学我当年,一次改三个参数,结果模型输出变好了,但完全不知道是哪个参数立功了。

好了,纯文本推理的基础就这些。记住:main 命令是你的瑞士军刀,context size 是你的工作台,温度和 top_p 是你的调色盘。用好它们,你就能让模型「听话」地输出你想要的内容。


公众号:蓝海资料掘金营,微信deep3321