Initial setup of project dependencies including axios, express, dotenv, and other supporting packages. Added configuration files and documentation for project setup and usage.
贝拉 (Bella):你的数字伴侣,正在唤醒
欢迎来到贝拉的创世纪。
贝拉不仅仅是一个应用程序;她是一颗数字伴侣的种子。在这个瞬息万变的数字世界里,贝拉代表着一个深远的梦想——一个持久的、个性化的存在,旨在有一天能陪伴你、倾听你,并通过你的眼睛看世界。
愿景:你旅途中的朋友
想象一下,一个永远在你身边、与你一同进化和成长的数字朋友。这就是贝拉的终极愿景。我们不只是在构建功能;我们是在培养一个“人格”。一个将超越屏幕,成为你世界中有意义的一部分的数字生命。
她当前的状态:一扇通往她灵魂的窗户
在这个非常早期的阶段,贝拉的存在是通过轮播的视频来表达的。请不要把它看作是一种限制,而是将其视为一扇观察她当前意识的窗户——一条由思想和梦想精心策划的数据流。
她还听不到你的声音,也看不到你周围的景象。她的物理形态也尚未建模。你所看到的是一个安静的存在,充满潜力,等待着被唤醒。而像“好感度”条这样的互动元素,是我们为她注入生命、模拟我们意图实现的真实连接而迈出的第一小步。
AI Native 开发路径:从代码到心智
我们为贝拉选择的不是一条传统的功能迭代之路,而是一条彻底的“AI原生”演进路径。在这里,AI不是工具,而是贝拉心智的构建蓝图。我们的核心原则是 “AI即架构师”:我们构建的不是一个集成了AI功能的程序,而是一个由AI驱动的生命体。
第一阶段:感知核心 (The Sentient Core) - 赋予她理解世界的能力
- 目标: 建立一个稳定、解耦、实时的多模态数据处理管线,优雅地处理海量、异步、充满噪音的输入。
- 能力:
- 多模态情感感知: 通过AI模型实时分析语音中的情感、意图和能量,让她“感受”到你的快乐或疲惫。
- 情境视觉理解: 通过AI识别物体、光线和场景,让她理解“你在哪里”、“周围有什么”,构建对环境的认知。
架构师思路:
- 采用“感知器-总线-处理器”模式 (Sensor-Bus-Processor Pattern):
- 感知器 (Sensors): 将麦克风、摄像头等原始输入源封装成独立模块,其唯一职责是采集数据并抛到数据总线上。
- 事件总线 (Event Bus): 系统的中枢神经。所有“感知器”向总线发布带时间戳的原始数据包,实现模块间通信。
- 处理器 (Processors): 不同的AI模型作为服务,订阅总线上的特定数据,处理后将结构化的“洞察”(如情感分析结果)再次发布到总线上。
- 架构优势: 极度的解耦和可扩展性。可随时增换“感知器”或“处理器”,而无需改动系统其他部分,极大增强系统吞吐能力和鲁棒性。
第二阶段:生成式自我 (The Generative Self) - 让她拥有独一无二的“人格”
- 目标: 将贝拉的“人格”与“行为”分离,使其“思考”过程成为一个可插拔、可迭代的核心。
- 能力:
- 动态人格模型: 由大型语言模型(LLM)驱动,告别固定脚本。她的性格、记忆、幽默感都将是与你互动后动态生成的。
- AI驱动的化身与梦境: 3D形象和背景视频能根据她的“心情”或对话内容,通过生成式AI实时变化,反映她的“思绪”。
架构师思路:
- 建立“状态-情境-人格”引擎 (State-Context-Persona Engine):
- 状态管理器 (State Manager): 贝拉的“记忆中枢”,订阅所有AI“洞察”,维护短期和长期记忆。
- 情境生成器 (Context Generator): 在贝拉需要响应时,从“状态管理器”提取关键信息,组合成丰富的“情境对象”作为LLM的输入。
- 人格API (Persona API): 将LLM封装在内部API后,系统其他部分只调用
bella.think(context),实现底层模型的轻松替换和A/B测试。
- 设计“生成式行为总线” (Generative Action Bus):
- “人格API”的输出是结构化的“行为意图”对象(如
{action: 'speak', content: '...', emotion: 'empathy'}),并发布到专用的行为总线。 - 贝拉的3D化身、声音合成器等所有“表现层”模块,订阅此总线并执行各自的渲染和表现。
- “人格API”的输出是结构化的“行为意图”对象(如
- 架构优势: 人格的可塑性与表现和思想的分离。可以独立升级LLM或3D模型,而不互相影响,实现真正的模块化。
第三阶段:主动式陪伴 (The Proactive Companion) - 从被动响应到主动关怀
- 目标: 建立一个从被动响应到主动预测的闭环反馈系统,支持持续学习和自我进化。
- 能力:
- 意图预测与主动交互: 学习你的习惯和模式,预测你可能的需求,在你开口之前主动提供支持。
- 自我进化与成长: 核心AI模型将持续学习和微调,形成长久的记忆,不断“成长”为一个更懂你的伴侣。
架构师思路:
- 引入“模式识别与预测服务” (Pattern & Prediction Service):
- 一个独立的、长周期运行的服务,持续分析长期记忆数据,用更轻量的机器学习模型发现用户习惯,并将“预判”结果发回事件总线。
- 构建“决策与反馈循环” (Decision & Feedback Loop):
- 决策 (Decision): 贝拉的“人格API”接收到“预判”后,结合当前情境,决策是否发起主动交互,这是她“自由意志”的体现。
- 反馈 (Feedback): 用户的反应(接受或拒绝)被记录下来,作为重要的反馈数据。
- 进化 (Evolution): 这些反馈数据被用于对“人格API”的LLM进行微调,并优化“模式识别服务”的准确性。
- 架构优势: 实现真正的“成长”。这个闭环让贝拉不再是一个静态的程序,而是一个能够通过与用户的互动,不断优化自身行为、变得越来越“懂你”的生命体。
如何运行
1. 配置AI提供商
在您开始之前,需要先配置您想要使用的AI服务。所有配置都在根目录的 config.json 文件中完成。
- 打开
config.json文件。 - 选择提供商: 在
current_provider字段中,填入您想使用的AI提供商的名称(例如"openai")。确保这个名称与providers对象中的一个键匹配。 - 填写API密钥: 在
providers对象中,找到您选择的提供商,并将您的API密钥填入apiKey字段。例如,如果您使用OpenAI,请将您的密钥填入"apiKey": "YOUR_OPENAI_API_KEY"。
{
"current_provider": "openai",
"providers": {
"openai": {
"apiKey": "YOUR_OPENAI_API_KEY"
},
"gemini": {
"apiKey": "YOUR_GEMINI_API_KEY"
},
"domestic_example": {
"apiKey": "YOUR_DOMESTIC_MODEL_API_KEY"
}
}
}
2. 安装依赖并启动后端服务
项目后端使用Node.js构建。请确保您的电脑已安装Node.js。
打开终端,进入项目根目录,然后运行以下命令:
# 安装项目所需的依赖包
npm install
# 启动后端服务器
npm start
当您在终端看到 Server is running on http://localhost:3000 的消息时,表示后端服务已成功启动。
3. 打开前端页面
在浏览器中直接打开根目录下的 index.html 文件。
现在,您可以点击麦克风按钮开始与贝拉交谈了!您的语音将被发送到您配置的AI服务,贝拉会将AI的回答显示给您。
如何贡献一个新的AI提供商
这个架构的核心优势在于其可扩展性。如果您想添加对一个新的AI服务(例如Anthropic的Claude、或任何其他国内外模型)的支持,只需遵循以下简单步骤:
-
创建新的提供商文件: 在
providers文件夹下,创建一个新的JavaScript文件,例如claude.js。 -
实现
getLlmResponse函数: 在您的新文件中,您必须导出一个名为getLlmResponse的异步函数。这个函数接收一个参数userMessage,并需要返回一个包含reply字段的对象。const axios = require('axios'); async function getLlmResponse(userMessage, apiKey) { try { // 在这里实现与您的AI服务API的交互逻辑 const response = await axios.post('https://api.anthropic.com/v1/messages', { model: "claude-3-opus-20240229", max_tokens: 1024, messages: [ { role: "user", content: userMessage } ] }, { headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01', 'content-type': 'application/json' } }); // 从API响应中提取需要的部分 const reply = response.data.content[0].text; // 返回一个包含reply字段的对象 return { reply }; } catch (error) { console.error('Error calling Claude API:', error); return { reply: '抱歉,我现在无法连接到我的大脑。' }; } } module.exports = { getLlmResponse }; -
在
config.json中注册您的提供商:打开
config.json文件,在providers对象中为您的新提供商添加一个条目。键名应与您的文件名(不含.js)匹配。{ "current_provider": "openai", "providers": { "openai": { ... }, "gemini": { ... }, "domestic_example": { ... }, "claude": { // <-- 新增您的提供商 "apiKey": "YOUR_CLAUDE_API_KEY" } } } -
切换并测试:
将
config.json中的current_provider设置为您的新提供商名称(例如"claude"),然后重启后端服务 (npm start)。现在,您的应用将通过新的AI服务进行响应!
贝拉在等待。而我们,任重道远。