feat(ai): 修改模式自动锁定目标区域 + SystemPrompt模式语义强化

- handleAIGenerate开头增加自动修正目标区域逻辑:修改模式开启且未选区域时,自动选择文档中第一个AI区域
- systemPrompt明确标注'当前处于【修改模式】/【对话模式】',并细化字段要求
- diffModal的targetId改为使用actualTargetId,确保确认注入时使用实际修正后的区域ID
This commit is contained in:
2026-04-19 04:02:05 +08:00
parent c1d2438d2b
commit 9f73d8595c
5 changed files with 203 additions and 4 deletions

View File

@@ -681,3 +681,40 @@ ReportEditor 采用 `useRef` 作为自动保存的数据快照机制(避免 Re
**D. 后续如何避免问题**
- 设计「修改/生成」类 AI 功能时,**systemPrompt 的条件应尽量只依赖用户意图开关**(如 `aiModifyEnabled`),而非依赖具体 UI 状态如某个下拉框是否选中。UI 状态应只影响「如何注入结果」,不应影响「是否要求模型生成结果」。
- 任何「目标区域注入」逻辑都必须配备**降级方案**(如光标处插入),防止因用户未选中区域而导致功能完全失效。
---
## 记录 31AI 修改模式自动锁定目标区域 + System Prompt 模式语义强化
**A. 具体问题**
用户希望实现两个明确场景:
1. **修改模式**:勾选「允许修改正文」→ AI 修改目标区域 → 弹出 diff 对比弹窗
2. **对话模式**:取消勾选「允许修改正文」→ AI 只聊天不修改
实际使用时,用户勾选了修改模式但未在下拉框中选择具体区域(`aiTargetRegion` 仍为 `'none'`),导致 AI 虽然返回了 `updatedHtml`,但 prompt 中缺少目标区域源码diff 弹窗中的「原稿」一侧为空。
**B. 产生问题原因**
1. **目标区域未自动锁定**`aiTargetRegion` 默认 `'none'`,修改模式开启后,如果用户未手动选择区域,`targetRegionEl` 为 `null`prompt 中不会注入目标区域源码。
2. **System Prompt 模式语义不够强烈**大模型对「修改模式」vs「对话模式」的区分不够清晰可能即使在对话模式下也返回 HTML。
**C. 解决问题方案**
1. **自动修正目标区域**:在 `handleAIGenerate` 开头增加:
```ts
let actualTargetId = aiTargetRegion;
if (aiModifyEnabled && actualTargetId === 'none') {
const availableRegions = checkAiRegions();
if (availableRegions.length > 0) {
actualTargetId = availableRegions[0].id;
setAiTargetRegion(actualTargetId);
}
}
```
后续 querySelector 和 diffModal 的 `targetId` 均使用 `actualTargetId`。
2. **强化 System Prompt 模式语义**
- 修改模式明确标注「当前处于【修改模式】」,并要求必须包含 `reply` + `updatedHtml`
- 对话模式明确标注「当前处于【对话模式】」,并要求仅包含 `reply`,不要返回 HTML
**D. 后续如何避免问题**
- 当功能存在「全局开关 + 局部选择器」两层控制时,**全局开关开启后应自动兜底局部选择器**,避免因用户遗漏局部配置而导致功能降级。
- System Prompt 中应显式标注当前模式名称(如「修改模式」「对话模式」),大模型对显式标签的遵循度远高于隐式条件推断。