【AI】小参数,大影响:从OpenAI参数看AI开发挑战
欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。
目录
- 引言
- 如何输入、与大模型交互?
- 如何控制模型的随机性与创造性?
- 二选一的temperature与top_p
- temperature
- top_p
- 如何控制输出的长度?
- max_tokens
- 如何减少重复性,提高新颖度
- presence_penalty
- frequency_penalty
- 如何精确控制生成结束?
- stop
- 如何一次性获取多个候选输出?
- n
- 如何实时获取生成内容?
- stream
- 总结
引言
当我们调用一个大模型时,那些API的参数都干什么用的呢?
只是提供key与选择模型就够了么?为什么会有那些参数?
下面,我们以OpenAI的开发为例,一起了解一下这些参数是做什么、为什么。
本来从DeepSeek入手的,但是官网显示不支持很多参数,也就算了。
- API文档
OpenAI Platfrom
如何输入、与大模型交互?
消息列表messages是与模型进行对话的主要输入。它是一个对象列表,每个对象代表对话中的一条消息。
- 结构: 每个消息对象包含 role (角色) 和 content (内容)。
- role: 可以是:
- “system”: 用于设置助手的行为和个性,通常放在消息列表的开头,提供高级指令。
- “user”: 代表用户的输入。
- “assistant”: 代表模型之前的回复。通过提供历史对话,模型可以理解上下文。
- “tool” (较新,用于Function Calling/Tool Calling): 代表工具调用的结果。
- role: 可以是:
curl https://api.openai.com/v1/chat/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"model": "gpt-4.1","messages": [{"role": "developer","content": "You are a helpful assistant."},{"role": "user","content": "Hello!"}]}'
如何控制模型的随机性与创造性?
如何让模型的输出在“完全可预测/事实性”和“富有想象力/多样性”之间找到平衡?如何避免模型输出过于平淡重复,或者过于天马行空以至于胡言乱语?
二选一的temperature与top_p
控制模型输出随机性有两个参数:temperature与top_p。通常是2选1,两个都选行为会难以预测。
temperature
可以通过 temperature 控制生成文本的随机性或创造性。它影响下一个词选择的概率分布。
取值范围: 通常在 0 到 2 之间,对话通常是1。
- 较低的值 (e.g., 0.0 - 0.3): 输出更确定、更集中、更可预测。模型倾向于选择概率最高的词。适用于需要事实性、精确性、重复性的任务(如代码生成、数据提取)。
- 较高的值 (e.g., 0.7 - 1.0): 输出更随机、更多样化、更具创造性。模型会给概率较低的词更多被选中的机会。适用于创意写作、头脑风暴、生成多种选项。
- 极高的值 (e.g., > 1.0): 可能导致输出非常随机,甚至胡言乱语、不连贯。
top_p
另一种控制输出随机性的方法,从概率最高的词开始累加,直到累加的概率达到 top_p 设定的阈值,然后模型只从这个核心词汇集合中进行采样。
通常是1。
- 取值范围: 0 到 1 之间。
- 较低的值 (e.g., 0.1): 只有概率最高的极少数词被考虑,输出非常确定和保守。
- 较高的值 (e.g., 0.9): 考虑的词汇范围更广,输出更多样化。
- 值为 1 时,相当于不使用 top_p 过滤(除了必须的概率排序)。
如何控制输出的长度?
如何确保模型的回复不会太短以至于信息不完整,也不会太长以至于冗余或超出预算?如何限制API调用的token消耗?
token:token 是文本处理的基本单位,通常代表一个单词、标点符号或单词的一部分。也是大模型计费的基本单位。
分为"输入token"与"输出token"。分别对应用户发送给模型的提示(prompt)或上下文内容的 token ,与 模型生成的响应的 token 数。
其他操作如嵌入生成、RAG 检索等也会消耗token。
max_tokens
设定模型在当前这次调用中,可以生成的最大token数量。不同API或版本对token的范围限定不一样,有些版本指的是“输出token”,不包括“输入token”。
如何减少重复性,提高新颖度
模型有时会陷入循环,不断重复相同的词语、短语或观点。如何让模型引入新的信息或使用不同的表达方式?
相关参数有presence_penalty与frequency_penalty。
presence_penalty
对已经在已生成文本中出现过的token施加一次性的惩罚,降低它们再次被选择的概率。一旦一个token出现过,后续无论出现多少次,受到的基础惩罚是一样的。
- 取值范围: -2.0 到 2.0。正值会根据token的现有频率来降低其再次出现的可能性。
presence_penalty有助于让模型避免简单重复已经说过的词。
frequency_penalty
根据token在已生成文本中出现的频率来惩罚它。一个token出现得越频繁,它再次被选择的概率就越低。
- 取值范围: -2.0 到 2.0。正值会根据token的现有频率来降低其再次出现的可能性。
相比 presence_penalty,frequency_penalty更侧重于减少高频词的过度使用,使得文本不那么单调。
当temperature很低时,模型创造性与随机性低,模型本身会倾向于重复高概率词。此时这些惩罚参数可能效果更明显。
如何精确控制生成结束?
模型有时会生成超出期望范围的内容,或者在回答完问题后继续“自言自语”。如何让模型在特定的点或模式出现时停止生成?
使用stop参数。
stop
提供一个或多个字符串序列。当模型生成的内容匹配到其中任何一个停止序列时,它会立即停止进一步生成。
- 取值: 一个字符串,或最多包含4个字符串的列表。
确保输出在达到某个逻辑断点(如换行符、特定标识符、对话角色切换)时结束,使输出更整洁、符合预期格式。
对于需要结构化输出或模拟特定对话流程的应用非常关键。
如何一次性获取多个候选输出?
对于同一个输入,有时希望模型能提供多种不同的回答或创意,以便从中选择最佳的,或者进行多样性展示。
使用参数n。
n
指定为每个输入prompt生成多少个独立的、完整的候选响应(choices)。
取值: 一个正整数,默认为1。
n > 1 时,API会返回多个版本的输出。这会显著增加token消耗(成本变为 n 倍),因为每个候选都是独立生成的。
如何实时获取生成内容?
对于较长的生成任务,用户可能需要等待较长时间才能看到完整结果,体验不佳。如何让用户能像打字一样逐步看到生成的内容?
使用stream参数。
stream
设置为 true 时,API会以服务器发送事件 (Server-Sent Events, SSE) 的方式,逐步地、一块一块地返回生成的token,而不是等待整个响应生成完毕后再返回。
- 取值: true 或 false (默认)。
可以显著改善用户体验,尤其是在交互式应用或需要快速反馈的场景。用户可以即时看到输出,而不是长时间等待。
这是一个关于“如何传递结果”的参数,与“生成什么结果”的参数(如temperature, max_tokens等)是正交的。