Builds an ECN-to-Markdown LLMs Pipeline
Recently, manufacturers have started to use more structured Markdown formats, for creating Engineering Change Notices (ECNs). This has led to the potential for ECN automation with large language models (LLMs) as LLMs can be used in a pipeline to convert unstructured data into a structured format.
First, we prepare an ECN markdown template with placeholders like {title}
and {date}
. We can use LLMs to extract the information and put it in the placeholders.
ecn_template = r"""
<div style="margin-top: 10%;margin-bottom: 5%;text-align: center;font-size: 4rem;">产品变更通知</div>
<div style="margin-top: 5%;margin-bottom: 5%;text-align: center;font-size: 2rem;">{title}</div>
**文档编号**:
**重要级别**:一般 /重要
**适用区域**:国内/国际/All
**生效日期**:{date}
**涉及ECR编号**:{ECR_number}
## 变更信息描述
{content}
## 变更措施
{change_action}
## 注意事项
{important_note}
"""
Then, we can generate an ECN template to test the program.
document = """
变更背景与原因
- 客诉单据:CS-2025-0103、CS-2025-0117
- 现象:少量现场设备在高温环境下出现偶发重启;探头温度校准偏差在极端条件下超出±1.5°C。
- 根因:日志缓冲区不足导致异常循环写入;温度补偿曲线边界条件处理不完善。
- 目标:修复稳定性问题,提升 DICOM 互操作细节;增强异常日志追溯能力。
变更内容(What)
- 软件:系统软件版本由 V01.01.12.00 升级至 V01.02.01.00
- 修复:温度补偿边界处理、异常日志写入策略
- 优化:DICOM C-STORE 失败重试与状态码回传
- 新增:开机自检中温度传感器冗余校验
- 硬件/BOM(不改变电路原理,仅改料号容量):
- U12(外置 EEPROM)由 512KB 替换为 1MB(同封装,同电气特性),料号从 EE-24C512-AX 变更为 EE-24C1M-AX
- 仅为容量升级,以满足扩展日志与配置备份需求
风险与控制措施(Risk & Control)
- 风险:软件升级后特定旧配置迁移失败(低概率)
- 控制:升级前自动备份;失败则回退至旧版本并提示
- 风险:新 EEPROM 批次一致性
- 控制:首批 500 台加严抽检(功能+时序裕量测试)
验证与确认计划(V&V)
- 单元测试与回归测试(覆盖温度补偿与日志模块)
- 环境应力:高低温循环(-10~55°C)、72h 老化试验
- 互操作:DICOM 与第三方 PACS 兼容性冒烟 + 回归
- 现场试点:两家医院灰度试点各 20 台,持续 2 周无重大缺陷后放量
- 输出物:测试报告、问题清单及关闭记录、试点总结
文件与系统更新(Documents)
- 更新 SRS/SDD、软件发布说明(RN-AX8AX9-V01.02.01.00)
- 制造作业指导书(WI-MFG-AX9-ITC01)版本升级至 Rev.C
- 售后升级作业指导(SVC-UPG-AX)新增回退流程章节
- PLM/BOM 变更:U12 料号替换,生效自 Rev.F
"""
Finally, we can design a pipeline using Ollama's local LLMs to extract information from the ECN template and insert it into the ECN markdown template.
import os
import ollama
from string import Template
import json
#ecn_template = Template(ecn_template)
prompt = f"""
只能输出json格式的回答,格式如下:
{{
"title": "string",
"date": "YY-MM-DD",
"ECR_number": "string",
"content": "string",
"change_action": "string",
"important_note": "string"
}}
注意要根据以下文档的内容
<<<
{document}
>>>
提取以下的内容,确保不能遗漏内容:
title: ECR的标题。
data: ECR生效的时间。
ECR_number: ECR号。
content: 根据提供的文档,总结ECR的变更内容,注意不要遗漏任何信息,每条信息请使用"-"作为列表符号。
change_action: 总结涉及到的文件料号和软件料号,每条信息请使用"-"作为列表符号。
important_note: 根据提供的文档,总结ECR的注意事项,每条信息请使用"-"作为列表符号。
确保回复的是纯json格式
"""
response = ollama.chat(
model='qwen3:4b',
messages=[
{"role": "system", "content": "You are a strict JSON output generator."},
{'role': 'user', 'content': prompt}
],
think=False,
)
data = json.loads(response['message']['content'])
print(ecn_template.format(**data))