请求参数与流式输出
上一章能跑通对话,本章把常见请求参数逐个讲透,并介绍 Agent 高频使用的流式输出。理解 temperature、max_tokens、stream 这些参数,是调优效果与控制成本的基础。
请求参数总览
Chat Completions 请求中的常见参数如下,语义大体通用(取值范围以所用模型文档为准):
| 参数 | 含义 | 使用建议 |
|---|---|---|
| model | 选择模型 | 按任务难度与预算选 |
| messages | 对话消息数组 | Agent 的主输入 |
| temperature | 采样随机性 | Agent 决策常用低值 |
| top_p | 核采样概率阈值 | 与 temperature 二选一微调 |
| max_tokens | 本次最多生成的 token 数 | 设上限防失控超支 |
| stop | 命中即停止生成的序列 | 截断固定格式输出 |
| seed | 随机种子 | 尽量复现结果,不保证 |
| stream | 是否流式返回 | 长任务建议开 true |
temperature 与 top_p
temperature 控制随机性:接近 0 时输出稳定、可预期,适合 Agent 的决策与工具参数;调高后表达更多样,也更容易跑偏。top_p 是另一种随机性控制方式,两者同时调等于叠加扰动,实践上固定一个、只调另一个即可。
max_tokens 与 stop
max_tokens 是生成长度的安全阀,防止单次输出过长烧钱或超限;注意部分推理模型的该字段含思考内容预算,确切语义以官方文档为准。stop 给一个或多个停止字符串,例如让模型输出完指定内容就停:
{"stop": ["\n\n", "结束"], "max_tokens": 512, "temperature": 0}
stream:流式输出
大模型是逐 token 生成的,等全部生成完再一次性返回会很慢。把 stream 设为 true,服务端就会边生成边推送,传输用的是 SSE(Server-Sent Events):每个分片是一行 data: 开头的 JSON,结束后发一行 data: [DONE]。用 curl 直观感受:
curl -N "$BASE_URL/chat/completions" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"'"$MODEL"'","messages":[{"role":"user","content":"从 1 数到 3"}],"stream":true}'
# 输出:逐行 data: {"choices":[{"delta":{"content":"1"}}]} …,最后一行 data: [DONE]
SDK 流式写法
openai SDK 里传入 stream=True,再遍历返回的流逐段累积内容即可:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("BASE_URL") or None, # 无自定义地址时用官方默认
)
stream = client.chat.completions.create(
model=os.getenv("MODEL"),
messages=[{"role": "user", "content": "从 1 数到 3"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
# 输出:123(边生成边逐字显示)
对 Agent 而言,长任务开启流式能显著改善等待体验,也能更早拿到首批内容开始下游处理。
推理模型的思考内容
推理模型会先「想」再答,部分服务把思考过程放在独立字段返回,例如 DeepSeek 的 reasoning_content,其他服务商可能叫别的名字。是否返回、字段名、是否计费、能否关闭,各家差异很大:
msg = resp.choices[0].message
if getattr(msg, "reasoning_content", None): # 字段名以模型官方文档为准
print("思考:", msg.reasoning_content)
print("回答:", msg.content)
注意:思考内容是模型内部过程,不可控且可能含敏感信息,做产品时通常不直接展示给终端用户。
小结
请求参数里,temperature/top_p 管随机性,max_tokens/stop 管长度与停点,seed 管复现,stream 管返回节奏。流式输出基于 SSE 逐片推送,是长任务体验的关键;推理模型的思考字段要按各家文档读取,并谨慎对外展示。