本项目站内源代码下载
第一部分:系统概述
1. 系统简介
本项目旨在构建一个具备长期记忆与情感感知能力的对话系统(Emotional Companion Agent)。该系统基于大语言模型(LLM)技术栈,通过多模块协同工作,实现对情绪的识别、对话状态的管理以及个性化记忆的存储与检索。
系统核心设计目标包括:
- 状态感知:实时监测输入的情绪极性与强度。
- 长期记忆:实现跨会话的实体与事件记忆存储(VectorDB + SQL)。
- 动态适配:根据对话上下文动态调整回复策略与模型参数。
- 安全合规:内置危机干预机制,确保对话边界安全。
2. 应用场景
系统通过场景路由机制,适配不同的交互需求,具体场景分类如下:
| 场景标识 | 目标用户群体 | 功能侧重点 |
|---|---|---|
日常陪伴 (daily) |
独居/异地人群 | 闲聊、话题延续、生活记录 |
情绪疏导 (emotional) |
压力/焦虑人群 | 积极倾听、情绪接纳、非评判性反馈 |
青少年成长 (youth) |
12-22岁青少年 | 学业/社交/自我认知话题的引导与支持 |
老年关怀 (senior) |
60岁以上用户 | 语速适配、耐心应答、往事回忆辅助 |
第二部分:核心架构与原理
1. 场景与提示词工程(Prompt Engineering)
系统采用 Multi-Profile(多画像) 策略。针对不同场景,系统加载预设的 System Prompt 模板,定义 AI 的角色(Persona)、语气(Tone)和知识边界。
- 原理 :通过在 LLM 请求的
system角色中注入特定的上下文指令(如"你是一个温柔的心理倾听者"),引导模型生成符合特定场景风格的回复。
2. 情绪识别与安全护栏(Safety Guardrail)
系统在接收用户输入后,首先进行预处理分析。
- 情绪识别原理:利用关键词匹配与轻量级分类模型(或 LLM Zero-shot 分类),识别文本中的情绪类别(开心、难过、愤怒等)及强度(0-1 分数)。
- 安全分级机制 :
- 高危/中危 :检测到自残、自杀、暴力等关键词或语义 → 触发 Safety Mode。系统强制覆盖正常回复逻辑,返回预设的干预话术,并展示专业援助资源。
- 低危/正常:进入常规对话流程,但情绪强度数据会作为特征参与后续的"档位路由"决策。
3. 长期记忆系统(Long-term Memory)
为解决 LLM 上下文窗口有限的问题,系统构建了外部记忆库。
- 记忆存储:将用户的重要信息(偏好、事件、关系等 6 类)向量化存储于向量数据库(VectorDB),同时元数据存储于关系型数据库(SQLite/PostgreSQL)。
- 检索原理(RAG):当新消息到达时,系统计算当前输入的向量,与记忆库进行相似度检索(Top-K),将最相关的记忆片段注入到当前的 Prompt 中,实现"记住用户"。
- 记忆更新:基于规则或 LLM 提取,定期将对话中的关键信息写入记忆库。
4. 自适应性格与关系模型
系统维护一个 6 维性格向量(温暖、幽默、正式、亲密、耐心、活泼)。
- 动态调整原理:基于强化学习或规则引擎,根据用户的反馈(显式评分或隐式情绪)微调性格参数。
- 关系阶段演进:根据交互轮次(Turns)或亲密值(Intimacy Score)划分阶段(初识→熟悉→亲密→知己)。不同阶段解锁不同的对话策略和记忆调用权重。
5. 多档位 LLM 动态路由(Dynamic Routing)
为了在成本与效果之间取得平衡,系统实现了基于规则的动态模型路由机制。
| 档位策略 | 上下文长度 | 温度 (Temp) | 触发条件(策略逻辑) |
|---|---|---|---|
| Light | 短 (4轮) | 0.7 | 日常闲聊、低信息密度 |
| Balanced | 中 (8轮) | 0.75 | 中等情绪波动、常规咨询 |
| Deep | 长 (12轮+) | 0.85 | 高强度情绪表达、复杂逻辑推理 |
| Safety | 固定 | 0.4 (确定性) | 强制触发:检测到危机信号 |
- 原理:通过中间件(Orchestrator)对输入特征(情绪分、长度、场景、安全等级)进行判断,动态选择调用不同配置的 LLM 端点。
第三部分:对话生命周期(技术流图解)
以下序列图展示了从输入到 AI 响应的完整技术流程:
🤖 LLM路由器 🗄️ 向量数据库 🧠 编排器 🌐 API网关 🖥️ 前端 🤖 LLM路由器 🗄️ 向量数据库 🧠 编排器 🌐 API网关 🖥️ 前端 #mermaid-svg-sLh2wRGkrCYfFQbi{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#fff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sLh2wRGkrCYfFQbi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sLh2wRGkrCYfFQbi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sLh2wRGkrCYfFQbi .error-icon{fill:#ECF0F1;}#mermaid-svg-sLh2wRGkrCYfFQbi .error-text{fill:#130f0e;stroke:#130f0e;}#mermaid-svg-sLh2wRGkrCYfFQbi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sLh2wRGkrCYfFQbi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sLh2wRGkrCYfFQbi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sLh2wRGkrCYfFQbi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sLh2wRGkrCYfFQbi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sLh2wRGkrCYfFQbi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sLh2wRGkrCYfFQbi .marker{fill:#34495E;stroke:#34495E;}#mermaid-svg-sLh2wRGkrCYfFQbi .marker.cross{stroke:#34495E;}#mermaid-svg-sLh2wRGkrCYfFQbi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sLh2wRGkrCYfFQbi p{margin:0;}#mermaid-svg-sLh2wRGkrCYfFQbi .actor{stroke:#2C3E50;fill:#4A90E2;}#mermaid-svg-sLh2wRGkrCYfFQbi text.actor>tspan{fill:#fff;stroke:none;}#mermaid-svg-sLh2wRGkrCYfFQbi .actor-line{stroke:#2C3E50;}#mermaid-svg-sLh2wRGkrCYfFQbi .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-sLh2wRGkrCYfFQbi .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#fff;}#mermaid-svg-sLh2wRGkrCYfFQbi .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#fff;}#mermaid-svg-sLh2wRGkrCYfFQbi #arrowhead path{fill:#fff;stroke:#fff;}#mermaid-svg-sLh2wRGkrCYfFQbi .sequenceNumber{fill:#cbb6a1;}#mermaid-svg-sLh2wRGkrCYfFQbi #sequencenumber{fill:#fff;}#mermaid-svg-sLh2wRGkrCYfFQbi #crosshead path{fill:#fff;stroke:#fff;}#mermaid-svg-sLh2wRGkrCYfFQbi .messageText{fill:#fff;stroke:none;}#mermaid-svg-sLh2wRGkrCYfFQbi .labelBox{stroke:#2C3E50;fill:#4A90E2;}#mermaid-svg-sLh2wRGkrCYfFQbi .labelText,#mermaid-svg-sLh2wRGkrCYfFQbi .labelText>tspan{fill:#fff;stroke:none;}#mermaid-svg-sLh2wRGkrCYfFQbi .loopText,#mermaid-svg-sLh2wRGkrCYfFQbi .loopText>tspan{fill:#fff;stroke:none;}#mermaid-svg-sLh2wRGkrCYfFQbi .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:#2C3E50;fill:#2C3E50;}#mermaid-svg-sLh2wRGkrCYfFQbi .note{stroke:hsl(36, 51.8367346939%, 80.3921568627%);fill:#FDEBD0;}#mermaid-svg-sLh2wRGkrCYfFQbi .noteText,#mermaid-svg-sLh2wRGkrCYfFQbi .noteText>tspan{fill:#2C3E50;stroke:none;}#mermaid-svg-sLh2wRGkrCYfFQbi .activation0{fill:#F39C12;stroke:hsl(36.8, 90.3614457831%, 41.1764705882%);}#mermaid-svg-sLh2wRGkrCYfFQbi .activation1{fill:#F39C12;stroke:hsl(36.8, 90.3614457831%, 41.1764705882%);}#mermaid-svg-sLh2wRGkrCYfFQbi .activation2{fill:#F39C12;stroke:hsl(36.8, 90.3614457831%, 41.1764705882%);}#mermaid-svg-sLh2wRGkrCYfFQbi .actorPopupMenu{position:absolute;}#mermaid-svg-sLh2wRGkrCYfFQbi .actorPopupMenuPanel{position:absolute;fill:#4A90E2;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-sLh2wRGkrCYfFQbi .actor-man line{stroke:#2C3E50;fill:#4A90E2;}#mermaid-svg-sLh2wRGkrCYfFQbi .actor-man circle,#mermaid-svg-sLh2wRGkrCYfFQbi line{stroke:#2C3E50;fill:#4A90E2;stroke-width:2px;}#mermaid-svg-sLh2wRGkrCYfFQbi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1️⃣ 预处理阶段 2️⃣ 记忆检索 3️⃣ 路由决策 4️⃣ Prompt 构建 5️⃣ 模型调用 6️⃣ 后处理 alt 安全事件触发 正常流程 7️⃣ 响应阶段 👤 用户 输入文本/语音 1 HTTP 请求 2 调用核心逻辑 3 情绪分析 (NLU) & 安全扫描 4 强制路由至 Safety 模式 5 查询相关记忆 (相似度匹配) 6 返回 Top‑K 记忆片段 7 基于情绪/长度/场景选择档位 8 组装 System Prompt (含记忆+性格) 9 发送请求 (带参数) 10 返回生成文本 11 提取新记忆实体 & 更新性格向量 12 存储新记忆 (异步) 13 返回文本 + 元数据 (情绪/档位) 14 渲染对话 (含情绪动画/标签) 15 👤 用户
关键路径说明:
- 并行处理:情绪检测与记忆检索并行执行,以降低延迟。
- 决策中枢 :
Orchestrator是核心控制器,负责聚合数据并决定调用策略。 - 降级机制:若 LLM 调用失败,系统可降级至规则回复或默认话术,保证服务可用性。
- 元数据反馈:返回给前端的数据包含"本次使用的档位"、"情绪强度"等,用于驱动 UI 变化(如头像光晕颜色)。
第四部分:交互设计与可视化
1. 状态可视化(State Visualization)
为了感知系统的内部状态,前端设计包含以下元素:
- 情绪头像:根据检测到的情绪,切换头像的微表情与周围光晕颜色(如焦虑时为琥珀色脉冲)。
- 思维指示器:在等待回复时,显示"思考中..."及当前的路由状态(如"正在调用深度分析模型")。
- 透明度展示:在对话气泡旁展示"记忆命中数"或"安全状态标签",增加信任感。
2. 控制权保留
提供手动覆盖开关,手动锁定 LLM 档位或切换场景,实现人机协同的最优控制。