Back to writing archive

2026-04-09

多轮问诊与 SSE:让 A 线真正像对话

双轨接口能演示,但不像聊天;v1.1 先把 A 线改成真正的多轮流式问诊。

Chinese onlyAILangGraphMedical DemoEngineering Log

/v1/dual 不适合一直聊

/v1/dual 很适合展示双轨:一次请求同时返回 A 线和 B 线。可是拿它做连续问诊,就开始别扭。

用户只是补一句“疼了两天”,也要等 B 线报告一起跑完。A 线本来应该轻快,结果被同步报告拖住。这个体验不太像聊天,更像每轮都在提交一份表单。

所以 v1.1 的目标不是重做双轨,而是把 A 线从 /v1/dual 里解放出来。

新增三类接口

这一轮加了几个更像聊天产品的接口:

  • POST /v1/chat:提交一轮用户消息;
  • GET /v1/sessions/{id}/messages:读取会话消息;
  • POST /v1/consult/stream:用 SSE 返回 A 线流式回复。

这样连续问诊和双轨演示分开了。/v1/dual 继续保留,用来展示 A/B 同时输出;新的 chat/stream 路径服务真实一点的多轮体验。

为什么选 SSE

这里没有用 WebSocket。不是 WebSocket 不好,而是当前需求用不上双向实时通信。

A 线只需要服务端把文本一点点推给浏览器。SSE 足够简单,FastAPI 支持也顺,调试时 curl 都能看。反向代理层面也比 WebSocket 少一些坑。

这个选择很像前面几轮的原则:先解决当前问题,不提前把系统做重。

多轮上下文开始重要了

加了消息读取接口以后,前端可以恢复历史消息,后端也能基于最近几轮继续追问。

这里仍然只是 demo 级会话,不是病历系统,也不是账号体系。它的目标是让问诊状态能连起来:上一轮问了什么,用户补了什么,下一轮还缺什么。

B 线问题还没完全解决

v1.1 解决的是 A 线体验,B 线仍然偏同步。

这其实暴露了下一步:报告不应该每轮都生成。用户还在补信息时,A 线继续聊就行;B 线更适合低频、异步地产出版本。

所以 v1.1 更像过渡版本。它让 A 线终于像对话了,也保留了 /v1/dual 作为教学对比。真正的 A/B 解耦,要留到 v1.2。

评论