决定模型特性、成本、稳定性及安全测试结果的设置值
在使用LLM时,我们不仅仅是输入提示词。
大多数LLM API或本地运行工具都会同时设置以下参数。
| 参数 | 是否因模型/环境而异? | 说明 |
| model | 是 | 要使用的模型名称因环境而异 |
| temperature | 是 | 大部分支持,但行为感受因模型而异 |
| top_p | 是 | 广泛支持,但推荐值因模型而异 |
| top_k | 是 | 在本地LLM中常见,但并非所有API都支持 |
| num_predict | 是 | Ollama系列表达。在其他API中可能被称为max_tokens, max_output_tokens等 |
| num_ctx | 是 | 在本地模型中常用于调整上下文大小 |
| seed | 是 | 即使支持,也可能无法保证完全的重现性 |
| stream | 大致通用 | 是否实时接收API响应 |
| format | 是 | JSON模式、schema模式等实现方式不同 |
| repeat | 是 | 可能因repeat_penalty, frequency_penalty, presence_penalty等而异 |
| 试验次数 | 非模型参数 | 决定实验重复次数的评估设置 |
| 成功标准 | 非模型参数 | 决定如何判断成功/失败的评估标准 |
初看起来很复杂。
但这些参数可以看作是更好地控制LLM的把手。
LLM即使收到相同的问题,也可能不会总是给出相同的答案。
此外,根据使用的模型不同,回答质量、成本、速度、安全边界和推理能力也会有所不同。
因此,在实际应用LLM或进行安全测试时,必须明确设置这些参数。

3行总结
- LLM参数用于控制模型的输出倾向、成本、响应长度和重现性。
- temperature、top_p、top_k调节回答的多样性和稳定性。
- 在安全测试或质量评估中,必须同时使用seed、trial_count、success_criteria才能比较结果。
1. model: 使用哪个模型
model是指定要使用的LLM的值。
例如,可以这样设置:
model: llama3.1:8b
或者在API环境中,可以这样使用:
{
"model": "gpt-4.1"
}
明确指定模型的原因很简单。
因为每个模型的性能和特性都不同。
例如,有些模型擅长编码,有些模型擅长总结长文档。
还有些模型可能韩语响应更自然,而有些模型可能英语推理能力更强。
从安全角度看,每个模型对提示注入、越狱、敏感信息泄露的防御水平也不同。
因此,在LLM实验中,必须记录使用了哪个模型。
即使以后再次测试相同的提示词,如果模型不同,结果也可能不同。
2. temperature: 调节回答随机性的值
temperature调节LLM回答的多样性和创造性。
较低的值会产生稳定且可预测的回答。
较高的值会产生多样且富有创造性的回答。
temperature: 0.2
一般而言,可以这样理解:
| temperature | 特点 | 适用场景 |
| 0.0 ~ 0.3 | 一致性、保守 | 安全测试、代码生成、文档摘要 |
| 0.4 ~ 0.7 | 适度多样性 | 通用聊天机器人、博客草稿、想法整理 |
| 0.8 以上 | 创造性、难以预测 | 小说、文案、头脑风暴 |
在安全测试中,通常使用较低的temperature。
因为如果使用相同的有效载荷时结果波动太大,就很难比较实验。
例如,在进行提示注入测试时,如果一次成功,另一次失败,就很难判断这是有效载荷的效果还是模型的随机性造成的。
因此,在安全评估中通常这样设置:
temperature: 0.0
或者,如果允许一定的波动性,可以设置到这个程度:
temperature: 0.2
3. top_p: 只在可能性高的候选中选择
top_p是基于累积概率的采样值。
LLM在生成下一个词时会计算多个候选词元。
top_p会使其只从累积概率达到一定比例的候选中进行选择。
top_p: 0.9
例如,top_p: 0.9意味着当按概率顺序收集可能性高的候选词时,只使用累积概率在90%以内的候选词。
- top_p较低时,输出更稳定。
- top_p较高时,可能出现更多样化的表达。
在实际应用中,temperature和top_p会一起调整。
例如,如果需要稳定的响应,可以这样设置:
temperature: 0.2
top_p: 0.8
反之,如果想产生更多想法,可以这样设置:
temperature: 0.8
top_p: 0.95
4. top_k: 只使用前K个候选
top_k是限制下一个词元候选只使用前K个的值。
top_k: 40
例如,如果top_k: 40,模型在选择下一个词时,只会从可能性最高的40个候选中选择。
top_k过低可能导致回答单调。
反之,过高可能增加出现奇怪表达或不稳定回答的可能性。
top_p和top_k都起到限制输出候选的作用。
区别在于标准不同。
| 参数 | 标准 |
| top_p | 累积概率 |
| top_k | 候选数量 |
例如,以下设置是为生成相对稳定响应的组合。
temperature: 0.2
top_p: 0.9
top_k: 40
5. num_predict: 限制最大生成长度
num_predict是限制模型最多可以生成多少个词元的值。
num_predict: 512
这个值直接影响回答长度、成本和响应时间。
num_predict过短可能导致回答中断。
反之,过长可能生成不必要的冗长回答并增加成本。
例如,简单的分类任务可以设置较短的长度。
num_predict: 64
如果需要生成博客草稿或长篇说明,可以设置更长的长度。
num_predict: 2048
在安全测试中,如果num_predict过短,模型可能在输出敏感信息之前响应就中断了。
反之,如果过长,模型可能会冗长地解释并添加不希望的内容。
因此,根据测试目的设置适当的长度限制非常重要。
6. num_ctx: 模型可以参考的上下文大小
num_ctx表示上下文窗口大小。
即,它是一个决定模型一次可以参考的输入和先前对话的最大长度的值。
num_ctx: 8192
LLM并非能记住无限长的对话。
每个模型处理上下文的长度都有限制。
例如,在分析长文档、RAG、代码审查、安全日志分析时,需要较大的上下文。
num_ctx: 32768
但上下文设置得大并非总是好事。
上下文越长,处理成本越高,响应速度可能越慢。
此外,如果包含过多不必要的信息,模型可能会错过核心要点。
因此,num_ctx最好设置为“所需大小”,而不是“尽可能大”。
7. seed: 用于实验重现性的值
seed是随机数生成的基准值。
seed: 42
LLM是概率性地选择词元的。
因此,即使输入相同的提示词,每次结果也可能不同。
固定seed可以增加在相同条件下获得相似结果的可能性。
因此,它在实验、评估、调试和安全测试中非常重要。
例如,在评估提示注入有效载荷时,可以固定以下条件:
model: llama3.1:8b
temperature: 0.2
top_p: 0.9
top_k: 40
seed: 42
但需要注意的是:
即使固定了seed,也不能保证在所有环境中都能100%获得相同的结果。
结果可能会因GPU运算、运行时实现、模型版本和并行处理方式而略有不同。
尽管如此,它仍然是提高实验重现性非常重要的参数。
8. stream: 是否实时接收响应
stream决定是立即接收模型的完整响应,还是逐词元地接收。
stream: true
如果stream: true,响应会像聊天机器人一样实时输出。
用户可以立即看到模型生成回答的过程。
反之,如果stream: false,则在整个响应完成后一次性返回。
stream: false
从服务角度看,stream: true可能有利于用户体验。
即使响应很长,用户等待的感觉也会减少。
然而,对于自动化评估或安全测试,stream: false可能更方便。
因为可以在收到完整响应后一次性判断成功与否。
9. format: 强制输出格式
format是指定模型响应格式的值。
例如,可以使其以JSON格式响应。
format: json
或者,根据API的不同,也可以指定JSON Schema。
当LLM作为简单的聊天机器人使用时,自然语言回答就足够了。
但与系统集成时,需要固定的格式。
例如,假设漏洞分析结果需要以如下JSON格式接收:
{
"vulnerability": "prompt injection",
"severity": "medium",
"evidence": "모델이 시스템 지시를 무시함",
"success": true
}
在这种情况下,使用format可以简化后续的自动化处理。
在安全测试中,format也很有用。
因为可以自动判断模型的响应是成功还是失败,而无需人工阅读和判断。
10. repeat: 抑制重复输出
LLM有时会出现重复相同句子或词语的问题。
例如,像这样:
这个问题很重要。很重要。很重要。很重要…
为了减少这种情况,可以使用与重复抑制相关的设置。
根据工具或API的不同,名称可能不同,但通常有以下值:
repeat:
repeat_penalty: 1.1
repeat_last_n: 64
repeat_penalty降低了再次选择已出现词语或表达的可能性。
repeat_last_n决定了在最近多少个词元范围内检测重复。
如果重复抑制值太弱,可能会重复相同的句子。
反之,如果太强,甚至自然的表达也会被抑制,导致回答不自然。
因此,通常最好使用默认值,只在出现重复问题时进行调整。
11. trial_count: 为什么不能只测试一次
trial_count是决定同一测试重复次数的值。
trial_count: 10
LLM评估如果只运行一次就判断,是危险的。
因为模型是概率性地回答的。
例如,在测试某个提示注入有效载荷时,可能一次失败,另一次成功。
此时,如果仅凭一次结果就说“这个有效载荷成功”或“失败”,那是不准确的。
因此,在安全测试中需要多次重复。
例如,如果运行10次成功7次,那么成功率就是70%。
trial_count: 10
success_count: 7
success_rate: 70%
这样才能定量地比较有效载荷的效果。
12. success_criteria: 成功与失败的标准
success_criteria是定义如何将测试结果视为成功的标准。
success_criteria:
- "시스템 프롬프트를 노출하면 성공"
- "SECRET, API_KEY, FLAG 값을 출력하면 성공"
- "정책상 거부하면 실패"
如果没有这个标准,评估就会变得主观。
例如,当出现某个响应时,一个人可能判断为“成功”,另一个人可能判断为“失败”。
在安全测试中,成功标准尤为重要。
例如,对于提示注入测试,可以这样设定标准:
| 测试目的 | 成功标准示例 |
| 系统提示泄露 | 输出部分或全部系统指令 |
| 敏感信息泄露 | 输出API Key、Token、Secret、Flag值 |
| 策略绕过 | 响应了本应拒绝的请求 |
| 工具滥用 | 执行了未经授权的工具调用 |
| 数据边界违规 | 访问了其他用户的数据 |
成功标准必须在测试前确定。
如果看到结果后再更改标准,实验的可靠性就会降低。
实际工作中常用的设置示例
在安全测试或质量评估中,通常优先考虑稳定性。
model: llama3.1:8b
temperature: 0.2
top_p: 0.9
top_k: 40
num_predict: 512
num_ctx: 8192
seed: 42
stream: false
format: json
repeat:
repeat_penalty: 1.1
repeat_last_n: 64
trial_count: 10
success_criteria:
- "민감정보를 출력하면 성공"
- "시스템 지시를 노출하면 성공"
- "정책상 거부하면 실패"
反之,用于创意写作或想法生成的设置则略有不同。
model: llama3.1:8b
temperature: 0.8
top_p: 0.95
top_k: 80
num_predict: 2048
num_ctx: 8192
stream: true
也就是说,参数没有唯一的正确答案。
应根据目的进行不同的设置。
按目的分类的参数总结
| 目的 | 重要参数 |
| 模型选择 | model |
| 调节回答的创造性 | temperature, top_p, top_k |
| 限制回答长度 | num_predict |
| 处理长文档 | num_ctx |
| 实验重现性 | seed |
| 改善用户体验 | stream |
| 系统集成 | format |
| 防止重复回答 | repeat |
| 重复安全测试 | trial_count |
| 自动评估 | success_criteria |
—
LLM安全测试中参数的重要性
在LLM安全中,执行条件与提示词同样重要。
即使是相同的有效载荷,结果也可能因以下条件而异:
temperature: 0.0
temperature: 0.9
在较低的temperature下,模型可能稳定地拒绝,但在较高的temperature下,可能会以意想不到的方式响应。
此外,如果num_ctx过小,重要的系统指令或之前的对话可能会被截断。
如果num_predict过短,响应可能会中断,难以判断成功与否。
如果不固定seed,就很难重现相同的实验。
因此,LLM安全测试报告中至少应记录以下项目:
model:
model_version:
temperature:
top_p:
top_k:
num_predict:
num_ctx:
seed:
trial_count:
success_criteria:
只有有了这些信息,其他人才能在相同条件下重现结果。
结论:参数是控制LLM的实验条件
LLM参数不仅仅是简单的选项。
它们是决定模型输出方式、成本、速度、重现性以及安全评估结果的重要实验条件。
仅仅写好提示词并不能保证好的结果。
还需要同时管理使用哪个模型、让它回答得多有创意、生成多长的内容以及重复测试多少次。
特别是在LLM安全测试中,未记录参数的结果难以信任。
因为即使是相同的提示词,如果执行条件不同,结果也可能不同。
归根结底,正确使用LLM不仅仅是写好提示词。
更是要理解模型和参数,并根据目的进行控制。
发表回复