本节摘要:文档处理工具包是会议的秘书处:把各类文件(说明文档、表格、演示稿、纯文本)转成结构化文本,供后续议题加工。本节讲它的转换能力清单、格式识别的三个陷阱、批量处理的组织方法,以及"转换即有损"的核对习惯。
本节在专家流水线中处于中游:外联部与情报员把材料搬回会场后,大量材料以文件形态存在——竞品说明书是文档、财务口径是表格、发布会实录是演示稿。秘书处的职责是把这些异质文件统一转成"执行侧模型读得懂"的文本。它不产出观点,它保证材料可读。
按常见任务归档,秘书处覆盖四类转换:
| 文件形态 | 典型来源 | 转换产出 | 注意事项 |
|---|---|---|---|
| 说明文档 | 产品手册、白皮书 | 分章节纯文本 | 目录结构是天然切块单位 |
| 表格文件 | 报价单、参数表 | 行列文本或结构化数据 | 合并单元格会丢失表头关系 |
| 演示稿 | 发布会材料、宣讲 PPT | 按页文字与备注 | 图表内容需要翻译席配合 |
| 纯文本类 | 公告、邮件、日志 | 直接可用 | 注意编码与字符集 |
表格行值得单独强调:表格不是"看起来规整的文本",合并单元格、多级表头、跨页续表都会在转换时变形。凡是下游要做计算的表格材料,转换后必须做一次结构核对(本节第三部分给了核对脚本)。
from camel.toolkits import DocumentProcessingToolkit, FileToolkit # 秘书处挂载(示意):内部按扩展名自动选择解析方式 doc_toolkit = DocumentProcessingToolkit() def convert_brief(path_desc: str, file_type: str) -> dict: """演示一次秘书处转换的产出结构。 path_desc: 文件的业务描述(如'竞品A产品手册')""" # 真实调用形如 doc_toolkit.convert_to_text(...),此处演示产出约定 if file_type == "pdf手册": return {"来源": path_desc, "结构": "按章节切为 14 块", "字符数": 18200, "风险": "第 7 章含大表,需结构核对"} if file_type == "xlsx报价": return {"来源": path_desc, "结构": "3 个工作表,各 40 行", "字符数": 6400, "风险": "存在合并单元格,表头关系待核对"} return {"来源": path_desc, "结构": "整篇单块", "字符数": None, "风险": "未知类型,建议人工确认"} # 输出: # convert_brief("竞品A产品手册", "pdf手册") # -> {'来源': '竞品A产品手册', '结构': '按章节切为 14 块', '字符数': 18200, '风险': '第 7 章含大表,需结构核对'}
产出结构里"风险"字段是秘书处的纪律:转换是有损过程,损失点必须标注。直接把无标注的转换结果交给下游,等于把风险静默转移给演算席。
报价单里最常见:表头"价格(元/月)"横跨三列(基础版、专业版、企业版),转成文本后三列数值失去表头归属。核对方法是让秘书处在转换后回读首行,确认每列都有唯一表头归属。
def check_header(header_row: list, span_map: dict) -> list: """核对转换后的表头归属。 header_row: 转换后的表头行文本 span_map: 原文件中跨列单元格的覆盖声明,如 {'价格': 3} 返回问题列表""" issues = [] occupied = sum(span_map.values()) plain = len([h for h in header_row if h and "数值" not in h]) if occupied and plain + occupied > len(header_row): issues.append("表头列数与跨列声明不符,疑似合并单元格丢失") if any(h in (None, "") for h in header_row): issues.append("存在空表头,列归属不明") return issues or ["表头核对通过"] # 输出: # check_header(["项目", "数值", "数值", "数值"], {"价格": 3}) # -> ['表头列数与跨列声明不符,疑似合并单元格丢失']
扩展名是文档格式不代表内容是文本——扫描生成的文档里每页其实是一张图,秘书处按文本解析只会得到空转。识别信号:转换产出字符数接近零但页数不少。处置:转交翻译席(3.5)走图像识别路径。
跨系统流转的文本文件可能带着非通用编码,转换产出里出现成对的替换符(形如问号或方块)就是信号。处置:在工单里指定重编码后重转,别让带替换符的文本流进下游——那会污染检索记忆(2.5)。
背景:第二轮竞品调研(五竞品规模)带回了 23 份文件,大小与格式混杂。操作:分三步组织——先逐份登记(形态、来源、议题归属),再按"同议题同批"分批转换(让同一议题的产出一起回到主持人桌面),最后对每批产出做结构核对,风险项单独标记。结果:23 份文件中 21 份一次转成,2 份扫描件转交翻译席;带风险标注的报价表在演算席加工前完成了表头修复,避免了一次错误的差价计算。解读:批量转换的组织成本主要在登记与核对,而这两步恰恰是把"有损转换"变成"可控转换"的全部秘密。
变式:如果文件持续流入(比如每天新增一批公告),把登记与核对写成固定流水线,让秘书处按"新到即转、转换即标"运转——这同样是第 5 章常设委员会的雏形。
💡 关键直觉:秘书处的价值不在于"能读多少种格式",而在于让每份材料的损耗可见。一个会说"这份表我读不准,建议人工确认"的秘书,好过一个闷头把错表交上去的秘书。