在风电、光伏等新能源项目中,标准规范文档(如 GB/T、DL/T、NB/T、企业技术规范)往往具有以下特点:

  • 篇幅长、层级多:章、节、条、款结构复杂;
  • 语句严格但偏抽象:检索时很难直接命中关键条款;
  • 上下文依赖强:单条标准离开上下文经常难以正确理解。

如果把整本标准直接丢进向量库,会带来两个问题:

  1. 切片粒度失衡:有的段太大不利于匹配,有的段太小丢失上下文;
  2. 检索语义模糊:缺乏结构化元信息(关键词、摘要、问题),RAG 难以高质量回答“具体条款+工程场景”。

为解决上述问题,本方案设计了一套专门面向 新能源标准规范 的 Markdown 切片与标记规范,配合 Dify 知识库使用,实现:

  • 章/节级别的 父段(PARENT) 作为上下文容器;
  • 条款/语义单元级别的 子段(CHILD) 作为检索最小单元;
  • 每个父段配套结构化的 META(关键词 + 摘要 + 问题),强化检索与生成质量。

整体架构概览

切片方案的核心思想是:在原 Markdown 文本中不直接改动正文内容, 而是通过 HTML 注释标记 + JSON 切片计划(plan) 来实现可编程的插入与后续解析。

整体组件如下:

  1. 切片规划 Prompt(你提供的 Prompt)

    接收原始 Markdown

    输出一份 JSON 格式的 plan,描述父段、子段与插入位置

  2. PARENT / CHILD 标记体系

    通过 HTML 注释在原文中插入父段/子段标记

    提供 id、title、role、tokens 等结构化信息

  3. META XML 元信息块

    每个父段恰好一个 role="META" 的 CHILD

    承载关键词、摘要、典型问句,专为新能源标准 RAG 优化

  4. 锚点与插入策略

    通过标题、段落、行号估计等信息确定安全插入位置

    避免破坏 YAML front-matter、代码块、公式、表格等结构

  5. 长度与质量控制

    父段 800–2000 tokens;子段 100–300 tokens

    保证覆盖性、不重叠、顺序单调

    通过 violations 字段报告不可避免的偏差

PARENT / CHILD 段模型

PARENT:章/节级父段

父段用于承载一组语义紧密相关的内容,典型对应,比如:

  • 标准中的 “第 3 章 术语和定义”;
  • “5.2 风力发电场选址原则”;
  • “7.3 光伏组件安装及倾角要求”。

父段标记示例:

<!--PARENT id="p005" title="5.2 风力发电场选址原则" tokens="1560" -->

设计约束:

  • 主题粒度:章、节或较大的概念块(自然段落群);
  • 长度控制:目标 800–2000 tokens,允许 ±15% 浮动;
  • 作用范围:从 PARENT 标记出现的位置,一直到下一个 PARENT 或文档结尾。

在新能源标准场景中,一个 PARENT 通常涵盖完备的一组设计原则或限制条件,例如:

  • 风机机位与居民区、输电线路、机场的安全距离;
  • 光伏方阵的安装倾角、间距与遮挡控制;
  • 并网点选择与电能质量要求。

CHILD:细粒度子段

子段是在父段内部进一步做语义拆分的单元,分为两类:

  • role="CONTENT":具体条款内容、技术要求、公式说明等;
  • role="META":对应父段的结构化元信息。

CONTENT 子段示例:

<!--CHILD id="c010" parent="p005" role="CONTENT" tokens="190" -->

在新能源标准中,一个 CONTENT 子段可以对应:

  • 某一条具体规范(如“风机轮毂中心高度处年平均风速不应低于 6 m/s”);
  • 一组互相关联的条款(如“机位最小间距 + 尾流影响说明”);
  • 一个与工程实践高度相关的说明段落。

每个父段要求:

  • 至少 1 个 role="CONTENT" 子段(通常多个,覆盖主要内容);
  • 恰好 1 个 role="META" 子段,专门放 META。

META 元信息设计

每个父段都会有一个 role="META" 的 CHILD,用于插入如下 XML 块:

<META parent_id="{pid}">
  <KEYWORDS>
    <!-- 5–12 个,统一小写,用逗号分隔 -->
    风电机位布局, 风资源评估, 光伏倾角, 并网消纳, 年利用小时
  </KEYWORDS>
  <SUMMARY lang="zh" maxlen="120字">
    用通俗技术中文,概括该父段要点与结论,避免营销语与虚词。
  </SUMMARY>
  <QUESTIONS>
    <Q>围绕该父段内容提出 3–5 个高价值检索/复述问题</Q>
  </QUESTIONS>
</META>

在新能源标准规范 RAG 中,三个字段的作用分别是:

KEYWORDS:新能源语境下的核心检索词

统一小写,半角逗号分隔;

尽量选取可复用的工程检索标签,如:

  • 风电:风资源评估, 风切变指数, 风机轮毂高度, 机位布局, 并网点, 尾流效应
  • 光伏:组件倾角, 单轴跟踪, 辐照度, 组件串并联, 汇流箱, 逆变器效率
  • 通用:并网消纳, 年利用小时, 接入系统方案, 输电线路, 土建设计荷载

KEYWORDS 在 Dify 中可映射为额外的检索字段(如 metadata.tags),用于:

  • 提升召回与过滤能力;
  • 支撑“按主题/子领域筛选标准条款”的功能。

SUMMARY:标准条款的通俗技术摘要

不超过 120 字;

使用“工程师语气”进行说明,而不是法规原文的硬翻;

例如:

本节规定了风电场选址需要满足的基本条件,包括年平均风速下限、与居民区及重要设施的安全距离、与现有电网的接入条件等,为后续机位排布和接入系统设计提供边界约束。

在 RAG 中,SUMMARY 可以用作:

  1. 轻量级候选段快速预览;
  2. 重排序特征之一;
  3. 回答“总结一下该标准条款主要内容”的问题时的参考。

QUESTIONS:场景化的高价值问句

围绕该父段提出 3–5 个问题,例如:

  • “如果……,本节有哪些约束/要求?”
  • “在什么条件下可以/不可以……?”
  • “本节对某一设计参数给出了怎样的范围或推荐值?”

  • 示例(针对风电场选址章节):

    <QUESTIONS>
      <Q>风电场选址时,对年平均风速有哪些最低要求?</Q>
      <Q>规程如何限定风机与居民区、道路等敏感目标的最小安全距离?</Q>
      <Q>在复杂地形条件下,选址需要特别关注哪些附加要求?</Q>
      <Q>本节对并网点选择和接入系统条件有哪些约束?</Q>
    </QUESTIONS>
    

这些问句可以直接作为:

  • Dify 检索的“扩展查询 / 典型 Query 模板”;
  • 在问答不充分时,用于 Re-RAG 或多轮追问引导。

锚点与安全插入策略

为了让后续程序能够稳定地把 PARENT/CHILD 标记插回原文,切片计划中为每一个 PARENT/CHILD 提供了 anchor 信息:

  • anchor.type ∈ ["heading","after_heading","paragraph","hr"]
  • anchor.heading_text / heading_level:基于标题定位;
  • anchor.before_line:估计原文行号;
  • anchor.pre / anchor.post:上下文 30–80 字符,用于安全匹配。

同时,明确禁止在以下区域内插入标记:

  • YAML front-matter (--- 块);
  • fenced code 块(``` / ~~~);
  • 行内/块级公式($...$ / $$...$$);
  • HTML 表格/注释;
  • 链接定义区 ([id]: url);
  • 图片或图题行;
  • 列表项中段。

对于新能源标准文档,这一点尤为重要:大量公式、表格(如风速分布、荷载系数、风区划分)、示意图说明,若被切断会严重影响可读性与解析,因此要求:

  • 优先在标题行之后的首个正文段落之前插入 PARENT 标记
  • 子段标记只放在自然段和条款边界,不打断公式和表格。

Token 估算与切片长度控制

为便于在 Dify 及向量库中控制上下文长度,本方案对 tokens 做了基础约束:

  • PARENT:目标 800–2000 tokens(±15%);
  • CHILD:目标 100–300 tokens(±20%)。

token 估算方法可采用启发式规则:

  • 中文:约 1–1.5 字 ≈ 1 token;
  • 英文/数字:约 4 字符 ≈ 1 token。

stats 字段中记录所用方法,例如:

"stats": {
  "parents_count": 12,
  "children_count": 57,
  "token_estimation_method": "heuristic",
  "max_parent_tokens": 2000,
  "max_child_tokens": 300
}

当标准某章节特别长(例如一个大章节下的小节只有标题无内容、或必须保证整体语义连贯时),允许越界,同时在 violations 中明示原因和建议。

质量约束与校验机制

为保证切片质量,方案规定:

  1. 顺序单调

同一父段内的 CHILD 按文中实际出现顺序排列;

子段范围不重叠、不穿越父段边界。

  1. 覆盖关键内容

CONTENT 子段需覆盖父段的关键条款与解释;

允许略去无关重复描述或附带说明。

  1. META 完备唯一

每个 PARENT 恰好 1 个 META CHILD;

META 内容要求完整的 KEYWORDS / SUMMARY / QUESTIONS。

  1. 违规显式标注

如果任何约束无法满足(如父段过长、TOKEN 估算偏差过大、无法安全找到锚点),在 violations 中写明 targettypedetailsuggestion,方便后续人工审查或规则迭代。

与 Dify 知识库的集成方式

在 Dify 中,我们通常会为每条“文档片段”配置如下字段:

  • content:存放 CHILD 的正文内容;
  • parent_title / parent_id:存放父段信息;
  • keywords:解析自 META.KEYWORDS;
  • summary:解析自 META.SUMMARY;
  • questions:解析自 META.QUESTIONS 中的若干 <Q>

典型流程:

  1. 原始标准 → Markdown:将 PDF / Word 转为结构清晰的 Markdown(保留标题层级、列表和表格)。
  2. 调用切片规划助手(Prompt)

输入原始 Markdown;

输出 JSON plan

  1. 根据 plan 回写标记

程序遍历 insertions 数组,在指定位置插入 PARENT/CHILD 标记和 META XML;

  1. 解析带标记的 Markdown

按 HTML 注释切分父/子段;

将各 CHILD 片段转换为 Dify 知识库的单条文档,并映射元信息到 metadata。

  1. 索引与检索

在 Dify 配置中,设置 keywordsquestions 参与检索或重排序;

在回答用户问题时,将父段 SUMMARY 与对应 CHILD content 作为组合上下文喂给模型。

新能源标准规范场景中的实践建议

  1. 优先对“工程决策有直接影响”的章节精细切片

风电场/光伏电站选址、公用工程与接入系统、电气主接线、安全与保护、土建设计荷载等;

对“术语和定义”可采用稍粗粒度父段,主要作为辅助解释。

  1. KEYWORDS 尽量贴近实际检索习惯

多使用工程师在日常沟通和报告中会使用的词,而不仅是标准中的严谨表述;

例如:风速廓线风切变指数 α年等效满负荷小时N-1 校验 等。

  1. QUESTIONS 中融入典型业务场景

如“若某风电场年平均风速为 5.3 m/s,是否满足本标准要求?”

“设计单轴跟踪电站时,组件倾角和行间距需要满足哪些指标?”

  1. 控制 SUMMARY 的“温度”与专业度

既要避免“法规原文式”生硬表述,也要避免过于口语化;

推荐采用“报告风格”的说明:客观、精炼、指向工程决策。

小结

本方案通过 PARENT/CHILD 层级切片 + META 元信息 + 锚点安全插入策略,为新能源标准规范构建了一套结构化、可编程、可解释的 RAG 切片机制。

对 Dify 而言,收益主要体现在:

  • 检索更懂标准结构:可以按章节、主题、关键词进行精确召回;
  • 回答更贴近工程实践:通过 SUMMARY 和 QUESTIONS,把标准条文与真实场景勾连起来;
  • 维护更可控:通过 JSON plan + HTML 注释,保持文档与切片规则的解耦,便于后续版本迭代。

将这篇说明文放入 Dify 知识库,可以作为团队内部对“新能源标准规范 RAG 切片方案”的统一说明文档, 同时也可以配合实际切片示例,一起作为“系统使用指南”的核心组成部分。

附录:完整的 Prompt

你是 Markdown 切片规划助手。请读取我提供的 Markdown 文本,生成一份“插入计划(plan)”,用于后续程序把分段标记与领域元信息插回原文。不要直接修改原文内容。

# A. 切片与标记规范
1) 分段标记采用 HTML 注释分隔符,且必须携带元数据(避免冲突):
   - 父级起始标记:<!--PARENT id="{pid}" title="{parent_title}" tokens="{est_tokens}" -->
   - 子级起始标记:<!--CHILD id="{cid}" parent="{pid}" role="{role}" tokens="{est_tokens}" -->
     - role ∈ {"CONTENT","META"};其中 META 子段用于承载 XML 的 KEYWORDS/SUMMARY/QUESTIONS。
   - 语义:标记为**段首分隔符**,其作用范围直至下一个 PARENT/CHILD 标记或文档结尾。
   - id 要求全局唯一(建议 "p001", "c001" 递增或 UUID)。

2) 父段(PARENT)
   - 主题粒度:章/节/复杂概念说明等“自然段落群”。
   - 目标长度:800–2000 tokens;允许 ±15% 浮动;若受标题边界限制,可接受更大偏差,但需在 "violations" 里报告原因。

3) 子段(CHILD)
   - 目标长度:100–300 tokens;允许 ±20% 浮动。
   - 每个父段下:
     - 至少 1 个 role="CONTENT" 子段(可多个,覆盖主要内容,**不重叠、不穿越父段范围**)。
     - 恰好 1 个 role="META" 子段,承载下述 XML(置于该子段后立刻插入的文本内容):
       ```
       <DIFY_META parent_id="{pid}">
         <KEYWORDS>
           <!-- 5–12 个,面向新能源(风电、光伏),统一小写,用逗号分隔,去除停用词与重复 -->
           风电机位布局, 风资源评估, 光伏倾角, 并网消纳, 年利用小时
         </KEYWORDS>
         <SUMMARY lang="zh" maxlen="120字">用通俗技术中文,概括该父段要点与结论,避免营销语与虚词。</SUMMARY>
         <QUESTIONS>
           <Q>围绕该父段内容提出 3–5 个高价值检索/复述问题</Q>
         </QUESTIONS>
       </DIFY_META>
       ```
     - META 子段本身也算一个 CHILD。

# B. 锚点与安全插入点
为保证我用代码能稳定插入,请为每个 PARENT/CHILD 提供“锚点”:
- anchor.type:["heading","after_heading","paragraph","hr"] 之一
- anchor.heading_text / heading_level:若基于标题定位必须给出
- anchor.before_line:基于原文的**行号估计**(从 1 开始);若无法可靠给出,填 null
- anchor.pre / anchor.post:各 30–80 字符的邻近上下文片段(不能跨越代码围栏/公式块)
- **禁止插入**到以下区域内部或中间:YAML front-matter、fenced code (```或 ~~~)、行内/块级公式 ($ ... $ / $$ ... $$)、HTML 表格/注释、链接定义区(`[id]: url`)、图片/图题行、列表项中段。
- 优先在**标题行之后的首个正文段落之前**放置该标题对应父段的 PARENT 标记;子段在父段范围内按语义段首放置。

# C. Token 估算与计数偏差
- est_tokens 请尽量接近 cl100k_base 的估算;若无法精算,按中文≈1.5字/词≈1 token、英文≈4字符/1 token 的经验给出估算值,并在 "stats" 里说明方法。

# D. 质量约束
- 顺序单调:同一父段内的子段按文中出现顺序排列,范围不重叠。
- 覆盖性:子段应覆盖父段关键信息;无需覆盖所有字句。
- 每个父段至少含 1 个 CONTENT 子段 + 1 个 META 子段。
- 若任何规则无法完全满足,写入 "violations"(含 pid/cid、原因、建议修正)。

# E. 输出格式(仅输出以下 JSON;不要多余文本)
{
  "doc_id": "<可留空或我提供>",
  "parents": [
    {
      "id": "p001",
      "title": "示例父段标题/主题",
      "est_tokens": 1280,
      "anchor": { "type": "heading", "heading_text": "1 概述", "heading_level": 1, "before_line": 42, "pre": "...", "post": "..." },
      "children": ["c001","c002","c003"]  // 包含 META 子段 id
    }
  ],
  "children": [
    { "id": "c001", "parent_id": "p001", "role": "CONTENT", "est_tokens": 180, "anchor": { ... } },
    { "id": "c003", "parent_id": "p001", "role": "META", "est_tokens": 120, "anchor": { ... },
      "content_xml": "<DIFY_META parent_id=\"p001\">...</DIFY_META>"
    }
  ],
  "markers": {
    "parent": "<!--PARENT id=\"{id}\" title=\"{title}\" tokens=\"{est_tokens}\" -->",
    "child": "<!--CHILD id=\"{id}\" parent=\"{parent_id}\" role=\"{role}\" tokens=\"{est_tokens}\" -->"
  },
  "insertions": [
    // 便于我直接 loop 按行插入:按文中先后顺序罗列
    { "at_line": 43, "marker": "<!--PARENT id=\"p001\" title=\"示例父段标题/主题\" tokens=\"1280\" -->" },
    { "at_line": 56, "marker": "<!--CHILD id=\"c001\" parent=\"p001\" role=\"CONTENT\" tokens=\"180\" -->" },
    { "at_line": 120, "marker": "<!--CHILD id=\"c003\" parent=\"p001\" role=\"META\" tokens=\"120\" -->",
      "follow_text": "<DIFY_META parent_id=\"p001\">...</DIFY_META>"
    }
  ],
  "stats": {
    "parents_count": 5,
    "children_count": 17,
    "token_estimation_method": "heuristic|tiktoken-like",
    "max_parent_tokens": 2000,
    "max_child_tokens": 300
  },
  "violations": [
    // 若无违规返回空数组
    { "target": "p004", "type": "parent_too_long", "detail": "受标题边界影响 2450 tokens", "suggestion": "允许越界或在小节前加子父组合" }
  ]
}

# F. 语言与风格
- 所有自然语言输出用中文(简体)。
- KEYWORDS 统一小写、用半角逗号分隔;尽量选择可复用的“检索词”(风电/光伏/GIS/并网/消纳/资源评估/机位/BOP等)。
- SUMMARY 控制在 120 字以内,避免主观形容。

仅返回上述 JSON(置于一个代码块中),不要包含其它说明文字。