一、整体架构:用 Go 做“中心大脑”
您提出的四层架构非常经典且精准。我们的核心就是要把 Go 语言的优势发挥在「业务服务层」和「集成层」,让它成为整个 AI 流程中那个最可靠、最高效的“交通枢纽”和“中央处理器”。
1.1 架构全景图(文字版)
为了便于理解,我们先在脑海里构建一张架构图:
+----------------+ +----------------+ +----------------+ +------------------+
| 采集层 | | AI 处理层 | | 业务服务层 | | 集成层 |
| (IoT / App) |----->| (ASR / LLM) |<----->| (Go Core) |----->| (HIS / EMR / FHIR)|
| | | | | | | |
| - 诊室麦克风 | | - 科大讯飞/阿里 | | - gateway | | - HL7 v2/v3 |
| - 医生 App | | - OpenAI GPT-4 | | - session | | - FHIR R4 |
| - 患者小程序 | | - 自研医疗模型 | | - nlp-service | | - 厂商私有 API |
| - 床旁交互屏 | | | | - emr-service | | |
| - 护士工作站 | | | | - audit | | |
+----------------+ +----------------+ +----------------+ +------------------+
^ ^ ^ ^
| 音频流 | 文本/结构化数据 | RPC/HTTP 请求 | API 调用
| | | |
(医院内网 / 专线) (GPU 集群 / 公有云) (K8s 集群 / 裸金属) (医院数据中心)
1.2 Go 的定位与核心价值
为什么 Go 是这个“中心大脑”的最佳人选?
- 高并发与高性能:一个中型医院可能有上百个诊室、上千个床位同时进行语音采集。Go 的 Goroutine 和 Channel 模型能以极低的资源开销处理成千上万的并发连接(WebSocket 长连接、gRPC 流),这是 Python 等传统解释型语言难以比拟的。
-
微服务生态的天然契合:Go 的编译速度快、部署简单(单一二进制文件)、内置强大网络库。结合
gRPC、protobuf、Gin等框架,可以轻松构建出清晰、高效、松耦合的微服务集群。 - 稳定性与可维护性:Go 的静态类型和强约束语法,能在编译期发现大量潜在错误。这对于需要 7x24 小时稳定运行、且不容有失的医疗系统至关重要。一个由 Go 构建的后端,在长期维护上具有显著优势。
- “胶水语言”的卓越能力:AI 模型(ASR, NLP)多半是 Python 实现,集成层(HIS/EMR)接口五花八门。Go 极其擅长作为“胶水”,通过标准化的 HTTP/gRPC 客户端与这些异构系统进行高效、可靠的通信,并进行协议转换、数据聚合与分发。
1.3 数据流与控制流
让我们以一个数据包的生命周期,来理解 Go 在其中的作用:
-
数据上行:
-
音频数据->采集层-> (WebSocket) ->gateway-service(Go, 负载均衡、鉴权) -> (gRPC Streaming) ->asr-adapter-service(Go, 音频缓冲、转发) -> (HTTP/WebSocket) ->AI 处理层(ASR 引擎)。
-
-
AI 处理与下行:
-
ASR 引擎->转写文本结果-> (HTTP Callback/gRPC Stream) ->asr-adapter-service(Go, 组装结果、时间戳对齐) -> (消息队列) ->session-service(Go, 持久化存储) &nlp-medical-service(Go, 拉取对话,触发 NLP)。
-
-
业务处理与集成:
-
nlp-medical-service->调用 LLM API->LLM 返回结构化病历->nlp-medical-service(Go, 校验、模板渲染) ->gateway-service->前端展示(医生编辑) ->医生提交->gateway-service->emr-integration-service(Go, 调用 HIS/EMR API) ->HIS/EMR 系统。
-
在这个流程中,Go 服务负责了几乎所有的状态管理、流程编排、数据校验、协议转换和外部系统集成工作,是整个系统的“骨架”和“神经中枢”。
二、核心模块设计(Go 为主的服务拆分)
将庞大的系统拆分为职责单一的小服务,是“真落地”的第一步。这便于团队并行开发、独立部署和故障隔离。
2.1 服务拆分粒度原则
- 按业务能力拆分:每个服务对应一个明确的业务领域(如“会话管理”、“EMR集成”)。
- 数据所有权分离:每个服务拥有自己独立的数据库表,避免跨服务的数据库直接耦合。
- 高内聚、低耦合:服务内部逻辑紧密关联,服务间通过明确的 API(gRPC/REST)通信。
- 可独立运维:单个服务可以独立进行扩缩容、升级和监控。
2.2 详细服务设计
1. gateway-service (API 网关)
-
职责:
- 系统的统一入口,所有来自外部的请求都必须经过它。
- 身份认证与鉴权(验证医生/护士的 Token)。
- 权限控制(基于 Casbin,判断该医生是否有权限访问该患者的数据)。
- 请求路由(将
/api/v1/sessions的请求转发给session-service)。 - 流量控制与熔断(防止恶意请求或后端服务雪崩)。
- 请求/响应日志记录。
-
Go 技术选型:
-
Web 框架:
Gin或Echo。性能极高,中间件生态丰富。Gin社区更大,文档更全,可作为首选。 -
鉴权:
golang-jwt/jwt库处理 JWT Token 的生成和解析。 -
权限控制:
Casbin。强大的访问控制框架,支持 ACL、RBAC 等多种模型。我们可以将权限策略(如doctor, 123, patient, 456, read)存储在数据库或配置文件中。 -
服务发现:如果使用 Kuber***es,可以利用其 Service 机制。如果是裸机部署,可以引入
Consul或Etcd。 -
限流熔断:
go-kratos/aegis或sentinel-golang。
-
Web 框架:
-
核心接口示例:
// POST /api/v1/sessions // Body: {"patientId": "P12345", "deptId": "D01", "type": "outpatient"} // Response: {"sessionId": "sess_xxx", "wsUrl": "wss://.../asr/sess_xxx"} func (h *SessionHandler) CreateSession(c *gin.Context) { ... } // WebSocket /ws/asr/{sessionId} // 用于前端建立音频流长连接