关键不是让模型记住,而是每次请求时手动拼好上下文再发送;通义千问API无状态,需在PHP中维护$messages数组并完整提交,控制长度、加结构化锚点、依场景持久化上下文。

PHP 7.4 对接通义千问 API 实现多轮对话,关键不是“让模型记住”,而是每次请求时**手动把上下文拼好再发过去**。因为千问所有公开 API(包括 DashScope 和 OpenAI 兼容接口)都是无状态的——它不存历史,你传什么,它就看什么。
每次请求都得带全 messages 数组
通义千问不维护会话记忆,必须在 PHP 中自己维护一个 $messages 数组,并在每轮请求中完整提交:
- 首轮:加入系统提示 + 用户首问,例如:
["role" => "system", "content" => "你是一名技术文档工程师"]和["role" => "user", "content" => "请解释TCP三次握手"] - 收到回复后,把模型输出也追加进去:
["role" => "assistant", "content" => "TCP三次握手是..."] - 下一轮提问前,把这个含历史的完整数组作为
messages字段发给 API,而不是只发新问题
控制长度,别超 token 上限
qwen-plus 最大支持 8192 tokens,但 PHP 7.4 没有内置 tokenizer,需用轻量方式估算:
- 中文粗略按 1 字符 ≈ 2 tokens 估算(实际更少,留余量更安全)
- 保留最近 3–5 轮完整问答即可,太早的对话可删掉;优先保系统设定、关键参数和最新两轮
- 删的时候从数组开头删(
array_shift()),避免砍掉刚确认的约束条件
加锚点,减少指代歧义
光靠拼消息还不够,模型容易搞混“它”“那个”“之前说的”。建议在关键轮次主动嵌入结构化锚点:
立即学习“PHP免费学习笔记(深入)”;
- 首轮结尾加:
【上下文锚点】目标设备:iPhone 16 Pro;系统版本:iOS 18.1;任务:分析发热原因 - 后续提问开头复述:
【上下文锚点】目标设备:iPhone 16 Pro;系统版本:iOS 18.1;任务:分析发热原因。请结合A18芯片功耗曲线说明... - 避免用“上述”“这个”等模糊词,所有实体都写全称+值
注意运行环境稳定性
PHP 7.4 常用于 CLI 或短生命周期 Web 请求,要防止上下文丢失:
- Web 场景:把
$messages存到 session 或 Redis,用会话 ID 关联 - CLI 场景:不能依赖全局变量,每次调用需通过文件或数据库读取/写入当前上下文快照
- 别用
$_SESSION存超长文本(可能触发序列化失败),建议只存摘要或 ID,正文存在外部存储



















