From a5a1b848d0fbf6557b4e36f304b6b1157cb916e7 Mon Sep 17 00:00:00 2001 From: cat_shark <1716967236@qq.com> Date: Sat, 4 Jul 2026 16:08:45 +0800 Subject: [PATCH] =?UTF-8?q?fix(lpt-ai)=EF=BC=9A=E5=9B=9E=E5=BF=86=E5=AF=B9?= =?UTF-8?q?=E6=AF=94=20prompt=20=E6=94=B9=E4=B8=BA=E5=B9=B3=E9=93=BA?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E5=88=97=E8=A1=A8=E6=A0=BC=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E6=A0=91=E6=A0=87=E6=B3=A8=E4=BA=A4=20Java=20=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LLM 无法可靠输出完整嵌套树 JSON(之前的 matchedTree), 实际返回格式与预期不符导致前端对比展示异常。 修复: - prompt 要求 AI 只输出平铺列表:matches(匹配对)、missedTitles、 extraNodes、recallRatio、evaluation,不再要求输出树结构 - matches 中的 standardTitle 明确要求与标准导图逐字一致 - 用户消息末尾追加明确提示「请输出 JSON(只包含五个字段)」 --- src/llm/prompts.ts | 49 ++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/llm/prompts.ts b/src/llm/prompts.ts index a91074e..462fd5d 100644 --- a/src/llm/prompts.ts +++ b/src/llm/prompts.ts @@ -94,25 +94,24 @@ export function generateMindMapPrompt( /** * 回忆对比:将用户凭记忆写的导图与标准导图语义对比。 * - * 输出要求:严格 JSON(不要包含 markdown 代码块标记),结构如下: + * AI 只需输出平铺的匹配/遗漏/额外列表(不输出树结构,树标注由 Java 端完成)。 + * + * 输出要求:严格 JSON,不要 markdown 代码块,格式如下: * { - * "matchedTree": { "title": "标准根标题", "children": [...], "notes": "MATCHED|备注" }, - * "extraNodes": [{ "title": "额外节点标题", "path": "路径" }], - * "recallRatio": 0.75, - * "matchedCount": 6, - * "missedCount": 2, - * "extraCount": 3, - * "evaluation": "评价文字" + * "matches": [ + * { "standardTitle": "A知识点", "recallTitle": "知识点A" } + * ], + * "missedTitles": ["在标准导图中但用户未回忆到的节点标题"], + * "extraNodes": [ + * { "title": "用户额外回忆的知识点", "path": "所属路径" } + * ], + * "recallRatio": 1.0, + * "evaluation": "中文评价 2-5 句" * } * - * 要点: - * - 标准导图的每个节点在 matchedTree 中标注 MATCHED| 或 MISSED| 前缀, - * 匹配时保留原始标题,不要改变标准导图的标题文字 - * - 匹配应基于语义而非字面,同义表达(如"锁升级"≈"锁膨胀")算匹配 - * - 考虑层级上下文:节点逻辑上归属正确即可匹配,不要求层级路径完全一致 - * - 用户额外回忆到的节点放入 extraNodes - * - 评价用中文写,2-5 句话,指出回忆完整度、遗漏的关键概念、 - * 额外回忆的知识点是否有价值 + * matches 中 standardTitle 必须与标准导图中的节点标题逐字一致。 + * missedTitles 存放标准导图中有但用户完全没提到的节点标题。 + * extraNodes 的 path 用 "根 > 父节点 > 当前节点" 格式。 */ export function compareRecallPrompt( taskName: string, @@ -129,14 +128,16 @@ export function compareRecallPrompt( "", "你的任务:", "- 对标准导图的每个非根节点,判断用户在回忆中是否覆盖了它;", - "- 匹配应基于语义理解:即使表达的用词、角度不同,概念相同就算匹配;", - "- 考虑层级上下文:一个节点在用户导图中归属到正确的逻辑分组下才算匹配;", - "- 找出用户额外回忆到的、标准导图中没有的知识点(extraNodes);", - "- 统计覆盖率、命中/遗漏/额外数量;", - "- 用中文写一段评价(2-5 句话),包括:回忆完整度评价、遗漏了哪些关键概念、额外回忆的内容是否有价值。", + "- 匹配应基于语义理解:同义表达算匹配(如\"锁升级\"≈\"锁膨胀\");", + "- 考虑层级上下文:节点在用户导图中的归属逻辑正确即可;", + "- 找出用户额外回忆的、标准导图中没有的知识点;", + "- 统计覆盖率 = 命中数 / (命中数 + 遗漏数);", + "- 用中文写一段评价(2-5 句话)。", "", - "输出必须是有效 JSON,不要包含 ```json 之类的标记,直接输出 JSON 对象。", - "标准导图中需要标注的节点,在 notes 字段中用 MATCHED| 或 MISSED| 标记。", + "重要:你不需要输出标准导图的树结构。只需列出 matches(匹配对)、", + "missedTitles(遗漏的节点标题列表)、extraNodes(额外节点列表)。", + "matches 中的 standardTitle 必须与标准导图中的标题文字完全一致,不要改写。", + "输出必须是有效 JSON 对象,不要包含 ```json 之类的标记,直接输出 JSON。", ].join("\n"), }, { @@ -149,6 +150,8 @@ export function compareRecallPrompt( "", "===== 用户回忆导图 =====", recallOutline, + "", + "请输出 JSON(只包含 matches、missedTitles、extraNodes、recallRatio、evaluation 五个字段):", ].join("\n"), }, ];