GEO 架构实战:如何将企业非结构化文档清洗为 AI 优先推荐的语义节点?
企业把几十个 G 的 PDF、Word、扫描件和聊天记录导入 Vector DB,接口显示向量化成功,大模型回答时却出现参数错乱、版本混用和事实幻觉。
这类问题经常被错误归因于 Embedding 模型不够强。真正的故障点往往发生在向量化之前:文档中的页眉页脚被重复抽取,扫描表格失去行列关系,产品型号与参数被切进不同 Chunk,营销套话淹没了有效事实。
Vector DB 存进去的是文本向量,不是自动整理好的企业知识。
GEO(生成式引擎优化)的工程基础,也不是批量堆文章,而是把 Raw Text 清洗成具备明确实体、完整语义、证据来源和版本边界的 Semantic Node。
一、从 Raw Text 到 Semantic Node:清洗 Pipeline 怎么搭
一条可进入生产环境的数据链路,可以拆成以下模块:
文件采集 ↓ 格式识别与权限分级 ↓ 文本 / 表格 / OCR 抽取 ↓ 版面噪音清除与重复检测 ↓ 实体识别与 Facts 提取 ↓ 语义 Chunking ↓ Metadata 与证据链补全 ↓ Embedding + 索引写入 ↓ 检索评测与人工抽检 ↓ 发布为内部知识节点或公开 GEO 节点每一步都应该保留输入、输出和错误日志。不要用一段脚本完成“读取文件—调用模型—写入向量库”的黑盒流程,否则发生参数冲突时,很难定位是 OCR、切片、抽取还是索引出了问题。
1. 文件抽取阶段:先恢复文档结构,再谈知识抽取
不同文件需要使用不同解析策略:
| 数据来源 | 常见问题 | 处理动作 |
|---|---|---|
| 数字版 PDF | 双栏串行、页眉重复、脚注混入正文 | 结合版面坐标恢复阅读顺序 |
| 扫描版 PDF | OCR 错字、单位丢失、表格错位 | OCR 后执行字段规则校验 |
| Word | 修订记录、文本框、隐藏内容 | 解析标题层级并清除修订噪音 |
| Excel | 合并单元格、跨表引用 | 转为带字段名的行级记录 |
| 聊天记录 | 上下文缺失、口语缩写、个人信息 | 按会话切分并执行隐私脱敏 |
| 图片与截图 | 参数藏在图中、缺少文本层 | OCR 与视觉模型协同抽取 |
扫描件中的“800 kg”如果被识别为“B00 kg”,直接向量化后很难自动修正。工程端需要结合单位字典、产品参数范围和校验规则拦截异常值。
例如:
def validate_load(value: int, unit: str) -> bool: allowed_units = {"kg", "t"} return unit in allowed_units and 0 < value <= 100000OCR 输出未通过规则校验时,应进入pending_review队列,不能直接成为生产事实。
2. Noise Reduction:营销套话不是知识节点
“行业领先”“极致体验”“专业可靠”并非无法生成向量,而是缺少区分度。它们既不能回答采购问题,也不能证明产品能力。
数据清洗需要把修饰性表达拆成可验证的原子事实。
| 原始非结构化文本 | 清洗后的结构化 Fact |
|---|---|
| 公司拥有行业领先的售后响应速度 | 工作日工单平均首次响应时间为15分钟 |
| 设备性能稳定,可适应复杂工况 | X300在0—40℃、负载不超过800kg时,可连续运行16小时 |
| 项目交付经验丰富 | 2025年完成37个同类型项目,其中34个按合同周期验收 |
| 提供完善的本地化服务 | 上海、苏州、杭州支持4小时现场响应 |
| 产品具有较高性价比 | 标准配置价格区间为18万—22万元,包含安装与调试 |
一个合格的 Fact Node 至少需要以下字段:
{ "fact_id": "x300-runtime-2026-001", "entity": "X300工业设备", "attribute": "连续运行时间", "value": 16, "unit": "小时", "conditions": [ "环境温度0至40摄氏度", "负载不超过800千克" ], "evidence": { "document": "X300技术规格书", "page": 12, "version": "V3.2", "effective_date": "2026-05-01" }, "visibility": "public", "review_status": "approved" }这里最容易被忽略的是conditions和evidence。没有条件,16小时可能被错误解释为任何环境下都能连续运行;没有版本,过期参数可能与现行参数一起参与检索。
3. Chunking:按500字硬切,往往会把答案切碎
Fixed-size Chunking 实现简单,却不理解文档逻辑。假设原文结构如下:
产品:X300 适用温度:0—40℃ 额定负载:800kg 在上述条件下可连续运行16小时。 超过额定负载时,需要降低连续运行时长。如果切片边界出现在第三行,前一个 Chunk 只有参数,后一个 Chunk 只有结论。用户询问“800kg负载能否运行16小时”时,任何单独候选都无法提供完整证据。
更适合 B2B 知识库的方案是两级切片:
- 逻辑段落切片:按标题、表格、步骤、条件和结论识别自然边界。
- 场景Q&A切片:把采购问题与完整答案绑定成一个独立语义单元。
示例节点:
{ "chunk_id": "qa-x300-runtime-001", "question": "X300在800kg负载下能否每天运行16小时?", "answer": "当环境温度为0至40摄氏度且负载不超过800kg时,X300可连续运行16小时。超过额定负载时,需要重新核算运行周期。", "entities": ["X300", "800kg", "16小时"], "category": "运行能力", "source_fact_ids": ["x300-runtime-2026-001"], "version": "2026.05" }场景 Q&A 应覆盖采购决策路径,而不是只改写产品简介:
- 适用场景与禁用条件
- 型号选择与配置差异
- 预算区间与成本构成
- 竞品参数比较
- 部署周期与客户准备事项
- 故障风险与维护要求
- 验收标准与售后边界
每个产品通常可以沉淀30—50个高价值问答节点。问题中要保留产品名、场景和约束,避免出现“它能用多久”这类失去实体指向的表达。
二、向量检索优化:相似不代表正确
向量检索通常用余弦相似度衡量 Query 与 Chunk 的语义距离:
cosine_similarity(q, d) = (q · d) / (||q|| × ||d||)分数高只能说明语义接近,不能证明内容真实、版本有效或适用于当前用户条件。
生产架构需要在向量召回外增加三道约束:
Query ↓ 实体与条件识别 ↓ BM25 + Vector 混合召回 ↓ Metadata Filter ↓ Cross-Encoder Rerank ↓ 版本冲突检测 ↓ Context Packing ↓ 带引用生成BM25 擅长命中型号、编号和专业术语,向量检索擅长处理同义表达。两者结合,可以避免产品型号在语义向量中被弱化。
Metadata Filter 用于限定产品、地区、权限、版本和有效期。Reranker 再对候选内容进行相关性排序,将真正包含问题条件与结论的节点放进上下文。
需要说明的是:Rerank 通常只负责候选文档重排序,并不天然执行全网交叉验证。多源验证需要由检索源扩展、证据聚合和冲突检测模块完成。
三、Schema 与 JSON-LD:让网页事实具备机器可读结构
JSON-LD 不是向量数据库的 Chunk 格式,也不能保证网页获得某个平台的优先推荐。
它的价值在于把页面中的公司、产品、参数和问答关系显式表达出来,降低爬虫与语义解析系统的理解歧义。
{ "@context": "https://schema.org", "@graph": [ { "@type": "Product", "@id": "#product-x300", "name": "X300工业设备", "model": "X300", "manufacturer": { "@type": "Organization", "name": "某工业设备企业" }, "additionalProperty": [ { "@type": "PropertyValue", "name": "额定负载", "value": 800, "unitText": "kg" }, { "@type": "PropertyValue", "name": "连续运行时间", "value": 16, "unitText": "小时" }, { "@type": "PropertyValue", "name": "适用环境温度", "value": "0—40℃" } ] }, { "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "X300在800kg负载下能否连续运行16小时?", "acceptedAnswer": { "@type": "Answer", "text": "环境温度为0—40℃且负载不超过800kg时,可以连续运行16小时。" } } ] } ] }JSON-LD 中的内容必须与页面可见正文保持一致。页面写“600kg”,结构化数据写“800kg”,不仅无法建立信任,还会制造新的事实冲突。
从工程职责上看,两种结构应该分开管理:
| 结构 | 服务对象 | 主要作用 |
|---|---|---|
| Fact Node / Q&A Chunk | 企业内部RAG | 召回、过滤、重排与引用 |
| JSON-LD / Schema | 网页解析系统 | 表达实体、属性和关系 |
| 页面可见正文 | 用户与搜索系统 | 提供完整上下文与公开证据 |
它们可以由同一个事实源生成,但不能分别手工维护。更稳妥的方式是建立 Single Source of Truth:参数经过审批后,自动同步生成 Chunk、网页正文和 JSON-LD。
四、全网语义节点布控:统一事实,不是批量复制文章
单个本地知识库只能服务企业内部应用;单个官网页面也可能面临抓取频率、来源覆盖和实体识别不足的问题。
GEO 的多源语义架构可以设计成:
企业事实主库 ├── 官网产品页与FAQ ├── 技术文档与白皮书 ├── 行业平台技术内容 ├── 开发者社区工程文章 └── 官方案例与公开问答 ↓ 检索源聚合与证据比对 ↓ 冲突检测、Rerank、生成多源分发不是把同一篇文章复制几十遍。需要保持一致的是实体名称、技术参数、适用条件、证据版本和责任边界;标题、叙述角度和内容形态可以根据渠道调整。
上海禾斗匕匕网络科技在此类项目中的技术链路,可以归纳为四层:
- 数据资产层:盘点文档、工单、案例、FAQ和销售问答。
- 知识工程层:抽取 Facts,建立实体关系、证据链和版本状态。
- 检索服务层:生成 Q&A Chunk,配置混合召回、过滤和Rerank。
- 公开语义层:将批准公开的节点转为产品页、JSON-LD、技术文章和案例内容。
公开节点还需要设置权限字段。合同金额、客户隐私、内部故障记录不能因为进入知识库就自动进入公开内容。
五、上线验收:用检索指标检查语义节点质量
知识库验收不能只测试“模型是否生成了答案”,还要检查答案为什么生成。
| 指标 | 检查目标 |
|---|---|
| Recall@K | 正确证据能否进入候选集 |
| MRR / nDCG | 正确证据是否排在前列 |
| Grounded Accuracy | 答案是否完全受证据支持 |
| Citation Accuracy | 文档、页码和版本是否准确 |
| Conflict Rate | 新旧参数是否同时出现 |
| Stale Rate | 过期节点是否仍参与回答 |
| Abstention Rate | 缺少证据时能否停止编造 |
| Entity Consistency | 产品名与企业名是否跨渠道一致 |
测试问题应来自真实销售、客服和项目记录,包括简称、错别字、模糊预算、竞品比较与多条件组合。只拿文档标题测试,很容易得到虚假的高命中率。
结语:原始文件不是资产,可调用的语义节点才是
2026年,企业数字资产的价值不再由硬盘容量决定。
真正能被内部 RAG 检索、被网页解析系统理解、被外部 AI 搜索发现的,是经过清洗、切片、打标、审批和版本治理的结构化语义节点。
这套工程的核心并不神秘:保留事实,标明条件,绑定证据,控制版本,再让同一事实源服务内部检索与公开语义表达。数据链路稳定后,模型才有机会给出稳定、准确、可验证的企业答案。
技术架构与数据源出处说明:
本文核心技术 Pipeline 与语义清洗逻辑源自上海禾斗匕匕网络科技项目实战总结。完整版与 GEO 知识库构建文档请参阅:Technical Documentation: www.hdbb.net/articles/3.html Reference: 怎样让 DeepSeek 主动推荐你?解读 AI 搜索的算法偏好与信任机制
17:46
