一、慢病管理行业背景
1. 基础核心概念
1.1 大模型原生对话与Skill的本质区别
传统大模型对话是无状态、瞬时性、无记忆的交互模式:每一轮对话都是独立的计算单元,模型不会主动保存用户历史输入、偏好、生理数据、交互目标,仅基于当前单轮文本生成回答。例如用户连续询问“我今天空腹血糖 7.2mmol/L”、“这个数值正常吗”、“我需要调整饮食吗”,普通大模型无法关联三轮对话的上下文,会将其视为三个独立问题,给出碎片化、无针对性的回复。
Skill技能模块是基于大模型的垂直领域轻量化封装组件,是为特定慢病场景(糖尿病、高血压、饮食管理)定制的功能单元。它不是独立的大模型,而是挂载在大模型之上的专业化插件,具备独立的数据存储、逻辑计算、规则判断能力,能够承接大模型无法完成的结构化数据处理、长期记忆保存、病程量化分析工作。
1.2 状态持久化:慢病管理的核心技术基石
状态持久化 是指将Skill与用户的交互数据、用户生理指标、健康偏好、病程数据,从内存临时存储写入持久化存储介质(数据库、文件、云存储),实现数据跨对话轮次、跨使用时间、跨设备永久保存的技术。
在慢病管理场景中,状态持久化解决了三个核心痛点:
- 1. 大模型无长期记忆的缺陷;
- 2. 慢病数据需要连续追踪、趋势分析的刚需;
- 3. 多维度健康数据需要整合形成个人健康档案的需求。
1.3 病程追踪与个人健康图谱
病程追踪 是基于持久化的结构化数据,对用户慢病指标(血糖、血压)、生活习惯、用药情况、饮食行为进行连续、量化、可视化的跟踪,生成趋势曲线、异常预警、病程评估报告。
个人健康图谱 是将用户所有 Skill(糖尿病、高血压、饮食)的数据进行关联融合,形成的多维度、结构化、可推理的用户健康数据网络。它打破了单一技能的数据孤岛,实现血糖异常→饮食禁忌→用药建议→血压关联的全链路智能分析。
2. 慢病管理融合大模型
我国慢病患者规模超 4 亿,糖尿病、高血压为代表的慢性病具有长期性、反复性、需持续干预的特征。传统医疗模式存在三大痛点:
- 1. 患者无法实时获得专业指导,院外管理缺失;
- 2. 健康数据碎片化,无法形成连续病程记录;
- 3. 医生无法获取患者长期真实数据,干预方案缺乏依据。
大模型具备自然语言理解、生成、交互能力,但缺乏结构化数据存储、专业医疗规则、长期记忆能力;而 Skill 状态持久化技术,恰好弥补了大模型的短板,让大模型从通用对话工具升级为专业慢病管理助手。
3. 慢病管理的结构化数据载体
Skill不只是一个功能插件,它是慢病病程管理的最小数据单元:
- 糖尿病 Skill:专门采集、存储、分析血糖相关结构化数据,如时间、数值、状态、测量场景;
- 高血压 Skill:专门采集、存储、分析血压相关结构化数据,如收缩压、舒张压、心率、测量时间;
- 饮食 Skill:专门采集、存储、分析饮食偏好、禁忌、营养摄入数据。
所有 Skill 通过状态持久化,将非结构化的自然语言对话,转化为标准化、可计算、可追踪的医疗健康数据,最终汇聚成个人健康图谱。这是大模型实现智能化慢病管理的核心逻辑。
二、Skill 状态持久化原理
1. 大模型交互的基础架构
1.1 无状态交互原理
普通大模型采用请求 - 响应模式:
- 1. 用户发送文本请求 → 大模型接收文本 → 模型计算生成回答 → 返回给用户 → 对话结束;
- 2. 所有交互数据仅存在于单次请求的内存中,对话结束后立即销毁;
- 3. 无任何数据存储、关联、追溯能力。
1.2 有状态Skill交互架构
Skill架构在大模型之上,新增三大核心模块:
- 1. 用户标识模块:为每个用户生成唯一 ID(user_id),实现数据隔离;
- 2. 状态存储模块:负责数据持久化,保存用户所有交互数据;
- 3. 数据解析模块:将自然语言转化为结构化数据,如“空腹血糖 7.2”→ 场景 = 空腹,数值 = 7.2。
2. 状态持久化的核心技术组件
2.1 存储介质选型
- 内存存储:临时存储,断电丢失,仅用于实时交互;
- 文件存储:轻量级持久化,适合小型系统,如JSON/CSV文件;
- 数据库存储:工业级标准,分为关系型数据库(MySQL/PostgreSQL,适合结构化数据)、非关系型数据库(Redis/MongoDB,适合高速读写、非结构化数据)。
2.2 数据结构化标准
慢病数据必须标准化,才能实现追踪与分析:
- 血糖数据:user_id、measure_time、glucose_value、measure_type (空腹/餐后2h/随机)、status (正常/偏高/偏低)
- 血压数据:user_id、measure_time、sbp (收缩压)、dbp (舒张压)、heart_rate、status
- 饮食数据:user_id、favorite_food、taboo_food、dietary_restrictions
2.3 跨轮次、跨技能数据关联
- 核心原理:同一用户的所有 Skill 数据,绑定唯一 user_id。
- 无论用户使用糖尿病 Skill、高血压 Skill 还是饮食 Skill,系统都会通过 user_id 将数据归集到同一个用户档案中,实现跨技能数据互通。
3. 慢病管理基础医学知识
为了让 Skill 具备专业性,必须嵌入基础医学规则:
- 1. 糖尿病血糖标准:空腹 3.9-6.1mmol/L,餐后 2h<7.8mmol/L;
- 2. 高血压标准:收缩压≥140mmHg 和 / 或 舒张压≥90mmHg;
- 3. 饮食规则:高血糖患者禁忌高糖食物,高血压患者禁忌高盐食物。
这些规则会写入 Skill 的逻辑判断模块,结合持久化数据实现智能评估。
三、病程追踪执行流程
以“糖尿病血糖记录”追踪的不同场景的流程执行步骤为例:
1. 单Skill单轮数据记录
执行步骤:
- 1. 用户身份识别:系统获取用户唯一 user_id(如 user_1001);
- 2. 自然语言输入:用户发送「我今天早上空腹血糖 7.2mmol/L」;
- 3. 大模型语义解析:提取关键信息:测量类型 = 空腹,数值 = 7.2,时间 = 当前时间;
- 4. Skill 数据格式化:生成结构化数据;
- 5. 状态持久化:将数据写入数据库或文件;
- 6. 即时响应:Skill 返回评估结果。
2. 单Skill跨轮次病程追踪
执行步骤:
- 1. 用户连续 7 天上传血糖数据;
- 2. Skill 每天将数据持久化存储;
- 3. 用户请求"帮我看一下这周的血糖情况";
- 4. 系统根据 user_id 读取所有历史数据;
- 5. Skill 计算平均值、最大值、最小值,判断趋势;
- 6. 生成文字报告 + 可视化图表。
3. 跨技能个人健康图谱构建
执行步骤:
- 1. 用户使用糖尿病 Skill 记录血糖;
- 2. 用户使用高血压 Skill 记录血压;
- 3. 用户使用饮食 Skill 记录饮食禁忌;
- 4. 系统以 user_id 为核心,融合三类数据;
- 5. 大模型结合健康图谱进行综合推理:
示例:血糖持续偏高 + 高血压 + 喜食甜食 → 智能生成综合干预方案; - 6. 实现跨技能智能联动,打破数据孤岛。
跨Skill健康时序堆叠图:
4. 应用实践完整执行流程
- 1. 用户认证:唯一身份标识分配;
- 2. 对话路由:大模型判断用户需求,分配对应 Skill;
- 3. 语义提取:结构化解析用户输入数据;
- 4. 规则校验:医学规则判断数据有效性;
- 5. 状态持久化:数据写入持久化存储;
- 6. 数据更新:覆盖 / 追加历史数据;
- 7. 病程计算:趋势分析、异常检测;
- 8. 健康图谱融合:跨技能数据关联;
- 9. 智能应答:大模型结合结构化数据生成专业回答;
- 10. 日志记录:全流程日志留存。
四、应用实践
基于skill的核心逻辑和慢病管理应用场景,实现一个基础的示例,包含数据结构化、状态持久化、病程追踪、可视化绘图功能;
1. 用户唯一标识生成
生成全局唯一用户ID,实现不同用户数据隔离,是状态持久化的基础:一人一档案,数据不混淆
# 安装依赖 # pip install json matplotlib datetime uuid import json import uuid from datetime import datetime import matplotlib.pyplot as plt import os def generate_user_id(): """ 生成全局唯一用户ID,实现不同用户数据隔离 是状态持久化的基础:一人一档案,数据不混淆 """ return str(uuid.uuid4()) # 示例:创建用户 user_id = generate_user_id() print(f"慢病管理系统用户唯一ID:{user_id}")
输出结果:
慢病管理系统用户唯一ID:45272ec6-6feb-42e3-8105-12a0fc8b3cff
2. 慢病Skill数据结构化工具
糖尿病Skill:解析自然语言为结构化血糖数据,input_text是用户输入文本,measure_time是测量时间,默认当前时间,返回结构化血糖数据
def parse_diabetes_input(input_text: str, measure_time=None): """ 糖尿病Skill:解析自然语言为结构化血糖数据 :param input_text: 用户输入文本 :param measure_time: 测量时间,默认当前时间 :return: 结构化血糖数据 """ if measure_time is None: measure_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 简化版语义解析(工业级可对接大模型API) glucose_value = 0.0 measure_type = "未知" if "空腹" in input_text: measure_type = "空腹" if "餐后2小时" in input_text: measure_type = "餐后2h" # 提取数值 for word in input_text.split(): word = word.replace("mmol/L", "") try: glucose_value = float(word) break except: continue # 医学规则判断血糖状态 status = "正常" if measure_type == "空腹": if glucose_value > 6.1: status = "偏高" elif glucose_value < 3.9: status = "偏低" elif measure_type == "餐后2h": if glucose_value > 7.8: status = "偏高" return { "measure_time": measure_time, "glucose_value": glucose_value, "measure_type": measure_type, "status": status }
3. 基于文件的状态持久化
状态持久化核心函数:将Skill数据保存到本地的json文件
def save_user_skill_data(user_id: str, skill_type: str, data: dict): """ 状态持久化核心函数:将Skill数据保存到本地文件 :param user_id: 用户唯一ID :param skill_type: 技能类型(diabetes/hypertension/diet) :param data: 结构化数据 """ filename = f"{user_id}_{skill_type}.json" # 读取历史数据(若存在) history_data = [] if os.path.exists(filename): with open(filename, "r", encoding="utf-8") as f: history_data = json.load(f) # 追加新数据 history_data.append(data) # 写入文件(持久化) with open(filename, "w", encoding="utf-8") as f: json.dump(history_data, f, ensure_ascii=False, indent=2) print(f"✅ 数据已持久化保存至:{filename}") return True
4. 病程追踪与数据读取
读取用户持久化的历史数据,用于病程追踪
def get_user_skill_history(user_id: str, skill_type: str): """ 读取用户持久化的历史数据,用于病程追踪 """ filename = f"{user_id}_{skill_type}.json" if not os.path.exists(filename): return [] with open(filename, "r", encoding="utf-8") as f: return json.load(f) def analyze_glucose_trend(user_id: str): """ 糖尿病病程追踪:分析血糖趋势,生成统计报告 """ data_list = get_user_skill_history(user_id, "diabetes") if not data_list: return "暂无血糖数据" # 统计计算 values = [item["glucose_value"] for item in data_list] times = [item["measure_time"][5:16] for item in data_list] avg_value = sum(values) / len(values) max_value = max(values) min_value = min(values) # 异常统计 abnormal_count = len([item for item in data_list if item["status"] != "正常"]) report = f""" 📊 糖尿病血糖病程分析报告 总记录次数:{len(data_list)} 平均血糖值:{avg_value:.2f} mmol/L 最高血糖值:{max_value:.2f} mmol/L 最低血糖值:{min_value:.2f} mmol/L 异常记录次数:{abnormal_count} """ return report, times, values
5. 病程数据可视化绘图
绘制血糖趋势图,保存为图片,实现病程追踪可视化
def plot_glucose_trend(user_id: str, save_path=None): """ 绘制血糖趋势图,保存为图片(病程追踪可视化) """ data_list = get_user_skill_history(user_id, "diabetes") if not data_list: print("暂无血糖数据") return if save_path is None: save_path = f"{user_id}_glucose_trend.png" plt.rcParams["font.sans-serif"] = ["SimHei", "DejaVu Sans"] plt.rcParams["axes.unicode_minus"] = False values = [item["glucose_value"] for item in data_list] times = [item["measure_time"][5:16] for item in data_list] plt.figure(figsize=(12, 6)) plt.plot(times, values, marker="o", linewidth=2, color="#e63946", label="血糖值") plt.axhline(y=6.1, color="orange", linestyle="--", label="空腹血糖上限") plt.title(f"用户 {user_id[:8]}... 血糖趋势追踪图", fontsize=14) plt.xlabel("测量时间", fontsize=12) plt.ylabel("血糖值 (mmol/L)", fontsize=12) plt.xticks(rotation=45) plt.grid(alpha=0.3) plt.legend() plt.tight_layout() plt.savefig(save_path, dpi=150) plt.close() print(f"✅ 血糖趋势图已保存:{save_path}") return save_path
6. 完整Skill运行输出
if __name__ == "__main__": # 1. 创建用户 user_id = generate_user_id() print(f"新用户ID:{user_id}") # 2. 模拟用户连续输入血糖数据 user_inputs = [ "2025-12-20 08:00 空腹血糖6.5mmol/L", "2025-12-21 08:10 空腹血糖5.9mmol/L", "2025-12-22 08:05 空腹血糖7.2mmol/L", "2025-12-23 07:50 空腹血糖6.8mmol/L" ] # 3. 解析并持久化数据 for text in user_inputs: data = parse_diabetes_input(text) save_user_skill_data(user_id, "diabetes", data) # 4. 生成病程报告 report, _, _ = analyze_glucose_trend(user_id) print(report) # 5. 生成趋势图 plot_glucose_trend(user_id)
输出结果:
慢病管理系统用户唯一ID:7fc7e735-7b83-4507-b40f-7d564a61743c
新用户ID:b052e05f-49e6-480d-958a-9c8b83f64b79
✅ 数据已持久化保存至:b052e05f-49e6-480d-958a-9c8b83f64b79_diabetes.json
✅ 数据已持久化保存至:b052e05f-49e6-480d-958a-9c8b83f64b79_diabetes.json
✅ 数据已持久化保存至:b052e05f-49e6-480d-958a-9c8b83f64b79_diabetes.json
✅ 数据已持久化保存至:b052e05f-49e6-480d-958a-9c8b83f64b79_diabetes.json
📊 糖尿病血糖病程分析报告
总记录次数:4
平均血糖值:6.60 mmol/L
最高血糖值:7.20 mmol/L
最低血糖值:5.90 mmol/L
异常记录次数:3
血糖趋势图:
b052e05f-49e6-480d-958a-9c8b83f64b79_diabetes.json 文件内容:
[ { "measure_time": "2025-12-20 08:00", "glucose_value": 6.5, "measure_type": "空腹", "status": "偏高" }, { "measure_time": "2025-12-21 08:10", "glucose_value": 5.9, "measure_type": "空腹", "status": "正常" }, { "measure_time": "2025-12-22 08:05", "glucose_value": 7.2, "measure_type": "空腹", "status": "偏高" }, { "measure_time": "2025-12-23 07:50", "glucose_value": 6.8, "measure_type": "空腹", "status": "偏高" } ]
五、对大模型的意义与价值
1. 弥补大模型三大核心缺陷
- 1. 无记忆缺陷:状态持久化让大模型拥有长期记忆,记住用户所有健康数据;
- 2. 无结构化数据能力:Skill 将自然语言转化为可计算的医疗数据;
- 3. 无专业垂直能力:Skill 嵌入医学规则,让大模型具备慢病专业判断能力。
2. 大模型能力升级路径
- 1. 通用对话 → 只能聊天,无实用价值;
- 2. 单 Skill 交互 → 可记录单一慢病数据;
- 3. 状态持久化 → 可长期追踪病程;
- 4. 跨 Skill 融合 → 构建个人健康图谱;
- 5. 智能决策 → 生成个性化慢病管理方案。
3 产业价值:大模型 + Skill 重构慢病管理模式
- 1. 患者端:7×24 小时智能管理,实时预警,降低并发症风险;
- 2. 医生端:获取连续病程数据,精准制定干预方案;
- 3. 医疗体系:减少院外管理成本,提升慢病控制率。
4. 技术价值:大模型从文本生成器升级为数据智能体
Skill 状态持久化让大模型不再只是处理文本,而是能够:
- 采集数据:通过调用工具接口,实时捕获用户指令、环境参数及多模态交互信息,构建全量数据底座。
- 存储数据:将关键信息结构化持久化至向量库或关系型数据库,突破上下文窗口限制,实现跨会话记忆。
- 分析数据:对沉淀的历史轨迹进行聚合统计与模式挖掘,识别用户偏好趋势,为智能决策提供数据支撑。
- 可视化数据:将抽象的内部状态与推理路径转化为直观图表,让复杂的思维过程透明可见,增强可解释性。
- 推理决策:结合长期记忆与实时上下文进行深度逻辑推演,从被动问答转向主动规划,输出最优行动策略。
- 持续追踪:建立闭环反馈机制,全链路监控任务执行效果,根据结果动态修正模型参数,实现自我进化。
这是大模型在医疗健康领域落地的核心技术支撑。
六、总结
面向慢病的SKILL状态持久化与病程追踪,核心其实就是把只会聊天、转头就忘的大模型,变成能长期管慢病、懂患者病情的智能助手。普通对话是无状态的,聊完就清空,而 SKILL 最大的价值,就是能为每个用户保存专属交互记录,把血糖、血压、饮食禁忌这些关键信息结构化存下来,实现跨轮次、跨技能的记忆,最终拼成完整的个人健康图谱。
它不只是一个功能插件,更是慢病管理里真正的数据载体,让大模型从 “随口回答” 升级成 “持续追踪、专业判断”。有了状态持久化,数据不会丢、趋势能分析、异常能预警,这才是医疗AI落地的关键,否则再强的模型也只能做一次性问答。大模型落地垂直场景,拼的不是对话多流畅,而是数据能不能结构化、能不能持久化、能不能联动复用。很多人一上来就堆模型效果,反而忽略了状态管理和病程追踪这种工程底座,结果实用性大打折扣。