设备: 高通跃龙IQ-9100 EVK (SA8775P, Hexagon v73)
运行时: Qualcomm Genie 1.14.0
模型: Qwen2.5-7B-Instruct (w4a16, 本地编译)
应用: 农业边缘 AI 咨询系统
本文将分享Genie 运行时不支持 repeat_penalty 时的 LLM 重复输出解决方案。
一、问题现象
Qwen2.5-7B-Instruct 在 Genie 运行时上生成回答时,经常出现内容重复:
Q: 请介绍一下量子计算 A: 量子计算是一种利用量子力学原理进行计算的技术。量子计算利用量子比特(qubit)代替经典计算中的比特(bit)。 量子计算是一种利用量子力学原理进行计算的技术。量子计算利用量子比特(qubit)代替经典计算中的比特(bit)。 量子计算是一种利用量子力学原理进行...整段内容循环重复,直到达到最大 token 数。
这个问题在开放式问题(“请介绍…”、“什么是…”)上尤其明显,而对于有明确答案的问题(“2+3等于几”)则不太会触发。
二、分析:为什么常规方案不适用
2.1repeat-penalty不被支持
大多数 LLM 推理框架(如 llama.cpp、vLLM)支持repeat-penalty(重复惩罚)采样参数,用于降低已出现 token 的生成概率。这是抑制重复输出的标准方案。
但Genie Runtime 1.14.0 不支持repeat-penalty。在genie_config.json的sampler配置中设置此参数会被直接忽略。Genie 的采样器仅支持以下参数:
| 参数 | 支持状态 |
|---|---|
seed | ✅ 支持 |
temp | ✅ 支持 |
top-k | ✅ 支持 |
top-p | ✅ 支持 |
repeat-penalty | ❌ 不支持 |
2.2 单独调整采样参数效果有限
降低temp、top-k、top-p可以在一定程度上减少重复,但无法完全消除。例如:
| 配置 | 重复频率 |
|---|---|
| temp=0.8, top-k=40, top-p=0.95(默认) | 频繁重复 |
| temp=0.6, top-k=30, top-p=0.85 | 偶尔重复 |
| temp=0.3, top-k=10, top-p=0.7 | 减少但仍存在 |
过于保守的采样参数会导致回答单调、缺乏多样性。需要一个不依赖采样器参数的解决方案。
三、解决方案:ChatML System Prompt
Qwen2.5-7B-Instruct 使用 ChatML 格式的对话模板。通过在 system prompt 中加入明确的反重复指令,可以在模型生成层面抑制重复。
3.1 有效的 system prompt
<|im_start|>system You are an agricultural AI assistant. Keep your answers concise. Do not repeat yourself.<|im_end|> <|im_start|>user 请介绍一下量子计算<|im_end|> <|im_start|>assistant其中“Do not repeat yourself”是最关键的一句。
3.2 效果对比
| 配置 | 重复情况 |
|---|---|
| 无 system prompt | 频繁重复 |
| system prompt 但无反重复指令 | 仍然重复 |
| system prompt + “Do not repeat yourself” | 不再重复 |
| system prompt + “Do not repeat yourself” + 调整采样参数 | 不再重复,回答质量进一步提升 |
“Do not repeat yourself” 是单一最有效的措施。在此基础上配合适度的采样参数调整(temp=0.6, top-k=30, top-p=0.85),效果最佳。
四、在农业 AI 应用中的实际配置
我们的应用场景是在 IQ-9100 边缘设备上运行农业咨询系统,接入温湿度传感器数据,通过 LLM 提供种植建议。
4.1 完整的 prompt 构造
应用在每次用户提问时,动态注入当前传感器数据到 system prompt:
<|im_start|>system You are an agricultural AI assistant. Current sensor readings: Temperature 23.6°C, Humidity 56.2%. Keep your answers concise and to the point. Do not repeat yourself.<|im_end|> <|im_start|>user 现在适合浇水吗?<|im_end|> <|im_start|>assistant4.2 genie_config.json 采样参数
{"sampler":{"version":1,"seed":42,"temp":0.6,"top-k":30,"top-p":0.85}}4.3 实际效果
- 中英文回答均无重复
- 回答引用实际传感器数据(“当前温度 23.6°C…”)
- 单次回答时间 3–13 秒(取决于输出长度)
- TTFT 约 176 ms,token 生成速率约 9.2 tok/s
五、为什么 prompt 指令能替代 repeat_penalty
repeat_penalty在采样阶段降低已出现 token 的 logits 概率——这是一个后处理机制。
而 system prompt 中的 “Do not repeat yourself” 在模型生成阶段就起作用——它作为注意力机制的一部分,影响模型内部的状态传播。对于经过 instruction tuning 的模型(如 Qwen2.5-Instruct),模型能够理解并遵循这类行为约束指令。
两者的区别:
| 机制 | 作用阶段 | 原理 |
|---|---|---|
repeat_penalty | 采样后处理 | 降低已出现 token 的概率 |
| system prompt 指令 | 模型生成 | 通过注意力机制影响内部状态 |
在没有repeat_penalty可用的情况下,prompt 指令提供了一个有效的替代方案——前提是模型经过了充分的 instruction tuning。
六、总结
Genie Runtime 1.14.0 不支持
repeat-penalty采样参数。在genie_config.json中设置该参数会被忽略。ChatML system prompt 中的 “Do not repeat yourself” 是最有效的替代方案。它在模型生成阶段抑制重复,不依赖采样器功能。
配合适度的采样参数调整(
temp=0.6, top-k=30, top-p=0.85)可以进一步提升回答质量。该方案适用于所有经过 instruction tuning 的模型。在应用中将反重复指令纳入标准的 system prompt 模板即可。