架构手记(五):高可用防线——基于 Vue3 状态机的大模型“信息缺失”动态降级(Fallback)
一、 痛点:当“全知全能”的 AI 遇到“一问三不知”的现实
在前面的四篇手记中,我们成功在后端构建了坚固的 Graph RAG 图谱,并用 ReAct 框架驯服了单智能体(Agent)。此时的后端就像一个严厉的“数字药师”,只要信息给足,它就能精准拦截每一次用药冲突。
但在真实的临床或日常购药场景中,我们面临的最大敌人是“信息缺失”。
-
假设患者要开【利巴韦林】(具有强致畸性,孕妇禁用),但患者主诉里根本没提自己是否怀孕,系统该怎么办?
传统的医疗 HIS 系统只有两个极端的处理方式:
-
死板拦截(硬阻断):报个 Error,要求医生必须填完所有表单才能开药。(严重影响看诊效率)
-
掩耳盗铃(直接放行):假装没看见,直接开药。(极其危险,极易引发医疗事故)
为了破局,我在前端架构设计中引入了“Human-in-the-loop(人机协同追问)”与“柔性降级(Fallback)”机制,用一套精密的前端状态机,完美缝合了 AI 的不确定性与医疗的严谨性。
二、 核心架构设计:前端 UI 状态机(FSM)
在我们的系统里,前端绝不仅是一个无脑展示数据的页面,而是整个大模型交互的“路由器”。我们基于 Vue3 的 Composition API 和 Pinia 状态管理,构建了一个有限状态机(Finite State Machine)。
根据我们在【手记(二)】中定义的接口契约,当后端返回不同的 action_type 时,前端会严格遵循以下状态流转:
-
IDLE(空闲态):等待医生输入主诉。 -
ANALYZING(分析态):呈现流式 Loading 动画,等待 Agent 与图谱博弈。 -
CLARIFYING(追问挂起态):核心创新点!当后端返回CLARIFY,挂起当前处方流程,弹出追问弹窗。 -
SUCCESS_PASS(绿灯态):渲染正常的结构化医嘱时间轴。 -
SUCCESS_BLOCK(红灯态):触发全局红色遮罩,强制阻断开药并展示图谱冲突原因。 -
SUCCESS_FALLBACK(黄灯降级态):核心创新点!渲染防御性免责医嘱。
三、 实战推演:从“智能追问”到“免责降级”
让我们用代码和逻辑,还原一下开头那个【利巴韦林】的极端场景。
阶段 1:触发挂起与智能追问 (CLARIFYING)
当后端 Agent 发现图谱里有利巴韦林对孕妇的高危警告,但上下文没有孕史信息时,它会返回一个追问指令。前端 Pinia 监听到状态突变,立刻利用 Vue3 的条件渲染(v-if)挂起主页面,弹出一个高优先级的对话框:
HTML
<template>
<div class="prescription-board">
<MainForm v-show="currentState !== 'CLARIFYING'" />
<el-dialog v-model="isClarifying" title="⚠️ AI 安全核查追问">
<p>{{ backendResponse.clarify_prompt }}</p>
<div class="actions">
<el-button @click="submitSupplementInfo('是孕妇')">是,确为孕妇</el-button>
<el-button @click="submitSupplementInfo('非孕妇')">否,近期无备孕计划</el-button>
<el-button type="warning" @click="triggerFallback()">患者拒答 / 无法确认</el-button>
</div>
</el-dialog>
</div>
</template>
阶段 2:抉择分支与 Fallback 柔性降级
-
如果医生选择了“确为孕妇”:前端将补充信息发回后端,Agent 重新核查,状态流转为
SUCCESS_BLOCK,红灯亮起,拦截利巴韦林! -
如果医生选择了“无法确认”(这也是急诊最常见的场景): 系统绝不能崩溃,也不能锁死界面。前端直接调用
triggerFallback()函数,强行将状态机拨转至SUCCESS_FALLBACK。
在 Fallback 状态下,前端会利用 Element Plus 的高亮卡片组件,在最终生成的《患者用药医嘱时间轴》最顶端,强制注入一条免责警告:
JavaScript
// Fallback 状态下的动态医嘱渲染逻辑
if (state.value === 'SUCCESS_FALLBACK') {
renderTimeline({
theme: 'warning', // UI 变更为警示黄
defensive_text: `【AI 用药安全强警示】系统未获取您的完整孕产史信息。您处方中的 [利巴韦林] 具有强致畸性。若您为孕妇或处于备孕期,请【绝对禁用】此药,并立即联系主治医师!`,
original_drugs: ["利巴韦林"] // 依然保留开药功能,但不承担信息瞒报的风险
});
}
四、 架构思考:为什么 Fallback 如此重要?
在做这个模块时,团队内部曾有过争议:“既然不确定,直接不让开药不就行了吗?”
作为架构师,我的回答是:软件系统不能代替医生做最终的强权决断,更不能因为 AI 的洁癖而阻断正常的医疗流程。
Fallback(柔性降级)机制的本质,是系统鲁棒性(Robustness)的体现。它承认了世界的不完美(数据缺失),通过前端状态机的精妙流转,在“极端的安全(不准开药)”和“极端的危险(直接开药)”之间,开辟了第三条路:知情同意与防御性提示。
五、 结语
从底层的 Graph RAG 算法,到后端的 Agent Prompt 调优,再到今天这篇基于 Vue3 状态机的 Fallback 渲染,我们的《大模型 Agent 决策引擎》在业务逻辑上已经形成了一个无懈可击的完美闭环。
更多推荐



所有评论(0)