风电报告生成模块实践:Prompt 模板、AI 润色与内容校验
本文记录了我在实习期间参与风电场数据分析与报告生成工具开发的一次实践。文中对公司名称、业务细节和真实数据进行了脱敏,重点介绍报告生成模块的设计思路、遇到的问题以及后续可以改进的方向。
项目背景
2026 年 7 月 27 日至 7 月 28 日,我主要参与了一款风电场数据分析工具的报告生成模块开发。
该工具的前三个阶段主要负责处理风电场原始 SCADA 数据,包括数据预处理、分析计算以及图表生成。第四个阶段则基于前面得到的数据和图表,进一步生成风电场分析报告。
第四阶段被拆分为 A、B 两部分,我参与了这两个部分的开发。本文先记录 A 部分的实现过程。A 部分的主要作用,是让用户配置报告的分析对象、分析方向和提示词模板,并将这些信息整理成后续 AI 分析可以使用的指令。
A 部分完成了什么
1. 读取风电场的基础信息
系统能够识别本次分析任务中的基础信息,包括:
- 风电场名称;
- 机组型号;
- 机组数量;
- 分析时间范围;
- 装机容量等。
这些信息会作为报告生成时的基础上下文,减少用户重复输入,也能让后续生成的内容与当前风电场保持一致。
2. 选择报告面向的对象
用户可以选择报告的阅读对象。不同的阅读对象会影响报告的表达方式、专业程度和内容侧重点。
例如,同一组分析结果在面向不同读者时,可能需要采用不同的术语密度、解释深度和结论表达方式。因此,报告对象不仅会影响措辞,也会影响 AI 对内容的组织方式。
3. 选择分析方向
用户还可以选择本次报告的分析方向。
不同的分析方向会影响后续 Subagents 的工作方式,包括需要检索的知识库内容、重点关注的数据指标,以及最终报告中需要展开分析的问题。
换句话说,这一步并不是简单地修改报告标题,而是在限定后续智能体的分析范围,避免生成内容偏离当前任务。
4. 选择 Prompt 模板
系统提供了可选的 Prompt 模板,用于确定报告的主要任务类型。目前涉及的模板包括:
- 技改前后性能对比;
- 发电量计算与分析;
- 机组异常检测。
用户选中模板后,对应内容会自动插入输入框。用户可以在模板基础上继续补充当前风电场的实际情况、已知问题和重点关注内容。
这里的 User Prompt 主要用于描述本次任务的具体需求,而不是承担所有全局规则。这样既能复用模板,也能给用户保留一定的自由编辑空间。
5. 增加 AI 润色与撤销功能
用户完成输入后,可以使用 AI 润色功能,对输入框中的自然语言描述进行语序调整、歧义消除和表达补充。
润色过程中,日期、机组型号、功率、角度以及其他具体数值属于不可随意修改的信息。AI 只能优化表达,不能改变这些事实性数据。
同时,界面中还提供了撤销功能。当用户认为润色结果不准确、表达不符合预期,或者 AI 改变了原意时,可以恢复到润色前的版本。
为什么要这样设计
为什么需要单独提供 AI 润色功能
实际使用工具的用户不一定熟悉 Prompt 编写,也不一定能够把现场情况准确地转换成 AI 容易理解的语言。
例如,一段描述可能包含省略、语序混乱或指代不清等问题。人能够结合经验理解,但 AI 可能因此错误判断用户的真实意图。AI 润色的作用,就是在不改变事实的前提下,把用户的描述整理得更完整、更明确。
因此,这里的 AI 润色并不是替用户编造分析内容,而是充当自然语言输入与后续分析模块之间的整理层。
为什么需要撤销功能
大模型生成的结果并不一定始终可靠。即使 Prompt 中明确要求“不修改真实数据”,模型仍然可能出现过度改写、遗漏信息或改变原意的情况。
因此,不能只提供“润色”按钮,还需要保留润色前的原始内容,让用户能够进行对比并随时撤销。对于涉及真实业务数据的工具来说,可回退比单纯追求生成效果更重要。
System Prompt 和 User Prompt 应该如何划分
在最初的设计中,我将报告对象和分析方向作为 System Prompt 的一部分,因为它们会持续约束后续的分析和写作过程;用户补充的现场情况和具体需求则作为 User Prompt 传入。
不过,更准确地说,System Prompt 并不只是“优先级更高的 User Prompt”。它更适合承载模型角色、全局规则、输出边界和长期约束。报告对象和分析方向虽然会影响整个任务,但它们本质上仍然是每次任务动态变化的配置参数。
因此,更稳妥的实现方式是:
- 将模型角色、禁止修改真实数据等稳定规则放在 System Prompt 中;
- 将报告对象、分析方向等动态配置整理为结构化指令;
- 将用户输入的现场情况、关注问题和补充说明放在 User Prompt 中;
- 在调用模型前,由程序统一组装这些信息。
这样既能保持指令层级清晰,也能避免把所有内容都堆进 System Prompt。
开发过程中踩过的坑
内容审查规则过于严格
为了防止 AI 润色时修改真实信息,我最初增加了一层内容审查机制。润色完成后,程序会检查 AI 是否修改了不允许修改的内容。
但初版审查规则过于严格。系统不仅检查日期、型号和数值,还会检查小标题数量以及“好”“差”“异常”等词语是否发生变化。
这导致了大量误判。例如:
- 将“好”改成“良好”;
- 将“状态异常”改成“状态存在异常”;
- 调整小标题的表达方式;
- 在不改变原意的情况下重新组织句子。
这些修改本身并没有改变事实,但因为字符不完全一致,系统仍然会判定 AI 修改了不可修改的内容,最终拒绝返回润色结果。
这个问题的本质,是把“事实一致性校验”错误地做成了“全文字符一致性校验”。
如果重新设计,我会怎么改
1. 区分可修改内容和不可修改内容
不应该直接把整个输入框交给 AI 自由改写,再对全文进行严格比对。更合理的方法,是先把内容拆分成两类:
- 不可修改字段:日期、型号、功率、角度、容量、数量、单位等事实性信息;
- 可修改字段:现场情况描述、分析需求、补充说明和自然语言表达。
AI 只负责润色可修改字段,不直接处理结构化的事实数据。
2. 使用结构化数据保存关键事实
可以将关键数据保存为 JSON 或表单字段,而不是全部混在一段自然语言中。例如:
{ "wind_farm_name": "某风电场", "turbine_model": "某型号", "installed_capacity": "100 MW", "analysis_period": "2026-01-01 至 2026-06-30", "user_description": "需要润色的现场情况描述"}调用 AI 时,只允许模型修改 user_description,其他字段由程序直接控制。这样可以从源头上降低真实数据被篡改的风险。
3. 只校验真正需要保护的字段
润色完成后,可以提取并比较日期、型号、数值和单位,而不是逐字符比较整段文本。
对于自然语言部分,只需要判断语义是否发生明显偏移,不应因为同义词替换或语序调整就直接判定失败。
4. 保留修改记录
除了撤销功能,还可以展示润色前后的差异,让用户清楚看到 AI 修改了哪些内容。这样比只返回一段新文本更透明,也更适合真实业务场景。
5. 明确不同 Prompt 的职责
后续可以把 Prompt 拆分为多个层次:
- 全局规则:定义模型角色、数据保护规则和输出格式;
- 任务配置:定义报告对象、分析方向和模板类型;
- 用户输入:提供现场情况、关注问题和补充说明;
- 数据上下文:提供前面模块生成的结构化结果和图表信息。
这种方式比把所有要求拼接成一段长 Prompt 更容易维护,也方便后续增加新的报告模板。
这次实践学到了什么
A 部分本身的代码和页面逻辑并不复杂,但在实际实现过程中,我发现,报告生成模块并不是“写一段 Prompt 然后调用模型”这么简单。
真正需要考虑的问题包括:
- 哪些信息应该由用户输入;
- 哪些信息应该由程序自动读取;
- 哪些内容允许 AI 修改;
- 哪些字段必须保持完全一致;
- System Prompt、任务配置和 User Prompt 应该如何划分;
- AI 输出出错后,用户能否检查、撤销和恢复。
这次最重要的收获,是认识到 Prompt Engineering 不只是调整措辞,还包括数据结构、指令分层、内容校验和交互设计。对于需要处理真实业务数据的 AI 工具来说,可控性、可验证性和可回退性,与生成效果同样重要。
总结
这两天完成的 A 部分,主要建立了报告生成前的配置与 Prompt 组装流程,包括基础信息读取、报告对象选择、分析方向选择、模板选择、AI 润色和撤销功能。
虽然目前还是一个 Demo,但它已经暴露出真实业务中非常典型的问题:自然语言可以灵活修改,事实数据却必须受到严格保护。后续如果继续完善,我会优先将事实数据与自然语言描述分离,并使用结构化字段、差异对比和更精确的校验机制,提高整个报告生成流程的可靠性。
Comments
Quiet notes for this article.