Go 语言构建Ambient AI 病历自动生成系统研讨(下)

Go 语言构建Ambient AI 病历自动生成系统研讨(下)

四、门诊场景流程:端到端流程(Go 视角)

我们将详细描述一次完整的门诊,数据和 Go 服务是如何流动的。

Step 1: 医生准备,发起会话
  • 医生操作:在医生工作站打开患者的就诊页面,点击“开始智能记录”。
  • 前端动作:携带本地存储的 doctor_token,调用 POST /api/v1/sessions
  • gateway-service
    1. 校验 doctor_token 的有效性。
    2. 通过 doctor_idCasbin 策略中检查,该医生是否有操作 patient_id 的权限。
    3. 请求转发至 session-service
  • session-service (gRPC)
    1. 接收 CreateSessionRequest (包含 patient_id, dept_id, outpatient 类型)。
    2. 在 PostgreSQL 中创建一条 Session 记录,状态为 ACTIVE
    3. 生成一个全局唯一的 session_id (e.g., UUID)。
    4. 构建录音文件的未来存储路径,如 recordings/2023/10/27/{session_id}.webm
    5. 返回 CreateSessionResponse,包含 session_id 和为本次连接分配的 WebSocket URL。
  • 前端:收到响应后,使用 session_id 建立到 wss://gateway/asr/{session_id} 的 WebSocket 连接。
Step 2: 问诊进行中,实时转写
  • 音频采集:浏览器通过 getUserMedia API 获取麦克风音频流,编码为 Opus 或 PCM 格式,通过 WebSocket 实时发送。
  • gateway-service:仅做 WebSocket 连接的升级和负载均衡,将 TCP 连接代理到后端的 asr-adapter-service 实例。
  • asr-adapter-service (核心 Goroutine 逻辑)
    1. 连接管理:为每个 WebSocket 连接创建一个 Goroutine。
    2. 音频转发:循环读取 WebSocket 音频帧,打包成 ASR 引擎(如阿里云)API 要求的格式,通过 HTTP Streaming 或 gRPC Stream 发送。
    3. 结果接收与处理
      • 异步接收 ASR 引擎返回的 partial_result(部分转写)和 final_result(最终结果)。
      • partial_result:立即通过 WebSocket 推回前端,实现“实时字幕”效果。
      • final_result:这是一个完整的句子或段落。它会附带时间戳信息(相对于音频开始的时间)和可能的说话人标签(如果 ASR 支持声纹分离)。asr-adapter-service 将其封装成一个 TranscriptionEvent 消息,发布到 NATS 的 transcription.finished 主题。
  • session-service (NATS Consumer)
    1. 订阅 transcription.finished 主题。
    2. 消费消息,解析出 session_idfinal_result
    3. 将这条转写记录作为一条 Turn 插入到数据库的 transcriptions 表中,并与 session_id 关联。
Step 3: 问诊结束,触发 AI 生成
  • 医生操作:点击“结束记录”按钮。
  • 前端动作:发送一个 WebSocket Close 消帧,并调用 POST /api/v1/sessions/{sessionId}/end
  • session-service
    1. Session 记录的状态更新为 ENDED,并记录 end_time
    2. 向 NATS 的 session.ended 主题发布一条消息,包含 session_id
  • nlp-medical-service (NATS Consumer)
    1. 订阅 session.ended 主题。
    2. 收到消息后,开始执行核心的病历生成流程。
      • 数据拉取:调用 session-service 的 gRPC 接口 GetSessionWithTranscriptions(sessionId),获取完整的会话信息和所有转写文本 Turn[]
      • 构建 Prompt:将 Turn[] 拼接成对话字符串,并填充预设的 Prompt 模板。
      • 调用 LLM:使用 llmClient.GenerateEMR() 发送请求到 LLM 服务。这里需要设置一个合理的超时时间(e.g., 30s)。
      • 结果处理
        • 成功:解析返回的 JSON,进行格式和业务校验。将生成的 EMRDraft(JSON格式)存入数据库的 emr_drafts 表,关联 session_id
        • 失败(网络错误、LLM返回错误、JSON解析失败):记录错误日志,将 session 状态标记为 PROCESSING_FAILED,并通知医生前端“AI 生成失败,请手动录入”。
      • 状态更新:成功后,将 session 状态更新为 ***PLETED
Step 4: 医生审核与编辑
  • 前端:通过轮询或 WebSocket 接收,获取到“草稿已生成”的通知。
  • 前端:自动从 nlp-medical-service 拉取 EMRDraft JSON。
  • 前端渲染:将 JSON 数据渲染到可编辑的表单中。每个字段(主诉、现病史等)都是独立的输入框或富文本编辑器。医生可以对比原始对话录音和转写文本,进行修改。
  • 医生操作:修改完毕后,点击“提交”按钮。
Step 5: 写入 EMR,完成闭环
  • 前端动作:调用 POST /api/v1/emr-drafts/{draftId}/submit,携带最终修改后的病历 JSON。
  • gateway-service -> emr-integration-service
    1. emr-integration-service 接收到提交请求,验证 doctor_id 是否有权限提交此 draft_id
    2. 将此写入操作创建成一个异步任务(如使用 Asynq),任务
转载请说明出处内容投诉
CSS教程网 » Go 语言构建Ambient AI 病历自动生成系统研讨(下)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买