专业路由¶
src/pipeline/router.py 中的 Router 类决定哪些专业富化策略适用于给定的提取结果。
路由工作原理¶
路由器接收 ExtractionResult 和 UserTableSchema,构建提取数据的紧凑摘要——表格角色、表头、行数、样本单元格值、上下文类型及内容片段——并携带 ROUTER 提示词发送至快速 Gemini 模型(gemini-3-flash-preview)。Gemini 返回包含 StrategyType 列表及推理依据的 GeminiRoutingResult。
def route(self, extraction_result, schema) -> list[StrategyType]:
summary = self._build_summary(extraction_result, schema)
result = self.gemini.request(summary, GeminiRoutingResult, model=ModelType.FAST)
return result.strategies if result.strategies else []
摘要包含每张主表前三行最多五列的样本单元格值。这使路由器无需发送完整表格数据,即可检测复合引用(如 GL-03/GMT-01)等模式。
五种策略类型¶
每种策略类型对应一个专业提示词和一种特定的富化方式。路由器仅在提取数据中存在明确证据时才选择相应策略。
| 策略 | 提示词常量 | 任务 | 所需证据 |
|---|---|---|---|
auxiliary_table |
AUXILIARY_TABLE_ENRICHMENT |
将参考编码与辅助表行匹配 | 至少一张含有行数据的 AUXILIARY 表 |
text_rule |
TEXT_RULE_ENRICHMENT |
应用通用备注、规范要求及性能规格 | 包含可操作规则或条件语句的文本上下文 |
image_legend |
LEGEND_ENRICHMENT |
将样式代码与图例图示解读匹配 | 包含样式代码、开启方式或配置的图像上下文 |
dimension_card |
DIMENSION_ENRICHMENT |
从条目卡片及详图中提取尺寸 | 包含具体测量数据的图像上下文 |
multi_label |
MULTI_LABEL_ENRICHMENT |
解析复合引用及共享条目卡片 | 含 / 或 , 分隔符的单元格值,或含多个类型标记标签的图像上下文 |
T1:辅助表富化¶
辅助表专业策略处理主清单与辅助参考表之间的交叉引用。它将主清单列中的参考编码(如 GL-03、HW-05)与辅助表行匹配,并将匹配数据填充至目标模式列。对于复合引用(如 GL-03/GMT-01),它解析主要组件,并将次要组件记录在 Special Notes 中。
T2:文本规则富化¶
文本规则专业策略应用提取为文本上下文条目的文档级规则,包括 IBC 规范要求(如"距门 24 英寸内需钢化玻璃")、性能规格(U 值、STC、SHGC 目标)、材料要求以及含条件语句的通用备注。结果主要体现在 Special Notes 列。
T3:图例富化¶
图例专业策略将主清单中的样式代码或类型标识与图像上下文中的图例图示解读进行匹配。它填充开启方式(使用 WindowOperabilityType / DoorOperabilityType 约束枚举值)、玻璃配置及面板属性。支持子类型继承——当 P1a 等行无直接图例匹配时,继承自基础类型 P1。
T4:尺寸富化¶
尺寸专业策略从图像上下文的条目卡片图和详图中提取宽度、高度、粗开口尺寸及其他尺寸值。它通过类型标记或标签将图纸与清单行关联。
T5:多标签富化¶
多标签专业策略处理两种模式:
- 复合单元格值 — 主清单单元格中含
/或,分隔的多个参考编码(如GL-03/GMT-01)。策略根据建筑领域知识确定主要与次要组件(GL- 前缀通常为幕墙的主要组件)。 - 共享条目卡片 — 单张图像上下文图示标注了多个清单条目(如
W39A-PTHP / W39B-NO PTHP)。策略通过将卡片标签与__row_id__值匹配,将特定变体属性映射至正确行。
单体回退¶
当路由器返回空策略列表——即没有专业策略有明确支持证据时——富化器回退至单体 ENRICHMENT 提示词。该单次 Gemini 调用接收所有表格、上下文和模式,尝试从任何可用来源填充所有列。它使用相同的优先级顺序(主表、辅助表、图像上下文、文本上下文),但以单次调用代替专业策略。
路由决策流程¶
下图展示了路由器输出如何决定富化路径。
flowchart TB
ER["ExtractionResult + Schema"] --> ROUTER["路由器<br/>(Gemini Flash)"]
ROUTER --> CHECK{返回策略?}
CHECK -->|空| MONO["单体 ENRICHMENT<br/>(单次 Gemini Pro 调用)"]
MONO --> OUT["list[EnrichedRow]"]
CHECK -->|非空| SPLIT["分发至专业策略"]
SPLIT --> T1["T1: 辅助表"]
SPLIT --> T2["T2: 文本规则"]
SPLIT --> T3["T3: 图例"]
SPLIT --> T4["T4: 尺寸"]
SPLIT --> T5["T5: 多标签"]
T1 --> MERGE["_merge_specialist_results()"]
T2 --> MERGE
T3 --> MERGE
T4 --> MERGE
T5 --> MERGE
MERGE --> OUT
并非每个专业策略都在每份文件上运行。路由器仅选择有明确证据的策略,因此典型运行会激活两到三个专业策略。