- systemPrompt和promptText中明确要求AI生成完整多段落内容,不要只改写现有段落 - systemPrompt增加HTML格式约束:<p>标签包裹、禁止<br>和换行符、紧凑HTML - setDiffModal和execCmd之前增加正则清洗:移除<br>、移除</p>与<p>间空白、trim首尾
102 lines
5.5 KiB
Markdown
102 lines
5.5 KiB
Markdown
# 实现方案
|
||
|
||
## 修改文件
|
||
- `src/pages/ReportEditor.tsx`
|
||
|
||
## 修改位置 1:System Prompt 强化(约 line 905-907)
|
||
|
||
在 systemPrompt 中增加对「生成完整性」和「HTML 紧凑性」的明确要求。
|
||
|
||
**原代码**:
|
||
```tsx
|
||
const systemPrompt = aiModifyEnabled
|
||
? '你是一名专业的外科医生助理。当前处于【修改模式】。\n我为你提供了当前手术报告的【全局参考内容】作为背景知识,以及你需要修改的【目标区域 HTML 源码】。\n请根据全局内容和用户的【医生指令】,直接重写并输出目标区域的 HTML。\n重要指令:\n1. 必须返回合法的 JSON 对象\n2. 必须包含 "reply"(简短回复话术)和 "updatedHtml"(修改后的完整内部 HTML 代码)两个字段\n3. 绝对不要包含任何 Markdown 标记(如 ```json)'
|
||
: '你是一名专业的外科医生助理。当前处于【对话模式】。\n请仔细阅读我提供的【全局手术报告参考内容】,并根据【医生指令】进行专业解答。\n重要指令:\n1. 必须返回合法的 JSON 对象\n2. 仅包含 "reply"(你的专业回答)一个字段\n3. 不要返回任何 HTML 代码\n4. 绝对不要包含任何 Markdown 标记';
|
||
```
|
||
|
||
**新代码**:
|
||
```tsx
|
||
const systemPrompt = aiModifyEnabled
|
||
? '你是一名专业的外科医生助理。当前处于【修改模式】。\n我为你提供了当前手术报告的【全局参考内容】作为背景知识,以及你需要修改的【目标区域 HTML 源码】。\n请根据全局内容和用户的【医生指令】,直接重写并输出目标区域的 HTML。\n重要指令:\n1. 必须返回合法的 JSON 对象\n2. 必须包含 "reply"(简短回复话术)和 "updatedHtml"(修改后的完整内部 HTML 代码)两个字段\n3. updatedHtml 必须生成完整、结构化的多段落内容,不要只改写现有段落,要基于全局信息补充完善\n4. 段落必须使用 <p> 标签包裹,段落之间绝对不要使用 <br> 标签,也不要使用任何换行符 (\\n)\n5. 输出的 HTML 必须紧凑,标签之间不要有空格或换行\n6. 绝对不要包含任何 Markdown 标记(如 ```json)'
|
||
: '你是一名专业的外科医生助理。当前处于【对话模式】。\n请仔细阅读我提供的【全局手术报告参考内容】,并根据【医生指令】进行专业解答。\n重要指令:\n1. 必须返回合法的 JSON 对象\n2. 仅包含 "reply"(你的专业回答)一个字段\n3. 不要返回任何 HTML 代码\n4. 绝对不要包含任何 Markdown 标记';
|
||
```
|
||
|
||
**变更点**:
|
||
1. 修改模式 systemPrompt 增加第 3 点:明确要求生成完整、结构化的多段落内容,基于全局信息补充完善
|
||
2. 修改模式 systemPrompt 增加第 4 点:段落必须用 `<p>` 包裹,禁止 `<br>` 和 `\n`
|
||
3. 修改模式 systemPrompt 增加第 5 点:HTML 必须紧凑,标签间不要有空格或换行
|
||
|
||
## 修改位置 2:Prompt 文本强化(约 line 891-895)
|
||
|
||
在 `promptText` 中增加对「生成完整性」的强调。
|
||
|
||
**原代码**:
|
||
```tsx
|
||
let promptText = `【全局手术报告参考内容】:\n${globalContextText}\n\n`;
|
||
if (aiModifyEnabled && targetRegionEl) {
|
||
promptText += `【你需要进行修改的目标区域 HTML 源码】:\n${currentHtml || '(当前区域为空)'}\n\n`;
|
||
}
|
||
promptText += `【医生指令】: ${text}`;
|
||
```
|
||
|
||
**新代码**:
|
||
```tsx
|
||
let promptText = `【全局手术报告参考内容】:\n${globalContextText}\n\n`;
|
||
if (aiModifyEnabled && targetRegionEl) {
|
||
promptText += `【你需要进行修改的目标区域 HTML 源码】:\n${currentHtml || '(当前区域为空)'}\n\n`;
|
||
}
|
||
promptText += `【医生指令】: ${text}\n\n【格式要求】:\n1. 生成完整、结构化的多段落 HTML 内容,不要只改写现有段落\n2. 段落使用 <p> 标签,段落之间不要使用 <br> 标签或换行符\n3. 输出紧凑 HTML,标签间不要有空格或换行`;
|
||
```
|
||
|
||
**变更点**:
|
||
1. 在医生指令后追加「格式要求」段落
|
||
2. 明确要求生成完整多段落内容,不要只改写现有段落
|
||
3. 强调 `<p>` 标签、禁止 `<br>`、禁止换行符、紧凑 HTML
|
||
|
||
## 修改位置 3:HTML 清洗后处理(约 line 938-945)
|
||
|
||
在 `setDiffModal` 之前对 `updatedHtml` 进行正则清洗。
|
||
|
||
**原代码**:
|
||
```tsx
|
||
if (responseJson.updatedHtml && aiModifyEnabled) {
|
||
if (targetRegionEl) {
|
||
setDiffModal({
|
||
isOpen: true,
|
||
originalHtml: currentHtml,
|
||
newHtml: responseJson.updatedHtml,
|
||
targetId: actualTargetId
|
||
});
|
||
} else {
|
||
execCmd('insertHTML', responseJson.updatedHtml);
|
||
}
|
||
}
|
||
```
|
||
|
||
**新代码**:
|
||
```tsx
|
||
if (responseJson.updatedHtml && aiModifyEnabled) {
|
||
let cleanHtml = responseJson.updatedHtml;
|
||
cleanHtml = cleanHtml.replace(/<br\s*\/?>/gi, '');
|
||
cleanHtml = cleanHtml.replace(/<\/p>\s*<p>/gi, '</p><p>');
|
||
cleanHtml = cleanHtml.trim();
|
||
if (targetRegionEl) {
|
||
setDiffModal({
|
||
isOpen: true,
|
||
originalHtml: currentHtml,
|
||
newHtml: cleanHtml,
|
||
targetId: actualTargetId
|
||
});
|
||
} else {
|
||
execCmd('insertHTML', cleanHtml);
|
||
}
|
||
}
|
||
```
|
||
|
||
**变更点**:
|
||
1. 新增 `cleanHtml` 变量,初始值为 `responseJson.updatedHtml`
|
||
2. 移除 `<br>` 标签(不区分大小写)
|
||
3. 移除 `</p>` 和 `<p>` 之间的空白字符(空格、换行、回车)
|
||
4. 移除首尾空白
|
||
5. `setDiffModal` 和 `execCmd` 均使用 `cleanHtml`
|