feat(ai): diff弹窗内容完整性优化 + HTML空行清洗

- systemPrompt和promptText中明确要求AI生成完整多段落内容,不要只改写现有段落
- systemPrompt增加HTML格式约束:<p>标签包裹、禁止<br>和换行符、紧凑HTML
- setDiffModal和execCmd之前增加正则清洗:移除<br>、移除</p>与<p>间空白、trim首尾
This commit is contained in:
2026-04-19 04:15:36 +08:00
parent 9f73d8595c
commit c7e7033e7d
5 changed files with 231 additions and 4 deletions

View File

@@ -718,3 +718,34 @@ ReportEditor 采用 `useRef` 作为自动保存的数据快照机制(避免 Re
**D. 后续如何避免问题**
- 当功能存在「全局开关 + 局部选择器」两层控制时,**全局开关开启后应自动兜底局部选择器**,避免因用户遗漏局部配置而导致功能降级。
- System Prompt 中应显式标注当前模式名称(如「修改模式」「对话模式」),大模型对显式标签的遵循度远高于隐式条件推断。
---
## 记录 32AI diff 弹窗内容不完整 + 右侧多余空行
**A. 具体问题**
1. AI 修改确认弹窗左侧原始版本只显示一段内容,用户希望 AI 能一次性生成完整的多段落内容。
2. diff 弹窗右侧 AI 提议版本的段落间出现额外空行,与左侧结构不一致。
**B. 产生问题原因**
1. **内容不完整**:大模型被给予的目标区域源码(`currentHtml`)可能只有一段,且 systemPrompt 没有明确要求「生成完整、结构化的多段落内容」,导致 AI 只做局部改写。
2. **多余空行**:大模型返回的 HTML 中常包含 `<br>` 标签或 `\n` 换行符。`</p>\n<p>` 中的换行符会被浏览器解析为文本节点,产生额外空白。
**C. 解决问题方案**
1. **输入端控制System Prompt + Prompt**
- systemPrompt 增加明确要求:`updatedHtml 必须生成完整、结构化的多段落内容,不要只改写现有段落`
- systemPrompt 增加 HTML 格式约束:`段落必须使用 <p> 标签包裹,段落之间绝对不要使用 <br> 标签,也不要使用任何换行符`
- promptText 末尾追加「格式要求」段落,再次强调完整多段落、`<p>` 标签、禁止 `<br>`、紧凑 HTML
2. **输出端兜底(正则清洗)**
```ts
let cleanHtml = responseJson.updatedHtml;
cleanHtml = cleanHtml.replace(/<br\s*\/?>/gi, '');
cleanHtml = cleanHtml.replace(/<\/p>\s*<p>/gi, '</p><p>');
cleanHtml = cleanHtml.trim();
```
在 `setDiffModal` 和 `execCmd` 之前统一清洗,确保右侧渲染结构与左侧一致。
**D. 后续如何避免问题**
- 当大模型返回的 HTML 需要在前端渲染时,**必须同时在输入端prompt和输出端后处理进行格式约束**,单靠一端无法完全控制不同 LLM 的输出随机性。
- 对于「生成完整性」类需求,必须在 prompt 中明确使用「必须生成完整...」「不要只改写...」等强制性措辞,否则大模型倾向于做最小化修改。