多轮对话
对话接口是无状态的 —— 服务端不记上下文,每一轮请求都要把之前的完整对话历史再发一次。
无状态意味着什么
平台不在服务端保存你的会话。每次请求的 messages 都要包含:
system消息(如果有);- 之前所有轮次的
user与assistant消息; - 本轮新的
user消息。
漏掉历史,模型就不知道上下文;历史顺序错乱,回答也会跟着错。
一轮一轮怎么拼
第一轮只发这一句:
{
"model": "<模型名>",
"messages": [
{ "role": "user", "content": "世界上最高的山是哪座?" }
]
}
拿到回复后,把这条 assistant 消息原样追加到 messages 末尾,再追加新的提问:
{
"model": "<模型名>",
"messages": [
{ "role": "user", "content": "世界上最高的山是哪座?" },
{ "role": "assistant", "content": "世界上最高的山是珠穆朗玛峰。" },
{ "role": "user", "content": "第二高的呢?" }
]
}
这就是多轮对话的全部要点:把助手说过的话当成历史的一部分带回去。
请求示例
curl https://open.feiyutoken.com/v1/chat/completions \
-H "Authorization: Bearer <你的飞鱼Token API Key>" \
-H "Content-Type: application/json" \
-d '{
"model": "<模型名>",
"messages": [
{ "role": "user", "content": "世界上最高的山是哪座?" },
{ "role": "assistant", "content": "世界上最高的山是珠穆朗玛峰。" },
{ "role": "user", "content": "第二高的呢?" }
]
}'
两个要注意的成本与限制
- 历史越长越贵:计费按整段请求算,
usage.prompt_tokens会随轮次一直增长。 长时间的会话建议只保留最近若干轮,或把早期内容总结成一段再带上。 - 有长度上限:历史累加到超过上下文长度时这一轮会失败(具体错误码以实际返回为准)。
不想自己回传历史的话,用 Responses API:
它支持把上一轮的 id 作为 previous_response_id 传过来,
不必每次都把整段对话再发一遍。Anthropic 格式的
Claude Messages API 同样是无状态的,
拼法与这里一致。