MBE 统一知识图谱 - 迁移指南

文档版本: v1.0
创建日期: 2026-02-09
适用范围: MBE 统一知识图谱从开发环境到生产环境的完整迁移


📋 目录

  1. 迁移概述
  2. 迁移前准备
  3. 迁移路线图
  4. 各阶段详细步骤
  5. 验证标准
  6. 回退方案
  7. 监控指标
  8. 风险评估与缓解措施
  9. 常见问题

迁移概述

迁移目标

将 MBE 系统从现有的扁平化数据存储迁移到统一知识图谱架构,实现:

  • 跨模块的关系拓扑查询
  • 用户偏好的持续学习
  • 学习路径的智能生成
  • 专家路由的增强匹配

迁移原则

  1. 渐进式迁移:分阶段启用,避免一次性切换
  2. 向后兼容:保留原有逻辑作为 fallback
  3. 可回退:每个阶段都可以快速回退
  4. 可监控:全程监控性能和错误率
  5. 零停机:不影响现有服务

迁移时间表

阶段 时间 内容 风险等级
Phase 1: 准备阶段 Day 1-2 环境准备、数据备份
Phase 2: 基础集成 Day 3-5 启用对话上下文同步
Phase 3: 核心功能 Day 6-8 启用专家路由、MIRAS
Phase 4: 教育模块 Day 9-10 启用 CourseManager
Phase 5: 全量启用 Day 11-12 启用所有组件
Phase 6: 优化监控 Day 13-14 性能优化、监控完善

迁移前准备

1. 环境检查清单

系统要求

  • Python 3.11+
  • NetworkX 3.0+
  • 足够的磁盘空间(建议 10GB+ 用于图谱数据)
  • 内存充足(建议 8GB+,大规模图谱需要更多)

依赖检查

# 检查关键依赖
python -c "import networkx; print(networkx.__version__)"
python -c "import jieba; print('jieba available')"

# 检查图谱模块
python -c "from src.knowledge.graph import UnifiedKnowledgeGraph; print('Graph module OK')"

数据备份

# 备份现有数据
# 1. 备份数据库
pg_dump mbe_db > backup_$(date +%Y%m%d).sql

# 2. 备份配置文件
cp .env .env.backup

# 3. 备份图谱数据目录(如果存在)
cp -r data/graph data/graph.backup

2. Feature Flags 配置

初始配置(完全禁用)

# .env 文件
MBE_UNIFIED_GRAPH_ENABLED=false
MBE_GRAPH_EXPERT_ROUTING=false
MBE_GRAPH_MIRAS_CONTEXT=false
MBE_GRAPH_CONVERSATION=false
MBE_GRAPH_EDUCATION=false
MBE_GRAPH_RETRIEVAL_KG=false

验证配置

# 启动服务,确认图谱功能未启用
python -c "
import os
os.environ['MBE_UNIFIED_GRAPH_ENABLED'] = 'false'
from src.knowledge.graph import get_unified_graph
graph = get_unified_graph()
print('Graph disabled:', graph is None or not hasattr(graph, '_graph'))
"

3. 监控准备

日志配置

确保日志级别设置为 INFO 或 DEBUG,以便追踪图谱操作:

# 在配置中启用图谱相关日志
logger.add("logs/graph_{time}.log", rotation="100 MB", level="DEBUG")

监控指标准备

准备监控以下指标:

  • 图谱节点/边数量
  • 查询延迟(P50/P95/P99)
  • 错误率
  • 内存使用
  • 磁盘使用

迁移路线图

Phase 1: 准备阶段(Day 1-2)

目标: 完成环境准备和数据备份

任务清单:

  • 环境检查(系统要求、依赖)
  • 数据备份(数据库、配置文件、图谱数据)
  • 监控准备(日志、指标收集)
  • 回退方案准备(快速禁用脚本)

验证标准:

  • ✅ 所有依赖已安装
  • ✅ 数据备份完成
  • ✅ 监控系统就绪
  • ✅ 回退脚本可用

预计时间: 1-2 天


Phase 2: 基础集成(Day 3-5)

目标: 启用对话上下文同步,验证基础功能

Feature Flags 配置:

MBE_UNIFIED_GRAPH_ENABLED=true
MBE_GRAPH_CONVERSATION=true
MBE_GRAPH_EXPERT_ROUTING=false
MBE_GRAPH_MIRAS_CONTEXT=false
MBE_GRAPH_EDUCATION=false
MBE_GRAPH_RETRIEVAL_KG=false

验证步骤:

  1. 启动服务,检查日志中是否有图谱初始化信息
  2. 进行几次对话,检查是否追踪实体
  3. 检查图谱中是否有用户节点和实体节点
  4. 验证用户偏好是否更新

成功标准:

  • ✅ 服务正常启动,无错误
  • ✅ 对话事件成功同步到图谱
  • ✅ 实体追踪功能正常
  • ✅ 用户偏好更新正常
  • ✅ 错误率 < 0.1%
  • ✅ 响应时间增加 < 10ms

回退条件:

  • 错误率 > 1%
  • 响应时间增加 > 100ms
  • 出现数据不一致

预计时间: 2-3 天(包含观察期)


Phase 3: 核心功能(Day 6-8)

目标: 启用专家路由和 MIRAS 匹配器

Feature Flags 配置:

MBE_UNIFIED_GRAPH_ENABLED=true
MBE_GRAPH_CONVERSATION=true
MBE_GRAPH_EXPERT_ROUTING=true  # ← 新增
MBE_GRAPH_MIRAS_CONTEXT=true   # ← 新增
MBE_GRAPH_EDUCATION=false
MBE_GRAPH_RETRIEVAL_KG=false

验证步骤:

  1. 测试专家路由功能
  2. 验证互补专家查找
  3. 测试用户偏好对路由的影响
  4. 验证 MIRAS 的领域偏好加权
  5. 检查反馈闭环是否正常工作

成功标准:

  • ✅ 专家路由准确率不下降
  • ✅ 互补专家查找功能正常
  • ✅ 用户偏好影响路由结果
  • ✅ 反馈闭环正常工作
  • ✅ 错误率 < 0.5%
  • ✅ 路由延迟增加 < 50ms

回退条件:

  • 专家路由准确率下降 > 5%
  • 路由延迟增加 > 200ms
  • 出现大量路由错误

预计时间: 2-3 天(包含观察期)


Phase 4: 教育模块(Day 9-10)

目标: 启用 CourseManager 图谱集成

Feature Flags 配置:

MBE_UNIFIED_GRAPH_ENABLED=true
MBE_GRAPH_CONVERSATION=true
MBE_GRAPH_EXPERT_ROUTING=true
MBE_GRAPH_MIRAS_CONTEXT=true
MBE_GRAPH_EDUCATION=true      # ← 新增
MBE_GRAPH_RETRIEVAL_KG=false

验证步骤:

  1. 创建知识点,验证环检测
  2. 生成学习路径,验证拓扑排序
  3. 更新知识点,验证图谱同步
  4. 删除知识点,验证图谱清理
  5. 测试大规模知识点场景

成功标准:

  • ✅ 环检测功能正常
  • ✅ 学习路径生成正确
  • ✅ 图谱同步无遗漏
  • ✅ 错误率 < 0.5%
  • ✅ 学习路径生成延迟 < 100ms

回退条件:

  • 学习路径生成错误
  • 环检测失效
  • 数据同步不一致

预计时间: 1-2 天(包含观察期)


Phase 5: 全量启用(Day 11-12)

目标: 启用所有组件,完成迁移

Feature Flags 配置:

MBE_UNIFIED_GRAPH_ENABLED=true
MBE_GRAPH_CONVERSATION=true
MBE_GRAPH_EXPERT_ROUTING=true
MBE_GRAPH_MIRAS_CONTEXT=true
MBE_GRAPH_EDUCATION=true
MBE_GRAPH_RETRIEVAL_KG=true   # ← 新增

验证步骤:

  1. 全面功能测试
  2. 性能压力测试
  3. 数据一致性检查
  4. 监控指标检查

成功标准:

  • ✅ 所有功能正常
  • ✅ 性能指标达标
  • ✅ 数据一致性 100%
  • ✅ 错误率 < 1%
  • ✅ 所有监控指标正常

预计时间: 1-2 天(包含观察期)


Phase 6: 优化监控(Day 13-14)

目标: 性能优化和监控完善

任务清单:

  • 根据性能基准测试结果优化
  • 完善监控告警
  • 文档更新
  • 团队培训

预计时间: 1-2 天


各阶段详细步骤

Phase 2: 基础集成详细步骤

步骤 1: 启用对话上下文同步

# 1. 更新环境变量
export MBE_UNIFIED_GRAPH_ENABLED=true
export MBE_GRAPH_CONVERSATION=true

# 2. 重启服务
systemctl restart mbe-service
# 或
pm2 restart mbe

# 3. 检查日志
tail -f logs/mbe.log | grep "图谱\|Graph\|ConversationContext"

预期日志:

🔗 ConversationContext: 图谱同步已启用
🔗 Graph query engine connected

步骤 2: 验证功能

# 测试脚本:test_conversation_integration.py
from src.core.conversation_context import ConversationContextManager
from src.knowledge.graph import get_graph_query_engine

# 1. 创建对话上下文管理器
ctx_manager = ConversationContextManager()

# 2. 添加对话轮次
ctx_manager.add_turn(
    device_id="test_device",
    question="如何申请专利?",
    answer="申请专利需要...",
    expert_id="exp_patent",
    expert_name="专利专家",
    metadata={"user_id": "user_001"}
)

# 3. 验证图谱同步
graph_query = get_graph_query_engine()
user_context = graph_query.get_user_context("user_001")

# 4. 检查结果
assert "preferred_experts" in user_context
assert len(user_context["preferred_experts"]) > 0
print("✅ ConversationContext 集成验证通过")

步骤 3: 监控观察

观察 24-48 小时,监控:

  • 错误率
  • 响应时间
  • 内存使用
  • 图谱节点/边数量增长

Phase 3: 核心功能详细步骤

步骤 1: 启用专家路由

export MBE_GRAPH_EXPERT_ROUTING=true
systemctl restart mbe-service

步骤 2: 验证专家路由

# 测试脚本:test_expert_routing.py
from src.knowledge.expert_router import ExpertRouter

router = ExpertRouter()

# 1. 测试基础路由
results = await router.match_expert(
    query="劳动合同纠纷",
    user_id="user_001",
    top_k=3
)

# 2. 验证结果
assert len(results) > 0
print(f"✅ 专家路由返回 {len(results)} 个结果")

# 3. 测试互补专家
complementary = router._graph_query.find_complementary_experts(
    expert_id="exp_law",
    query_keywords=["合同", "商务"],
    top_k=2
)
print(f"✅ 互补专家查找返回 {len(complementary)} 个结果")

步骤 3: 启用 MIRAS 上下文

export MBE_GRAPH_MIRAS_CONTEXT=true
systemctl restart mbe-service

步骤 4: 验证 MIRAS 集成

# 测试脚本:test_miras_integration.py
from src.knowledge.miras_matcher import MIRASMatcher

matcher = MIRASMatcher()

# 1. 设置用户偏好
graph_query = get_graph_query_engine()
graph_query.update_user_preference("user_001", "exp_law", 0.3, True)

# 2. 测试匹配
results = matcher.iterative_match(
    query="法律咨询",
    user_id="user_001",
    top_k=3
)

# 3. 验证偏好影响
assert "exp_law" in [r[0] for r in results]
print("✅ MIRAS 图谱上下文集成验证通过")

Phase 4: 教育模块详细步骤

步骤 1: 启用教育模块

export MBE_GRAPH_EDUCATION=true
systemctl restart mbe-service

步骤 2: 验证环检测

# 测试脚本:test_education_cycle_detection.py
from src.education.course_manager import CourseManager

manager = CourseManager()

# 1. 创建知识点 A
kp_a = manager.create_knowledge_point(
    name="知识点A",
    prerequisites=[]
)

# 2. 创建知识点 B(依赖 A)
kp_b = manager.create_knowledge_point(
    name="知识点B",
    prerequisites=[kp_a.id]
)

# 3. 尝试创建循环依赖(应该失败)
try:
    manager.update_knowledge_point(
        kp_a.id,
        prerequisites=[kp_b.id]  # A → B → A,形成循环
    )
    assert False, "应该抛出循环依赖错误"
except ValueError as e:
    assert "循环依赖" in str(e)
    print("✅ 环检测功能正常")

步骤 3: 验证学习路径

# 测试脚本:test_learning_path.py
from src.education.course_manager import CourseManager
from src.education.models import StudentKnowledgeState, MasteryLevel

manager = CourseManager()

# 1. 创建知识点链:D → C → A, D → B → A
kp_d = manager.create_knowledge_point(name="D", prerequisites=[])
kp_c = manager.create_knowledge_point(name="C", prerequisites=[kp_d.id])
kp_b = manager.create_knowledge_point(name="B", prerequisites=[kp_d.id])
kp_a = manager.create_knowledge_point(name="A", prerequisites=[kp_c.id, kp_b.id])

# 2. 设置学生状态(B 已掌握)
student_states = {
    kp_b.id: StudentKnowledgeState(mastery_level=MasteryLevel.PROFICIENT.value)
}

# 3. 生成学习路径
path = manager.generate_learning_path(student_states, kp_a.id)

# 4. 验证路径
path_names = [kp.name for kp in path]
assert "D" in path_names
assert "C" in path_names
assert "B" not in path_names  # B 已掌握,不在路径中
assert path_names[-1] == "A"  # A 是目标
print("✅ 学习路径生成正确")

验证标准

功能验证标准

Phase 2: 基础集成

  • ✅ 对话事件成功同步到图谱
  • ✅ 实体追踪功能正常(至少追踪 3 个实体/对话)
  • ✅ 用户偏好更新正常(每次交互 +0.05)
  • ✅ 图谱节点数量持续增长
  • ✅ 无数据丢失或重复

Phase 3: 核心功能

  • ✅ 专家路由准确率 ≥ 95%(与基线对比)
  • ✅ 互补专家查找返回有效结果
  • ✅ 用户偏好影响路由结果(偏好专家排名提升)
  • ✅ 反馈闭环正常工作(positive/negative/switch)
  • ✅ MIRAS 领域偏好加权生效

Phase 4: 教育模块

  • ✅ 环检测功能正常(能检测并阻止循环依赖)
  • ✅ 学习路径生成正确(符合拓扑排序)
  • ✅ 知识点创建/更新/删除同步到图谱
  • ✅ 大规模场景(1000+ 知识点)性能正常

性能验证标准

指标 Phase 2 Phase 3 Phase 4 Phase 5
错误率 < 0.1% < 0.5% < 0.5% < 1%
响应时间增加 < 10ms < 50ms < 100ms < 100ms
内存使用增加 < 100MB < 200MB < 500MB < 1GB
图谱查询延迟 - < 5ms < 20ms < 20ms
学习路径生成 - - < 100ms < 100ms

数据一致性验证

# 验证脚本:verify_data_consistency.py
from src.knowledge.graph import get_unified_graph, get_graph_query_engine
from src.education.course_manager import CourseManager

graph = get_unified_graph()
graph_query = get_graph_query_engine()
course_manager = CourseManager()

# 1. 验证知识点同步
local_kps = set(course_manager._knowledge_points.keys())
graph_kps = {
    node_id.replace("kp:", "")
    for node_id in graph.get_nodes_by_type(NodeType.KNOWLEDGE_POINT)
}
assert local_kps == graph_kps, "知识点同步不一致"

# 2. 验证前置依赖同步
for kp_id, prereqs in course_manager._prerequisites.items():
    graph_prereqs = {
        target.replace("kp:", "")
        for source, target, _ in graph._graph.out_edges(f"kp:{kp_id}", data=True)
        if graph._graph.edges[source, target].get("edge_type") == EdgeType.PREREQUISITE.value
    }
    assert prereqs == graph_prereqs, f"知识点 {kp_id} 的前置依赖不一致"

print("✅ 数据一致性验证通过")

回退方案

快速回退脚本

#!/bin/bash
# rollback_graph.sh - 快速回退脚本

echo "⚠️  开始回退统一图谱功能..."

# 1. 禁用所有图谱功能
export MBE_UNIFIED_GRAPH_ENABLED=false
export MBE_GRAPH_EXPERT_ROUTING=false
export MBE_GRAPH_MIRAS_CONTEXT=false
export MBE_GRAPH_CONVERSATION=false
export MBE_GRAPH_EDUCATION=false
export MBE_GRAPH_RETRIEVAL_KG=false

# 2. 更新 .env 文件
sed -i 's/MBE_UNIFIED_GRAPH_ENABLED=true/MBE_UNIFIED_GRAPH_ENABLED=false/g' .env
sed -i 's/MBE_GRAPH_EXPERT_ROUTING=true/MBE_GRAPH_EXPERT_ROUTING=false/g' .env
sed -i 's/MBE_GRAPH_MIRAS_CONTEXT=true/MBE_GRAPH_MIRAS_CONTEXT=false/g' .env
sed -i 's/MBE_GRAPH_CONVERSATION=true/MBE_GRAPH_CONVERSATION=false/g' .env
sed -i 's/MBE_GRAPH_EDUCATION=true/MBE_GRAPH_EDUCATION=false/g' .env
sed -i 's/MBE_GRAPH_RETRIEVAL_KG=true/MBE_GRAPH_RETRIEVAL_KG=false/g' .env

# 3. 重启服务
systemctl restart mbe-service
# 或
pm2 restart mbe

# 4. 验证回退
sleep 5
curl -f http://localhost:8000/health || echo "❌ 服务健康检查失败"

echo "✅ 回退完成,所有图谱功能已禁用"

分阶段回退

回退到 Phase 3(禁用教育模块)

export MBE_GRAPH_EDUCATION=false
systemctl restart mbe-service

回退到 Phase 2(禁用核心功能)

export MBE_GRAPH_EXPERT_ROUTING=false
export MBE_GRAPH_MIRAS_CONTEXT=false
systemctl restart mbe-service

回退到 Phase 1(完全禁用)

export MBE_UNIFIED_GRAPH_ENABLED=false
systemctl restart mbe-service

数据回退

如果出现数据不一致,可以:

  1. 从备份恢复数据库
  2. 清空图谱数据目录:rm -rf data/graph/*
  3. 重启服务,图谱会重新初始化

监控指标

关键指标定义

1. 性能指标

# 监控指标定义
GRAPH_METRICS = {
    # 图谱规模
    "mbe_graph_node_count": Gauge("Total nodes in graph"),
    "mbe_graph_edge_count": Gauge("Total edges in graph"),
    
    # 查询性能
    "mbe_graph_query_duration_ms": Histogram("Graph query duration (ms)"),
    "mbe_graph_query_count": Counter("Total graph queries"),
    
    # 操作性能
    "mbe_graph_add_node_duration_ms": Histogram("Add node duration (ms)"),
    "mbe_graph_add_edge_duration_ms": Histogram("Add edge duration (ms)"),
    "mbe_graph_cycle_detection_duration_ms": Histogram("Cycle detection duration (ms)"),
    
    # 错误率
    "mbe_graph_errors_total": Counter("Total graph errors"),
    "mbe_graph_fallback_count": Counter("Fallback to original logic"),
    
    # 内存使用
    "mbe_graph_memory_usage_mb": Gauge("Graph memory usage (MB)"),
    
    # 持久化
    "mbe_graph_save_duration_ms": Histogram("Graph save duration (ms)"),
    "mbe_graph_load_duration_ms": Histogram("Graph load duration (ms)"),
}

2. 业务指标

BUSINESS_METRICS = {
    # 专家路由
    "mbe_expert_routing_graph_usage": Counter("Expert routing using graph"),
    "mbe_expert_routing_fallback": Counter("Expert routing fallback"),
    "mbe_expert_routing_accuracy": Gauge("Expert routing accuracy"),
    
    # 用户偏好
    "mbe_user_preference_updates": Counter("User preference updates"),
    "mbe_user_preference_weight_avg": Gauge("Average user preference weight"),
    
    # 学习路径
    "mbe_learning_path_generated": Counter("Learning paths generated"),
    "mbe_learning_path_length_avg": Gauge("Average learning path length"),
    
    # 实体追踪
    "mbe_entities_tracked": Counter("Entities tracked"),
    "mbe_entities_per_session_avg": Gauge("Average entities per session"),
}

监控仪表板配置

Prometheus 配置示例

# prometheus.yml
scrape_configs:
  - job_name: 'mbe-graph'
    static_configs:
      - targets: ['localhost:8000']
    metrics_path: '/metrics'
    scrape_interval: 15s

Grafana 仪表板配置

关键面板:

  1. 图谱规模面板

    • 节点数量趋势
    • 边数量趋势
    • 各类型节点分布
  2. 性能面板

    • 查询延迟(P50/P95/P99)
    • 操作延迟
    • 吞吐量
  3. 错误率面板

    • 错误总数
    • 错误率趋势
    • Fallback 次数
  4. 内存使用面板

    • 内存使用趋势
    • 内存峰值

告警规则

关键告警

# alert_rules.yml
groups:
  - name: mbe_graph_alerts
    rules:
      # 错误率告警
      - alert: HighGraphErrorRate
        expr: rate(mbe_graph_errors_total[5m]) > 0.01
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "图谱错误率过高"
          description: "过去5分钟错误率 > 1%"
      
      # 查询延迟告警
      - alert: HighGraphQueryLatency
        expr: histogram_quantile(0.95, mbe_graph_query_duration_ms) > 100
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "图谱查询延迟过高"
          description: "P95 延迟 > 100ms"
      
      # 内存使用告警
      - alert: HighGraphMemoryUsage
        expr: mbe_graph_memory_usage_mb > 2048
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "图谱内存使用过高"
          description: "内存使用 > 2GB"
      
      # Fallback 频率告警
      - alert: HighGraphFallbackRate
        expr: rate(mbe_graph_fallback_count[5m]) > 0.1
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "图谱 Fallback 频率过高"
          description: "可能需要回退"

风险评估与缓解措施

风险矩阵

风险 概率 影响 严重程度 缓解措施
NetworkX 内存占用过高 监控内存,设置节点上限
图谱初始化拖慢启动 异步初始化,不阻塞 API
旧系统迁移数据不一致 保留旧系统作为 fallback
线程安全问题 RWLock + 单元测试
增量持久化丢失数据 定时全量备份 + WAL 模式
性能下降 性能基准测试 + 监控
数据同步延迟 异步同步,不阻塞主流程

详细风险评估

1. NetworkX 内存占用过高

风险描述: 大规模图谱(10000+ 节点)可能导致内存占用过高

概率: 低
影响: 中
严重程度: 中

缓解措施:

  • ✅ 监控内存使用(设置告警阈值 2GB)
  • ✅ 设置节点上限(可通过配置限制)
  • ✅ 定期清理过期数据
  • ✅ 使用增量持久化减少内存占用

检测方法:

# 监控内存使用
import psutil
process = psutil.Process()
memory_mb = process.memory_info().rss / 1024 / 1024
if memory_mb > 2048:
    logger.warning(f"图谱内存使用过高: {memory_mb}MB")

2. 图谱初始化拖慢启动

风险描述: 图谱加载大量数据可能拖慢服务启动

概率: 中
影响: 低
严重程度: 低

缓解措施:

  • ✅ 异步初始化,不阻塞 API 启动
  • ✅ 延迟加载(按需加载)
  • ✅ 使用增量加载(只加载变更部分)

检测方法:

# 监控启动时间
import time
start_time = time.time()
graph = get_unified_graph()
init_duration = time.time() - start_time
if init_duration > 5.0:
    logger.warning(f"图谱初始化过慢: {init_duration:.2f}s")

3. 旧系统迁移数据不一致

风险描述: 图谱数据与原有系统数据不一致

概率: 中
影响: 中
严重程度: 中

缓解措施:

  • ✅ 保留旧系统作为 fallback
  • ✅ 数据一致性验证脚本
  • ✅ 定期数据校验
  • ✅ 双写模式(同时写入旧系统和新系统)

检测方法:

# 数据一致性验证
def verify_data_consistency():
    # 对比旧系统和新系统的数据
    # 检查关键数据是否一致
    pass

4. 线程安全问题

风险描述: 多线程访问图谱可能导致数据不一致

概率: 低
影响: 高
严重程度: 中

缓解措施:

  • ✅ 使用 RLock 保护所有操作
  • ✅ 单元测试验证线程安全
  • ✅ 避免在锁内进行耗时操作

检测方法:

# 线程安全测试
def test_thread_safety():
    # 多线程并发操作图谱
    # 验证数据一致性
    pass

5. 增量持久化丢失数据

风险描述: 服务崩溃可能导致未保存的数据丢失

概率: 低
影响: 高
严重程度: 中

缓解措施:

  • ✅ 定时全量备份(每小时)
  • ✅ WAL 模式(Write-Ahead Logging)
  • ✅ 自动保存间隔缩短(5分钟)
  • ✅ 启动时恢复未保存数据

检测方法:

# 检查持久化状态
def check_persistence_status():
    dirty_nodes = graph._dirty_nodes
    dirty_edges = graph._dirty_edges
    if len(dirty_nodes) > 1000 or len(dirty_edges) > 5000:
        logger.warning("未保存的变更过多,可能需要立即保存")

6. 性能下降

风险描述: 图谱操作可能导致整体性能下降

概率: 中
影响: 中
严重程度: 中

缓解措施:

  • ✅ 性能基准测试(建立基线)
  • ✅ 实时监控性能指标
  • ✅ 设置性能告警阈值
  • ✅ 优化慢查询

检测方法:

# 性能监控
@timing_decorator
def graph_operation():
    # 记录操作时间
    pass

应急响应计划

严重问题(P0)

触发条件:

  • 错误率 > 5%
  • 服务不可用
  • 数据大量丢失

响应步骤:

  1. 立即执行快速回退脚本
  2. 通知团队
  3. 分析问题原因
  4. 修复后重新迁移

一般问题(P1)

触发条件:

  • 错误率 1-5%
  • 性能下降 > 20%
  • 数据不一致

响应步骤:

  1. 启用详细日志
  2. 分析问题原因
  3. 临时禁用问题组件
  4. 修复后重新启用

常见问题

Q1: 如何验证图谱功能是否启用?

A: 检查日志中是否有以下信息:

🔗 Expert router: 统一图谱查询引擎已连接
🔗 MIRAS: 统一图谱查询引擎已连接
🔗 ConversationContext: 图谱同步已启用
🔗 CourseManager: 统一图谱集成已启用

或者使用代码检查:

from src.knowledge.graph import get_unified_graph
graph = get_unified_graph()
if graph and graph.node_count > 0:
    print("✅ 图谱功能已启用")

Q2: 如何快速禁用所有图谱功能?

A: 设置环境变量:

export MBE_UNIFIED_GRAPH_ENABLED=false
systemctl restart mbe-service

或使用回退脚本:

./rollback_graph.sh

Q3: 图谱数据存储在哪里?

A: 默认存储在 data/graph/ 目录,可通过环境变量配置:

export MBE_GRAPH_STORAGE_PATH=/path/to/graph/data

Q4: 如何备份图谱数据?

A:

# 备份图谱数据目录
cp -r data/graph data/graph.backup.$(date +%Y%m%d)

# 或使用持久化层的备份功能
python -c "from src.knowledge.graph.persistence import GraphPersistence; GraphPersistence().backup()"

Q5: 如何监控图谱性能?

A:

  1. 查看日志中的性能信息
  2. 使用 Prometheus + Grafana 监控指标
  3. 运行性能基准测试:
pytest tests/performance/test_unified_graph_benchmark.py -v

Q6: 迁移过程中出现错误怎么办?

A:

  1. 检查错误日志
  2. 根据错误类型决定是否回退
  3. 如果错误率 < 1%,可以继续观察
  4. 如果错误率 > 1%,建议回退到上一阶段

Q7: 如何验证数据一致性?

A: 运行验证脚本:

python scripts/verify_graph_consistency.py

Q8: 图谱功能对现有功能有影响吗?

A:

  • 所有图谱功能都有 fallback 机制
  • 如果图谱功能失败,会自动回退到原有逻辑
  • 不会影响现有功能的正常运行

附录

A. 环境变量参考

变量名 默认值 说明
MBE_UNIFIED_GRAPH_ENABLED true 全局开关
MBE_GRAPH_EXPERT_ROUTING true ExpertRouter 图谱路由
MBE_GRAPH_MIRAS_CONTEXT true MIRAS 图谱上下文
MBE_GRAPH_CONVERSATION true ConversationContext 图谱同步
MBE_GRAPH_EDUCATION true CourseManager 图谱集成
MBE_GRAPH_RETRIEVAL_KG true RetrievalMoE 图谱检索
MBE_GRAPH_STORAGE_PATH data/graph 图谱数据存储路径
MBE_GRAPH_AUTO_SAVE_SECONDS 300 自动保存间隔(秒)

B. 回退脚本

回退方案 章节。

C. 验证脚本

所有验证脚本已包含在相应章节中。

D. 相关文档


最后更新: 2026-02-09