多层级世界地图
AI Reader 的世界地图从小说文本中自动提取地点层级关系,以可视化地图的形式呈现小说世界的地理全貌。无论是玄幻仙侠的架空世界,还是现实题材的真实地理,都能生成直观的空间布局。
地点层级自动解析
父级投票系统
WorldStructureAgent 从每章提取的 ChapterFact 中收集地点父级关系投票。投票来源包括:
- 地点事实中的
parent字段 - 空间关系中的"包含"关系(按置信度加权)
- 章节主场景推断
系统对所有投票进行汇总,得票最高者成为最终父级。遇到循环引用时,DFS 检测会切断最弱链接。用户手动设定的层级关系优先级最高。
后缀等级系统
中文地名后缀天然编码了地理尺度信息。系统内置后缀等级表(界 > 国 > 城 > 谷 > 洞 > 殿),以后缀等级作为父子方向判定的首要信号,仅在双方名称均无可识别后缀时回退到 LLM 分类的层级。
兄弟聚类
双向冲突检测识别同级地点对(相同后缀等级、投票比例接近),自动将两者重新分配到共同父级。还支持基于 LocationFact.peers 的显式同级证据检测。
层级整合
consolidate_hierarchy() 处理层级反转修复、噪声根节点救援、振荡抑制,以及分层的孤儿收养策略(前缀匹配 -> 主导中间节点 -> 层级门控的超级根节点回退)。
布局模式
葵花籽分布(默认)
使用黄金角分布算法实现有机的地点摆放,自适应扩散半径随子节点数量缩放,防止聚簇。
约束求解器
ConstraintSolver 采用差分进化算法,配合力导向预布局作为初始种子,计算最终布局位置。
真实地理模式(GeoMap)
对于现实题材小说,GeoResolver 将小说地名匹配到真实世界坐标:
- 自动检测:根据小说类型和 CJK 字符比例判断是否为现实地理
- 四级匹配:人工补充表 -> 中文别名索引 -> GeoNames 精确匹配 -> 后缀剥离 + 人口消歧
- 数据集:中国地点(
14 万条)和全球城市(人口 > 5000,5 万条) - 玄幻/仙侠类型自动跳过地理匹配
真实地理模式下使用 React-Leaflet 渲染,CircleMarker 大小反映提及次数,颜色区分地点类型。
地形与风格
Whittaker 生物群系矩阵
5x5 海拔 x 湿度网格,双线性插值实现平滑地形着色。Lloyd 松弛算法生成均匀 Voronoi 细胞,呈现自然的地形区域划分。
程序化河流生成
后端基于 OpenSimplex 高程场的梯度下降算法,从水系类型地点出发生成河流路径。前端使用 d3 curveBasis 渲染平滑河道。
地形纹理符号
terrainHints.ts 在地形类型地点周围生成装饰性 SVG 符号(山脉、水系、森林、沙漠、洞穴),符号大小随层级变化,位置确定性摆放且有碰撞检测。
手绘风格
使用 roughjs 渲染领地边界、河流和海岸线,呈现素描美学:
- 海岸线:凸包 + 径向扩展 + 多倍频噪声生成自然轮廓
- 领地填充:面积门控,仅对大面积领地进行填充渲染
- 区域标签:SVG textPath 沿曲线排布,晕影和位移滤镜增强手绘质感
轨迹动画
追踪角色在小说中的移动路径:
- 双路径渐进绘制:逐步展开移动轨迹
- 驿站停留时长缩放:在重要地点停留更久
- 脉冲标记:当前位置以脉冲动画标识
- 章节标签:标注每段移动对应的章节
- 自动跟随平移:镜头随角色移动自动调整
- 可调速度:支持播放速度调节
冲突标记
conflict_detector.py 检测不同章节间的父级关系分歧。地图上以红色脉冲动画圆环标识存在冲突的地点,帮助用户发现需要人工介入的层级问题。系统过滤同名异地的高频词,并要求多章节少数派证据以减少误报。
密集地点优化
两阶段筛选管线应对大量地点:
- 提及次数滑块:过滤低频地点
- 层级折叠/展开:默认隐藏场所/建筑层级,父节点上显示"+N"展开徽章,点击可展开查看子地点
交互功能
- 拖拽重定位:编辑模式下可拖动地点调整位置,修改结果持久保存
- 点击打开卡片:点击地点直接打开实体卡片抽屉,查看详细信息
- 8 锚点标签布局:
computeLabelLayout()为每个标签尝试 8 个候选锚点位置,多锚点碰撞检测确保标签不重叠 - 模拟退火优化:
labelAnnealing.ts在高清地图导出时使用模拟退火算法优化标签布局
层级重建
支持两步式层级重建流程:
POST /rebuild-hierarchy:流式返回 SSE 进度事件,输出层级变更差异(不直接保存)POST /apply-hierarchy-changes:应用用户选择的变更,自动清除地图覆盖以重新定位
三层循环检测防御贯穿解析、整合和保存全流程。