MBE 统一知识图谱 - 迁移指南
文档版本: v1.0
创建日期: 2026-02-09
适用范围: MBE 统一知识图谱从开发环境到生产环境的完整迁移
📋 目录
迁移概述
迁移目标
将 MBE 系统从现有的扁平化数据存储迁移到统一知识图谱架构,实现:
- 跨模块的关系拓扑查询
- 用户偏好的持续学习
- 学习路径的智能生成
- 专家路由的增强匹配
迁移原则
- 渐进式迁移:分阶段启用,避免一次性切换
- 向后兼容:保留原有逻辑作为 fallback
- 可回退:每个阶段都可以快速回退
- 可监控:全程监控性能和错误率
- 零停机:不影响现有服务
迁移时间表
| 阶段 | 时间 | 内容 | 风险等级 |
|---|---|---|---|
| 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
验证步骤:
- 启动服务,检查日志中是否有图谱初始化信息
- 进行几次对话,检查是否追踪实体
- 检查图谱中是否有用户节点和实体节点
- 验证用户偏好是否更新
成功标准:
- ✅ 服务正常启动,无错误
- ✅ 对话事件成功同步到图谱
- ✅ 实体追踪功能正常
- ✅ 用户偏好更新正常
- ✅ 错误率 < 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
验证步骤:
- 测试专家路由功能
- 验证互补专家查找
- 测试用户偏好对路由的影响
- 验证 MIRAS 的领域偏好加权
- 检查反馈闭环是否正常工作
成功标准:
- ✅ 专家路由准确率不下降
- ✅ 互补专家查找功能正常
- ✅ 用户偏好影响路由结果
- ✅ 反馈闭环正常工作
- ✅ 错误率 < 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
验证步骤:
- 创建知识点,验证环检测
- 生成学习路径,验证拓扑排序
- 更新知识点,验证图谱同步
- 删除知识点,验证图谱清理
- 测试大规模知识点场景
成功标准:
- ✅ 环检测功能正常
- ✅ 学习路径生成正确
- ✅ 图谱同步无遗漏
- ✅ 错误率 < 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 # ← 新增
验证步骤:
- 全面功能测试
- 性能压力测试
- 数据一致性检查
- 监控指标检查
成功标准:
- ✅ 所有功能正常
- ✅ 性能指标达标
- ✅ 数据一致性 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
数据回退
如果出现数据不一致,可以:
- 从备份恢复数据库
- 清空图谱数据目录:
rm -rf data/graph/* - 重启服务,图谱会重新初始化
监控指标
关键指标定义
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 仪表板配置
关键面板:
图谱规模面板
- 节点数量趋势
- 边数量趋势
- 各类型节点分布
性能面板
- 查询延迟(P50/P95/P99)
- 操作延迟
- 吞吐量
错误率面板
- 错误总数
- 错误率趋势
- Fallback 次数
内存使用面板
- 内存使用趋势
- 内存峰值
告警规则
关键告警
# 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%
- 服务不可用
- 数据大量丢失
响应步骤:
- 立即执行快速回退脚本
- 通知团队
- 分析问题原因
- 修复后重新迁移
一般问题(P1)
触发条件:
- 错误率 1-5%
- 性能下降 > 20%
- 数据不一致
响应步骤:
- 启用详细日志
- 分析问题原因
- 临时禁用问题组件
- 修复后重新启用
常见问题
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:
- 查看日志中的性能信息
- 使用 Prometheus + Grafana 监控指标
- 运行性能基准测试:
pytest tests/performance/test_unified_graph_benchmark.py -v
Q6: 迁移过程中出现错误怎么办?
A:
- 检查错误日志
- 根据错误类型决定是否回退
- 如果错误率 < 1%,可以继续观察
- 如果错误率 > 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. 相关文档
- MBE_UNIFIED_KNOWLEDGE_GRAPH_IMPLEMENTATION.md - 完整实现方案
- MBE_GRAPH_FEATURE_FLAGS.md - Feature Flags 使用指南
- MBE_GRAPH_IMPLEMENTATION_STATUS.md - 实现状态总结
最后更新: 2026-02-09