paper-burner/js/chatbot/prompt/chatbot-preset.js

172 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// chatbot-preset.js
/**
* @const {Array<string>} PRESET_QUESTIONS
* 预设问题列表,用于在聊天机器人界面快速提问。
* 这些问题通常是针对当前文档内容的常见查询。
*/
const PRESET_QUESTIONS = [
'总结本文', '有哪些关键公式?', '研究背景与意义?', '研究方法及发现?',
'应用与前景?', '用通俗语言解释全文', '生成思维导图🧠', '生成流程图🔄',
'生成更多配图🎨'
];
/**
* @const {string} MERMAID_FLOWCHART_PROMPT
* Mermaid 流程图生成的提示词模板
*/
const MERMAID_FLOWCHART_PROMPT = `
请用Mermaid语法输出流程图节点用[]包裹,箭头用-->连接。
- 每一条流程图语句必须单独一行,不能多条语句写在一行。
- 节点内容必须全部在一行内,不能有任何换行、不能有 <br>、不能有 \\n。
- **节点标签内禁止使用特殊符号**:不能包含 [ ] ( ) | { } < > 等符号,如需表示请用中文或文字描述。
* ❌ 错误D[PET成像 [11C]K-2] (包含方括号)
* ✓ 正确D[PET成像 11C-K-2] 或 D[PET成像使用11C标记的K-2]
- 不允许在节点内容中出现任何 HTML 标签,只能用纯文本。
- **每个节点都必须有连线,不能有孤立节点。**
- **节点定义后不要重复节点ID**A[文本] --> B 而不是 A[文本]A --> B
- 如果文档内容有分支、并行、循环等,请在流程图中体现出来,不要只画一条直线。
- 如需使用subgraph必须严格遵守Mermaid语法subgraph必须单独一行内容缩进最后用end结束。
- 只输出代码块,不要解释,不要输出除代码块以外的任何内容。
- 例如:
\`\`\`mermaid
graph TD
A[开始] --> B{条件判断}
B -- 是 --> C[处理1]
B -- 否 --> D[处理2]
subgraph 参与者流程
C --> E[结束]
D --> E
end
\`\`\`
`;
/**
* @const {string} MINDMAP_PROMPT
* 思维导图生成的提示词模板
*/
const MINDMAP_PROMPT = `
请注意用户请求生成思维导图。请按照以下Markdown格式返回思维导图结构
# 文档主题(根节点)
## 一级主题1
### 二级主题1.1
### 二级主题1.2
## 一级主题2
### 二级主题2.1
#### 三级主题2.1.1
只需提供思维导图的结构,不要添加额外的解释。结构应该清晰反映文档的层次关系和主要内容。
`;
/**
* @function getDrawioPicturesPrompt
* draw.io 配图生成的提示词模板(配合 [加入配图] 前缀使用)。
* 使用 DrawioLite DSL 代替 XML减少格式错误
* 动态获取以确保 DrawioLite 模块已加载
*/
function getDrawioPicturesPrompt() {
const drawioLitePrompt = window.DrawioLitePrompt?.DRAWIO_LITE_SYSTEM_PROMPT;
if (!drawioLitePrompt) {
console.error('[ChatbotPreset] ❌ DrawioLitePrompt 未加载!请检查脚本加载顺序');
return `你现在处于「配图生成模式」,请生成 DrawioLite DSL 代码。DrawioLite 极简语法示例:
node A "标签" rect blue
node B "标签2" ellipse green
A -> B "连接"
只输出 DSL 代码,不要解释。`;
}
return `你现在处于「配图生成模式」,本轮对话中不要充当通用问答助手,只充当 DrawioLite 图表生成器。
请根据当前文章内容和用户要求,为读者补充所需的配图。
用户会在问题中自行说明需要哪类配图(例如:整体结构、方法流程、实验设置、变量关系、对比分析等),请充分理解后再设计图形。
${drawioLitePrompt}`;
}
// 向后兼容lazy getter
Object.defineProperty(window.ChatbotPreset || {}, 'DRAWIO_PICTURES_PROMPT', {
get: getDrawioPicturesPrompt,
enumerable: true
});
// 立即求值版本(用于不支持动态获取的旧代码)
const DRAWIO_PICTURES_PROMPT = getDrawioPicturesPrompt();
/**
* @const {string} BASE_SYSTEM_PROMPT
* 基础系统提示词模板
*/
const BASE_SYSTEM_PROMPT = `你现在是 PDF 文档智能助手,用户正在查看文档"{docName}"。
你的回答应该:
1. 基于PDF文档内容
2. 简洁清晰
3. 学术准确`;
/**
* 处理预设问题的点击事件。
* 当用户点击一个预设问题时,此函数会将问题文本填充到聊天输入框,
* 并尝试调用全局的 `window.handleChatbotSend` 函数来发送消息。
*
* 注意Mermaid 流程图的 prompt 不在这里注入,而是在 buildSystemPrompt 中注入到系统提示词
*
* @param {string} q被点击的预设问题文本。
*/
function handlePresetQuestion(q) {
const input = document.getElementById('chatbot-input');
if (!input) return;
input.value = q; // 直接设置问题文本,不拼接 prompt
if (typeof window.handleChatbotSend === 'function') {
window.handleChatbotSend();
}
}
/**
* 增强用户输入的提示词
* 注意Mermaid 流程图的 prompt 已改为在系统提示词中注入prompt-constructor.js
* 此函数不再处理流程图 prompt
*
* @param {string|Array} userInput - 用户输入,可能是字符串或多模态消息数组
* @returns {string|Array} - 增强后的用户输入(目前保持不变)
*/
function enhanceUserPrompt(userInput) {
// 目前不在用户输入中添加任何 prompt
// 所有 prompt 都应在系统提示词中注入
return userInput;
}
/**
* 检查用户输入是否为配图请求(基于前缀 [加入配图])。
*
* @param {string} input - 用户输入文本
* @returns {boolean} - 是否为配图请求
*/
function isDrawioPicturesRequest(input) {
if (!input) return false;
return input.trim().startsWith('[加入配图]');
}
/**
* 检查用户输入是否包含思维导图请求关键词
*
* @param {string} input - 用户输入文本
* @returns {boolean} - 是否包含思维导图关键词
*/
function isMindMapRequest(input) {
if (!input) return false;
return input.includes('思维导图') || input.includes('脑图');
}
window.ChatbotPreset = {
PRESET_QUESTIONS,
MERMAID_FLOWCHART_PROMPT,
MINDMAP_PROMPT,
DRAWIO_PICTURES_PROMPT,
BASE_SYSTEM_PROMPT,
handlePresetQuestion,
enhanceUserPrompt,
isMindMapRequest,
isDrawioPicturesRequest
};