千问流式回答出现“我喜欢我喜欢吃我喜欢吃苹果”,应先检查客户端是否把累计文本反复追加。流式表示分批返回,不代表所有协议和模式的每批内容都是增量;处理方式要与实际返回结构一致。
先判断片段里装的是什么
OpenAI兼容协议开启stream后,文本位于delta.content,应按顺序拼接。DashScope协议还涉及增量与非增量模式:增量片段只带新内容,累计片段则带此前已经生成的内容。
例如收到“我喜欢”“吃”“苹果”,应追加;若收到“我喜欢”“我喜欢吃”“我喜欢吃苹果”,界面应以最新累计文本更新。可在千问接口教程中对照所用协议,避免拿一种协议的解析器处理另一种。
不要见到空choices就报错
采用兼容协议时,若需要流式用量统计,可设置stream_options中的include_usage为true。末尾统计片段可能没有choices,循环应先判断列表是否为空,再读取delta,单独处理usage。
这类片段没有正文不代表响应异常。保存完整文本与用量信息时,使用不同变量;不要把统计JSON混进用户看到的答案,也不要因为跳过空文本而漏掉用量。
用短句和中断测试验证显示逻辑
建议先保存少量脱敏片段,核对是否增量,再测试空片段、正常结束和连接中断。重试时清空本次缓冲,避免新答案接到旧答案后。网络SSE事件还需完整解析,不能把网络分包当成文本片段。如果应用统一接入多个AI接口,建议在各自适配层转换成统一文本增量,再交给界面;不要让界面猜测片段是否累计。
原创文章,作者:eastbtc,如若转载,请注明出处:https://www.eastbtc.com/ai/qwen/30445.html