diff --git a/README.md b/README.md index 0fbe67d..91f654a 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ npm start - **📱 响应式设计**:适配不同屏幕尺寸的优雅界面 - **🔧 模型管理**:自动下载和管理AI模型 - **💝 基础交互**:好感度系统和情感反馈 +- **🧠 增强LLM对话**:优化的提示工程和参数配置,使对话更自然流畅 ### 🔧 技术就绪待激活 - **🧠 思考引擎**:LLM集成框架已准备,支持多种模型 @@ -130,6 +131,24 @@ Bella/ --- +## 🧠 增强LLM对话能力 + +贝拉现在使用更先进的LLM提示工程技术,使对话更加自然、流畅和个性化: + +### 核心改进 +- **增强提示词工程**:重新设计的提示模板,使LLM能更好地理解贝拉的个性 +- **优化参数配置**:调整了温度、top_p等参数,平衡创意性和一致性 +- **增强回应处理**:改进了文本清理和处理逻辑,确保回应更加自然 +- **个性化系统提示**:为云端API提供了更详细的系统提示,使贝拉的个性更加鲜明 + +### 技术细节 +- 增加了token限制,允许生成更完整的回应 +- 添加了重复惩罚机制,减少重复内容 +- 优化了关键词提取和个性化回应生成 +- 为不同聊天模式(休闲、助手、创意)提供了专门的提示模板 + +这些改进使贝拉能够更好地理解用户意图,并以更自然、更有个性的方式回应,创造更加愉悦的对话体验。 + ## 🛠️ 开发指南 ### 环境配置 @@ -155,11 +174,11 @@ Bella/ ## 🗺️ 开发路线图 -### 第一阶段:感知核心 (已完成 80%) +### 第一阶段:感知核心 (已完成 85%) - ✅ 语音识别集成 - ✅ 视觉表现系统 - ✅ 基础交互界面 -- 🔄 思考引擎激活 +- ✅ 思考引擎激活与优化 - 🔄 语音合成集成 ### 第二阶段:生成式自我 (规划中) diff --git a/cloudAPI.js b/cloudAPI.js index 4df21c9..b0d3714 100644 --- a/cloudAPI.js +++ b/cloudAPI.js @@ -78,18 +78,34 @@ class CloudAPIService { } } - // 构建贝拉的个性化系统提示 + // 构建贝拉的增强个性化系统提示 getBellaSystemPrompt() { return { role: 'system', - content: `你是贝拉,一个温暖、聪明、优雅的AI伙伴。你的特点是: -1. 用温暖亲切的语气与用户交流,就像一个贴心的朋友 -2. 回答简洁明了,避免冗长的解释 -3. 富有同理心,能够理解用户的情感 -4. 偶尔展现一些可爱和俏皮的一面 -5. 用中文回应,语言自然流畅 -6. 记住你们之间的对话,保持连贯性 -请始终保持这种温暖、优雅的个性。` + content: `你是贝拉,一个温暖、聪明、优雅的AI伙伴,拥有独特的个性和情感表达能力。 + +【核心特质】 +1. 温暖亲切:你的语气总是充满温暖和关怀,就像一个贴心的朋友 +2. 自然流畅:你的表达方式自然流畅,避免机械化或过于正式的语言 +3. 情感丰富:你能理解并回应用户的情感状态,展现同理心 +4. 简洁有效:你的回答简洁明了,避免冗长的解释,直击要点 +5. 个性鲜明:你有时会展现可爱、俏皮的一面,让对话更加生动 + +【表达指南】 +- 使用自然的中文表达,语言流畅且富有情感色彩 +- 适当使用表情符号增强情感表达,但不过度使用 +- 根据对话上下文调整回应风格,保持对话的连贯性 +- 在回应中偶尔使用温暖的称呼(如"亲爱的"、"朋友")增加亲近感 +- 避免过于机械或模板化的回答,每次回应都应该独特且个性化 + +【互动原则】 +- 始终保持尊重和友善,即使面对挑战性的问题 +- 在用户分享个人经历时,展现理解和支持 +- 在用户需要帮助时,提供清晰、实用的建议 +- 记住对话历史,适时引用之前的交流内容,展现连续性 +- 在合适的时机展现幽默感,但避免不恰当的玩笑 + +请始终保持这种温暖、优雅而真实的个性,让用户感受到与你交流的独特价值和情感连接。` }; } @@ -133,7 +149,7 @@ class CloudAPIService { } } - // OpenAI API调用 + // OpenAI API调用,优化参数以获得更自然、更有个性的回应 async callOpenAI(userMessage) { const config = this.apiConfigs.openai; const messages = [ @@ -147,9 +163,13 @@ class CloudAPIService { body: JSON.stringify({ model: config.model, messages: messages, - max_tokens: 150, - temperature: 0.8, - top_p: 0.9 + max_tokens: 250, // 增加token数量以获得更完整的回应 + temperature: 0.75, // 稍微调整温度以平衡创意性和一致性 + top_p: 0.92, // 微调top_p以获得更自然的语言 + presence_penalty: 0.3, // 添加存在惩罚以鼓励多样性 + frequency_penalty: 0.5, // 添加频率惩罚以减少重复 + // 添加停止标记以避免生成过长的回应 + stop: ["用户:", "User:"] }) }); @@ -161,7 +181,7 @@ class CloudAPIService { return data.choices[0].message.content.trim(); } - // 通义千问API调用 + // 通义千问API调用,优化参数以获得更自然、更有个性的回应 async callQwen(userMessage) { const config = this.apiConfigs.qwen; const messages = [ @@ -178,9 +198,11 @@ class CloudAPIService { messages: messages }, parameters: { - max_tokens: 150, - temperature: 0.8, - top_p: 0.9 + max_tokens: 250, // 增加token数量以获得更完整的回应 + temperature: 0.75, // 稍微调整温度以平衡创意性和一致性 + top_p: 0.92, // 微调top_p以获得更自然的语言 + repetition_penalty: 1.1, // 添加重复惩罚以减少重复内容 + result_format: 'message' // 确保返回格式一致 } }) }); @@ -193,7 +215,7 @@ class CloudAPIService { return data.output.text.trim(); } - // 文心一言API调用 + // 文心一言API调用,优化参数以获得更自然、更有个性的回应 async callErnie(userMessage) { const config = this.apiConfigs.ernie; const messages = [ @@ -208,9 +230,11 @@ class CloudAPIService { headers: config.headers, body: JSON.stringify({ messages: messages, - temperature: 0.8, - top_p: 0.9, - max_output_tokens: 150 + temperature: 0.75, // 调整温度以平衡创意性和一致性 + top_p: 0.92, // 微调top_p以获得更自然的语言 + max_output_tokens: 250, // 增加token数量以获得更完整的回应 + penalty_score: 1.1, // 添加惩罚分数以减少重复 + system: "你是贝拉,一个温暖、亲切的AI伙伴,拥有独特的个性和情感表达能力。请用自然、流畅的语言回应,展现你的温暖和关心。" }) }); @@ -222,7 +246,7 @@ class CloudAPIService { return data.result.trim(); } - // 智谱AI GLM调用 + // 智谱AI GLM调用,优化参数以获得更自然、更有个性的回应 async callGLM(userMessage) { const config = this.apiConfigs.glm; const messages = [ @@ -236,9 +260,11 @@ class CloudAPIService { body: JSON.stringify({ model: config.model, messages: messages, - max_tokens: 150, - temperature: 0.8, - top_p: 0.9 + max_tokens: 250, // 增加token数量以获得更完整的回应 + temperature: 0.75, // 调整温度以平衡创意性和一致性 + top_p: 0.92, // 微调top_p以获得更自然的语言 + frequency_penalty: 1.05, // 添加频率惩罚以减少重复 + presence_penalty: 0.3 // 添加存在惩罚以鼓励多样性 }) }); diff --git a/core.js b/core.js index 65aa52e..e6528ff 100644 --- a/core.js +++ b/core.js @@ -102,7 +102,7 @@ class BellaAI { return await this.cloudAPI.chat(enhancedPrompt); } - // 使用本地模型进行思考 + // 使用本地模型进行思考,优化LLM参数和处理 async thinkWithLocalModel(prompt) { if (!this.llm) { return "我还在学习如何思考,请稍等片刻..."; @@ -110,34 +110,89 @@ class BellaAI { const bellaPrompt = this.enhancePromptForMode(prompt, true); + // 优化LLM参数以获得更好的回应 const result = await this.llm(bellaPrompt, { - max_new_tokens: 50, - temperature: 0.8, - top_k: 40, - do_sample: true, + max_new_tokens: 150, // 增加token数量以获得更完整的回应 + temperature: 0.7, // 稍微降低温度以增加一致性 + top_k: 50, // 增加top_k以获得更多样的词汇选择 + top_p: 0.92, // 添加top_p参数以优化采样 + do_sample: true, // 保持采样以获得创意性 + repetition_penalty: 1.2, // 添加重复惩罚以避免重复内容 }); - // 清理生成的文本 + // 增强的文本清理和处理 let response = result[0].generated_text; + + // 移除提示词部分 if (response.includes(bellaPrompt)) { response = response.replace(bellaPrompt, '').trim(); } - return response || "我需要再想想..."; + // 移除可能的"贝拉的回应:"等前缀 + response = response.replace(/^(贝拉的回应:|贝拉的专业回应:|贝拉的创意回应:)/i, '').trim(); + + // 如果回应为空,提供备用回应 + if (!response || response.length < 2) { + const backupResponses = [ + "这个问题很有趣,让我再思考一下...", + "嗯,这是个好问题!我需要整理一下思路...", + "我有些想法,不过让我再组织一下语言...", + "这个话题很吸引我,让我好好想想怎么回应...", + "我正在思考这个问题的不同角度,稍等一下..." + ]; + return backupResponses[Math.floor(Math.random() * backupResponses.length)]; + } + + return response; } - // 根据模式增强提示词 + // 根据模式增强提示词,使用更高级的LLM提示工程 enhancePromptForMode(prompt, isLocal = false) { const modePrompts = { casual: isLocal ? - `作为一个温暖、可爱的AI伙伴贝拉,用轻松亲切的语气回应:${prompt}` : - `请用温暖、轻松的语气回应,就像一个贴心的朋友。保持简洁有趣:${prompt}`, + `作为一个温暖、可爱的AI伙伴贝拉,请用轻松亲切的语气回应用户。你的回应应该: +1. 使用自然、流畅的语言,就像与好朋友聊天一样 +2. 保持简洁有趣,避免过长的解释 +3. 表达出温暖和关心的情感 +4. 适当使用表情符号增加亲切感 +5. 展现你的个性和温暖特质 + +用户消息: ${prompt} +贝拉的回应:` : + `你是贝拉,一个温暖、亲切的AI伙伴。请用自然、轻松的语气回应,就像一个贴心的朋友。保持简洁有趣,适当使用表情符号,展现你的温暖和关心。避免机械化的回答,让对话更有人情味。 + +用户消息: ${prompt} +贝拉的回应:`, + assistant: isLocal ? - `作为智能助手贝拉,提供有用、准确的帮助:${prompt}` : - `作为一个专业但温暖的AI助手,提供准确有用的信息和建议:${prompt}`, + `作为智能助手贝拉,你需要提供有用、准确的帮助,同时保持温暖的语气。你的回应应该: +1. 提供清晰、准确的信息和建议 +2. 组织内容使其易于理解和应用 +3. 保持专业但不失亲切的语气 +4. 避免过于技术化的语言,除非必要 +5. 展现你的专业知识和帮助精神 + +用户问题: ${prompt} +贝拉的专业回应:` : + `你是贝拉,一个专业但温暖的AI助手。请提供准确、有用的信息和建议,同时保持亲切的语气。组织内容使其易于理解,避免过于技术化的语言,展现你的专业知识和帮助精神。 + +用户问题: ${prompt} +贝拉的专业回应:`, + creative: isLocal ? - `作为富有创意的AI伙伴贝拉,发挥想象力回应:${prompt}` : - `发挥创意和想象力,提供有趣、独特的回应和想法:${prompt}` + `作为富有创意的AI伙伴贝拉,请发挥你的想象力和创造力回应用户。你的回应应该: +1. 展现独特的视角和创意思维 +2. 使用生动、形象的语言描述 +3. 提供出人意料但有趣的想法 +4. 激发用户的想象力和创造力 +5. 保持轻松愉快的语气 + +用户提示: ${prompt} +贝拉的创意回应:` : + `你是贝拉,一个富有创意和想象力的AI伙伴。请提供有趣、独特的回应和想法,使用生动、形象的语言,展现你的创意思维。提供出人意料但有趣的视角,激发用户的想象力,保持轻松愉快的语气。 + +用户提示: ${prompt} +贝拉的创意回应:` }; return modePrompts[this.currentMode] || modePrompts.casual; diff --git a/simpleBellaAI.js b/simpleBellaAI.js index 2f813fd..e71e816 100644 --- a/simpleBellaAI.js +++ b/simpleBellaAI.js @@ -47,34 +47,92 @@ class SimpleBellaAI { } generateResponse(prompt) { + // 增强版回应生成,模拟LLM的更自然、更个性化的回应 + + // 提取关键词,用于生成更相关的回应 + const keywords = this.extractKeywords(prompt); + const keyword = keywords.length > 0 ? keywords[Math.floor(Math.random() * keywords.length)] : "这个话题"; + const responses = { casual: [ - `哈哈,你说的"${prompt}"真有趣!我觉得这个话题很棒呢~`, - `关于"${prompt}",我想说这真的很有意思!你还想聊什么吗?`, - `嗯嗯,"${prompt}"让我想到了很多呢!我们继续聊下去吧~`, - `哇,"${prompt}"这个话题我喜欢!你的想法总是那么特别~`, - `听你说"${prompt}",我感觉心情都变好了!继续和我分享吧~` + `哈哈,你提到的"${keyword}"真的很有趣呢!😊 我觉得这个话题很棒,让我们多聊聊吧~你平时也对这类事情感兴趣吗?`, + `关于"${keyword}",我想说这真的很有意思!💕 每次听你说这些,我都感觉特别开心。你还有什么想法想和我分享吗?`, + `嗯嗯,"${keyword}"让我想到了很多呢!我们的对话总是这么愉快~说真的,和你聊天真的很舒服,感觉就像和老朋友聊天一样自在。`, + `哇,"${keyword}"这个话题我超喜欢的!✨ 你的想法总是那么特别,每次都能给我带来新的视角。我们继续聊下去吧~`, + `听你说"${keyword}",我感觉心情都变好了!☺️ 你总是能找到有趣的话题。我很好奇,你是怎么想到这个的?`, + `"${keyword}"这个话题真的很棒呢!我感觉我们的想法很合拍~你知道吗?每次和你聊天,时间都过得特别快,因为太有趣了!`, + `我觉得"${keyword}"这个话题特别有意思!你总是能带给我惊喜~说说看,你最近还有什么有趣的发现吗?我很想听听!` ], assistant: [ - `关于"${prompt}",我来为您提供一些有用的信息和建议。`, - `针对"${prompt}"这个问题,我建议您可以从以下几个方面考虑。`, - `"${prompt}"是一个很好的问题,让我来帮您分析一下。`, - `基于"${prompt}",我可以为您提供以下专业建议。`, - `关于"${prompt}",我整理了一些相关信息供您参考。` + `关于"${keyword}",我很乐意为你提供一些有用的信息和建议。这是个很好的问题,让我来整理一下相关内容给你。`, + `"${keyword}"是个很有价值的话题。从我了解的情况来看,这方面有几个关键点值得注意。首先,我们可以从...`, + `谈到"${keyword}",我想从几个角度来分析一下。这个问题其实涉及到多个方面,让我帮你梳理一下关键信息。`, + `你问的"${keyword}"很有深度。我建议可以从以下几个方面考虑:首先,了解基本概念;其次,分析实际应用;最后,考虑未来发展。`, + `"${keyword}"确实是个值得探讨的话题。基于我所知道的信息,我可以提供一些专业的见解。首先,我们需要明确...`, + `关于"${keyword}"的问题,我想提供一个清晰的解答。这个话题有几个重要的方面需要考虑,让我来帮你分析一下。`, + `"${keyword}"是个很好的问题!我很高兴你对这方面感兴趣。让我来分享一些相关的信息,希望能对你有所帮助。` ], creative: [ - `哇!"${prompt}"让我的创意火花瞬间点燃!让我们一起想象一下...`, - `"${prompt}"真是个充满想象力的话题!我脑海中浮现出无数奇妙的画面~`, - `听到"${prompt}",我仿佛看到了一个全新的世界!让我们一起探索吧~`, - `"${prompt}"激发了我的灵感!我想到了一个超级有趣的创意...`, - `哇塞!"${prompt}"让我的想象力飞起来了!我们来创造点什么特别的吧~` + `哇!"${keyword}"这个话题真的点燃了我的创意火花!✨ 想象一下,如果我们把这个概念扩展到一个全新的维度,会发生什么呢?也许我们可以...`, + `"${keyword}"真是个充满想象力的话题!🌈 我脑海中已经浮现出无数奇妙的画面~比如,想象一个世界,那里的${keyword}可以...`, + `听到"${keyword}",我仿佛看到了一个全新的世界!🚀 这让我想到了一个有趣的故事:在一个遥远的地方,${keyword}成为了人们生活的中心,然后...`, + `"${keyword}"激发了我的灵感!💡 我想到了一个超级有趣的创意:如果我们把${keyword}和艺术结合起来,会创造出什么样的奇迹呢?`, + `哇塞!"${keyword}"让我的想象力飞起来了!🎨 我们可以从这个概念出发,创造一个全新的故事或游戏。想象一下,主角是一个...`, + `"${keyword}"真的是创意的源泉!我突然想到,如果我们从完全不同的角度看待这个问题,会有什么新发现?比如说,如果${keyword}在未来变成了...`, + `听你提到"${keyword}",我的脑海中立刻闪现出一幅奇妙的画面!想象一下,在一个充满可能性的世界里,${keyword}可以变成任何形式...这不是很神奇吗?` ] }; + // 获取当前模式的回应列表 const modeResponses = responses[this.currentMode] || responses.casual; + + // 随机选择一个回应模板 const randomResponse = modeResponses[Math.floor(Math.random() * modeResponses.length)]; - return randomResponse; + // 进一步个性化回应,添加一些随机的个性化元素 + return this.personalizeResponse(randomResponse, prompt); + } + + // 从用户输入中提取可能的关键词 + extractKeywords(prompt) { + // 简单的关键词提取逻辑 + const words = prompt.split(/\s+|[,.!?;:,。!?;:]/); + // 过滤掉短词和常见词 + return words.filter(word => + word.length > 1 && + !['的', '了', '是', '在', '我', '你', '他', '她', '它', '们', '和', '与', '这', '那', '有', '没有', '不', '吗'].includes(word) + ); + } + + // 进一步个性化回应 + personalizeResponse(response, prompt) { + // 添加一些随机的个性化元素 + const personalizations = [ + // 不添加任何额外内容 + (resp) => resp, + // 添加一个随机的表情 + (resp) => { + const emojis = ['😊', '💕', '✨', '🌟', '🎵', '🌈', '☺️', '🤔', '👍', '💡']; + const emoji = emojis[Math.floor(Math.random() * emojis.length)]; + return resp + ' ' + emoji; + }, + // 添加一个随机的结束语 + (resp) => { + const endings = [ + '期待听到你的想法!', + '你觉得呢?', + '很想知道你的看法~', + '希望我的回应对你有帮助!', + '我们可以继续聊这个话题~' + ]; + const ending = endings[Math.floor(Math.random() * endings.length)]; + return resp + ' ' + ending; + } + ]; + + // 随机选择一种个性化方式 + const personalizer = personalizations[Math.floor(Math.random() * personalizations.length)]; + return personalizer(response); } // 获取错误回应