新能源标准规范 RAG 切片方案
在风电、光伏等新能源项目中,标准规范文档(如 GB/T、DL/T、NB/T、企业技术规范)往往具有以下特点:
- 篇幅长、层级多:章、节、条、款结构复杂;
- 语句严格但偏抽象:检索时很难直接命中关键条款;
- 上下文依赖强:单条标准离开上下文经常难以正确理解。
如果把整本标准直接丢进向量库,会带来两个问题:
- 切片粒度失衡:有的段太大不利于匹配,有的段太小丢失上下文;
- 检索语义模糊:缺乏结构化元信息(关键词、摘要、问题),RAG 难以高质量回答“具体条款+工程场景”。
为解决上述问题,本方案设计了一套专门面向 新能源标准规范 的 Markdown 切片与标记规范,配合 Dify 知识库使用,实现:
- 章/节级别的 父段(PARENT) 作为上下文容器;
- 条款/语义单元级别的 子段(CHILD) 作为检索最小单元;
- 每个父段配套结构化的 META(关键词 + 摘要 + 问题),强化检索与生成质量。
整体架构概览
切片方案的核心思想是:在原 Markdown 文本中不直接改动正文内容, 而是通过 HTML 注释标记 + JSON 切片计划(plan) 来实现可编程的插入与后续解析。
整体组件如下:
-
切片规划 Prompt(你提供的 Prompt)
接收原始 Markdown
输出一份 JSON 格式的
plan,描述父段、子段与插入位置 -
PARENT / CHILD 标记体系
通过 HTML 注释在原文中插入父段/子段标记
提供 id、title、role、tokens 等结构化信息
-
META XML 元信息块
每个父段恰好一个
role="META"的 CHILD承载关键词、摘要、典型问句,专为新能源标准 RAG 优化
-
锚点与插入策略
通过标题、段落、行号估计等信息确定安全插入位置
避免破坏 YAML front-matter、代码块、公式、表格等结构
-
长度与质量控制
父段 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 可以用作:
- 轻量级候选段快速预览;
- 重排序特征之一;
- 回答“总结一下该标准条款主要内容”的问题时的参考。
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 中明示原因和建议。
质量约束与校验机制
为保证切片质量,方案规定:
- 顺序单调
同一父段内的 CHILD 按文中实际出现顺序排列;
子段范围不重叠、不穿越父段边界。
- 覆盖关键内容
CONTENT 子段需覆盖父段的关键条款与解释;
允许略去无关重复描述或附带说明。
- META 完备唯一
每个 PARENT 恰好 1 个 META CHILD;
META 内容要求完整的 KEYWORDS / SUMMARY / QUESTIONS。
- 违规显式标注
如果任何约束无法满足(如父段过长、TOKEN 估算偏差过大、无法安全找到锚点),在 violations 中写明 target、type、detail 和 suggestion,方便后续人工审查或规则迭代。
与 Dify 知识库的集成方式
在 Dify 中,我们通常会为每条“文档片段”配置如下字段:
content:存放 CHILD 的正文内容;parent_title / parent_id:存放父段信息;keywords:解析自 META.KEYWORDS;summary:解析自 META.SUMMARY;questions:解析自 META.QUESTIONS 中的若干<Q>。
典型流程:
- 原始标准 → Markdown:将 PDF / Word 转为结构清晰的 Markdown(保留标题层级、列表和表格)。
- 调用切片规划助手(Prompt):
输入原始 Markdown;
输出 JSON plan。
- 根据 plan 回写标记:
程序遍历 insertions 数组,在指定位置插入 PARENT/CHILD 标记和 META XML;
- 解析带标记的 Markdown:
按 HTML 注释切分父/子段;
将各 CHILD 片段转换为 Dify 知识库的单条文档,并映射元信息到 metadata。
- 索引与检索:
在 Dify 配置中,设置 keywords 与 questions 参与检索或重排序;
在回答用户问题时,将父段 SUMMARY 与对应 CHILD content 作为组合上下文喂给模型。
新能源标准规范场景中的实践建议
- 优先对“工程决策有直接影响”的章节精细切片
风电场/光伏电站选址、公用工程与接入系统、电气主接线、安全与保护、土建设计荷载等;
对“术语和定义”可采用稍粗粒度父段,主要作为辅助解释。
- KEYWORDS 尽量贴近实际检索习惯
多使用工程师在日常沟通和报告中会使用的词,而不仅是标准中的严谨表述;
例如:风速廓线、风切变指数 α、年等效满负荷小时、N-1 校验 等。
- QUESTIONS 中融入典型业务场景
如“若某风电场年平均风速为 5.3 m/s,是否满足本标准要求?”
“设计单轴跟踪电站时,组件倾角和行间距需要满足哪些指标?”
- 控制 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(置于一个代码块中),不要包含其它说明文字。