feat(ai): 修改模式自动锁定目标区域 + SystemPrompt模式语义强化
- handleAIGenerate开头增加自动修正目标区域逻辑:修改模式开启且未选区域时,自动选择文档中第一个AI区域 - systemPrompt明确标注'当前处于【修改模式】/【对话模式】',并细化字段要求 - diffModal的targetId改为使用actualTargetId,确保确认注入时使用实际修正后的区域ID
This commit is contained in:
37
工程分析/经验记录.md
37
工程分析/经验记录.md
@@ -681,3 +681,40 @@ ReportEditor 采用 `useRef` 作为自动保存的数据快照机制(避免 Re
|
||||
**D. 后续如何避免问题**
|
||||
- 设计「修改/生成」类 AI 功能时,**systemPrompt 的条件应尽量只依赖用户意图开关**(如 `aiModifyEnabled`),而非依赖具体 UI 状态(如某个下拉框是否选中)。UI 状态应只影响「如何注入结果」,不应影响「是否要求模型生成结果」。
|
||||
- 任何「目标区域注入」逻辑都必须配备**降级方案**(如光标处插入),防止因用户未选中区域而导致功能完全失效。
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 记录 31:AI 修改模式自动锁定目标区域 + 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 中应显式标注当前模式名称(如「修改模式」「对话模式」),大模型对显式标签的遵循度远高于隐式条件推断。
|
||||
|
||||
Reference in New Issue
Block a user