停止条件与最大回复长度——避免无限生成
两个核心参数
max_new_tokens
单次回复最多生成多少 token。token 大致等于英文 4 字符、中文 1~2 个汉字。常用数值:
| 场景 | 推荐值 |
|---|---|
| 简短问答 | 256 |
| 常规回答 | 512(默认值) |
| 长文写作 / 代码生成 | 1024 ~ 2048 |
| 超长输出 | 4096(需要足够大的上下文窗口) |
设太小会导致回复被截断、说一半就停;设太大浪费内存和时间。
stop tokens
停止序列。当模型生成了这段特定文本时,立即停止。常见的停止序列包括:
<|endoftext|>:模型的默认结束符\n\n:连续两个换行,表示段落结束- 特定对话格式的结束标记(如
<|im_end|>)
llama.cpp 和大部分 GGUF 模型会自动处理停止序列,一般不需要手动添加。
为什么会「无限生成」
有时模型会陷入循环,重复同一句话或同一段落。常见原因:
- 温度太低 + 上下文太长:模型在长上下文里找不到清晰的结束信号,就在一个局部最优里打转
- 模型本身缺少对话格式训练:基础模型(非 Instruct 版)不会自己停下来
- 没有正确的 stop token:某些自定义导入的 GGUF 文件格式不完整
防无限生成的三重保险
- 必设 max_new_tokens:哪怕模型失控也会在达到上限时强制截断
- 使用 Instruct 版模型:指令微调版自带对话结束模式
- 适当提高温度:温度 0.3 ~ 0.7 的区间,循环概率远低于温度 0 的确定性模式
回复太长怎么办
生成完发现回复远超预期长度,直接长按 → 重新生成。重新生成可以用不同参数跑,也可以在原始 prompt 里明确加一句「请控制在 200 字以内」来引导模型。