增强LLM对话能力:优化提示工程和参数配置,使贝拉的回应更自然、更有个性

This commit is contained in:
2025-07-27 18:59:16 +00:00
parent d2d0a71432
commit c4e0fdd120
4 changed files with 215 additions and 57 deletions
+21 -2
View File
@@ -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%)
- ✅ 语音识别集成
- ✅ 视觉表现系统
- ✅ 基础交互界面
- 🔄 思考引擎激活
- 思考引擎激活与优化
- 🔄 语音合成集成
### 第二阶段:生成式自我 (规划中)
+51 -25
View File
@@ -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 // 添加存在惩罚以鼓励多样性
})
});
+69 -14
View File
@@ -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;
+74 -16
View File
@@ -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);
}
// 获取错误回应