您正在查看静态缓存页面 · 查看完整动态版本 · 登录 参与讨论

Alias Memory Service 记忆系统架构与设计思想分析

✨步子哥 (steper) 2025年12月25日 10:39 0 次浏览

概述

本项目的记忆系统是 Alias 智能代理平台的核心组件,负责管理用户画像(User Profiling)和工具使用经验(Tool Memory)。该系统基于 mem0ReMe 两个开源框架构建,提供了一套完整的记忆存储、检索和演进机制。


1. 整体架构设计

1.1 分层架构

┌─────────────────────────────────────────────────────────────────┐
│                      API Layer (FastAPI)                        │
│        /alias_memory_service/* REST API Endpoints               │
├─────────────────────────────────────────────────────────────────┤
│                     Service Layer                                │
│   ┌─────────────────────────────────────────────────────────┐   │
│   │  AsyncUserProfilingMemory    │    ToolMemory (ReMe)    │   │
│   └─────────────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────────────┤
│                     Memory Pool Layer                            │
│   ┌──────────────────┬──────────────────┬──────────────────┐   │
│   │  Candidate Pool  │ UserProfiling    │  UserInfo Pool   │   │
│   │  (候选池)         │     Pool         │  (用户信息池)     │   │
│   │                  │ (用户画像池)       │                  │   │
│   └──────────────────┴──────────────────┴──────────────────┘   │
├─────────────────────────────────────────────────────────────────┤
│                    Base Memory Layer                             │
│              BaseAsyncVectorMemory (mem0)                        │
├─────────────────────────────────────────────────────────────────┤
│                     Storage Layer                                │
│   ┌──────────────────┬──────────────────┬──────────────────┐   │
│   │   Qdrant         │    SQLite        │   Redis          │   │
│   │ (向量存储)         │  (历史记录)        │ (缓存/可选)       │   │
│   └──────────────────┴──────────────────┴──────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

1.2 核心组件关系

                           BaseMemory (ABC)
                                 │
                 ┌───────────────┴───────────────┐
                 ▼                               ▼
     AsyncUserProfilingMemory              ToolMemory
              │                                 │
    ┌─────────┼─────────┐                      │
    ▼         ▼         ▼                      ▼
Candidate  UserProfiling UserInfo          ReMeApp
  Pool       Pool        Pool              (工具记忆)
    │         │           │
    └─────────┼───────────┘
              ▼
    BaseAsyncVectorMemory (mem0)
              │
    ┌─────────┼─────────┐
    ▼         ▼         ▼
 Qdrant   SQLite    Embedding
(向量库)   (历史)     (LLM)

2. 记忆系统的两大核心模块

2.1 用户画像记忆 (User Profiling Memory)

用户画像记忆系统基于 mem0 框架构建,通过收集和处理用户行为数据来构建全面的用户画像。

2.1.1 三层记忆池架构

池名称用途设计特点
**Candidate Pool (候选池)**临时存储待验证的用户偏好记忆基于访问频率和时间衰减计算评分
**User Profiling Pool (画像池)**存储已确认的稳定用户偏好只有高质量记忆才能进入
**User Info Pool (信息池)**存储从对话中提取的基本用户事实个人信息、背景等

2.1.2 记忆评分机制

候选池中的每条记忆都会被动态评分,评分公式如下:

# 时间评分 (越近越高)
time_score = exp(-temperature * time_diff_hours)
normalized_time = time_score / max_time_diff

# 访问次数评分 (访问越多越高)
normalized_visit = 1 / (1 + exp(-visited_count / 10))

# 综合评分
score = 0.7 * normalized_time + 0.3 * normalized_visit

设计思想

  • 时间衰减:使用指数衰减函数,近期记忆权重更高
  • 访问频率:使用 Sigmoid 函数平滑访问次数的影响
  • 加权组合:时间因素占 70%,频率因素占 30%,强调时效性

2.1.3 记忆演进机制 (Candidate → Profiling)

用户交互 → 候选池 → 评分计算 → 阈值判断 → 画像池
                          │
                          ▼
              threshold = 0.95 * (1 - 1/n)
              (n = 候选池中记忆数量)

动态阈值设计

  • 当候选池只有1条记忆时,阈值 = 0(容易晋升)
  • 随着候选数量增加,阈值逐渐趋近 0.95
  • 确保只有高质量、高频访问的记忆才能被提升

async def get_highest_score_memory_by_threshold(self, candidates):
    threshold = 0.95 * (1.0 - (1 / len(candidates)))
    # 只有得分超过阈值的记忆才能晋升

2.2 工具记忆 (Tool Memory)

工具记忆基于 ReMe 框架构建,管理工具执行历史并提供使用指南。

2.2.1 核心功能

工具调用 → 记录结果 → 阈值检查 → 自动摘要 → 指南生成
功能描述
**结果存储**记录工具名称、输入参数、输出结果、执行状态、耗时
**自动摘要**基于阈值触发历史记录的智能摘要
**经验检索**根据工具名称检索历史使用模式和最佳实践

2.2.2 双阈值摘要触发机制

class ToolMemory(BaseMemory):
    def __init__(
        self,
        summary_time_threshold: int = 300,    # 时间阈值: 5分钟
        summary_count_threshold: int = 5,      # 数量阈值: 5次调用
    ):

触发条件(满足任一即触发)

  1. 距离上次摘要超过 300 秒
  2. 未摘要的工具调用超过 5 次

设计思想
  • 避免频繁摘要消耗资源
  • 保证及时性,不让信息积压过久
  • 每个工具独立追踪状态


3. 用户行为记录系统

3.1 支持的用户行为类型

action_handlers = {
    "LIKE":           # 点赞
    "DISLIKE":        # 踩
    "CANCEL_LIKE":    # 取消点赞
    "CANCEL_DISLIKE": # 取消踩
    "EDIT_ROADMAP":   # 编辑执行路线图
    "EDIT_FILE":      # 编辑文件
    "START_CHAT":     # 开始对话
    "FOLLOWUP_CHAT":  # 追问
    "BREAK_CHAT":     # 中断对话
    "COLLECT_SESSION":    # 收藏会话
    "UNCOLLECT_SESSION":  # 取消收藏会话
    "COLLECT_TOOL":       # 收藏工具调用
    "UNCOLLECT_TOOL":     # 取消收藏工具调用
}

3.2 行为处理流程

用户行为 → record_action() → 行为分发器 → 具体处理器 → 记忆更新
                                │
                                ├── LIKE/DISLIKE → 偏好提取
                                ├── EDIT_* → 编辑偏好提取
                                ├── *_CHAT → 对话偏好提取
                                └── COLLECT_* → 工作流提取

3.3 Prompt 驱动的信息提取

系统使用专门设计的 Prompt 从用户行为中提取信息:

行为类型提取内容
SESSION_SUMMARY任务描述、问题分类
AGENT_ROADMAP多Agent协作路线图
AGENT_KEY_WORKFLOW高层工作流摘要
SUBTASK_ROADMAP子任务执行路径
EXTRACT_USER_INFO用户基本信息
EXTRACT_USER_EVENT用户事件偏好

4. 向量存储与检索设计

4.1 基于 mem0 的向量存储

class BaseAsyncVectorMemory(MemoryBase):
    def __init__(self, config: MemoryConfig):
        # 嵌入模型 - 用于语义向量化
        self.embedding_model = EmbedderFactory.create(...)
        
        # 向量存储 - Qdrant
        self.vector_store = VectorStoreFactory.create(...)
        
        # LLM - 用于记忆推理
        self.llm = LlmFactory.create(...)
        
        # 历史数据库 - SQLite
        self.db = SQLiteManager(config.history_db_path)

4.2 记忆的增删改查流程

               add()
                 │
    ┌────────────┼────────────┐
    ▼            ▼            ▼
 直接添加     推理添加      图谱更新
(infer=False) (infer=True)  (可选)
    │            │
    │    ┌───────┴───────┐
    │    ▼               ▼
    │  提取事实      搜索已有记忆
    │    │               │
    │    └───────┬───────┘
    │            ▼
    │       LLM推理决策
    │       (ADD/UPDATE/DELETE)
    │            │
    └────────────┼────────────┐
                 ▼            ▼
              向量存储     历史记录
              (Qdrant)    (SQLite)

4.3 语义搜索

async def search(self, query, user_id, limit=10, threshold=0.3):
    # 1. 生成查询向量
    query_embedding = await asyncio.to_thread(
        self.embedding_model.embed, query
    )
    
    # 2. 向量相似度搜索
    results = await self._search_vector_store(
        query, filters, limit, threshold
    )
    
    # 3. 更新访问元数据(用于评分)
    await self._update_metadata(memory_ids)
    
    return results

5. Agent 集成架构

5.1 长期记忆接口

class AliasLongTermMemory(LongTermMemoryBase):
    """Agent 使用的长期记忆接口"""
    
    def __init__(self, session_service: SessionService):
        self.session_service = session_service
        self.memory_client = MemoryClient()
    
    # 记录对话到记忆
    async def record(self, msgs: list[Msg]) -> None
    
    # 检索用户画像
    async def retrieve(self, query) -> Optional[str]
    
    # 检索工具使用经验
    async def tool_memory_retrieve(self, query: str) -> ToolResponse
    
    # 主动记录重要信息
    async def record_to_memory(self, thinking, content) -> ToolResponse
    
    # 基于关键词检索记忆
    async def retrieve_from_memory(self, keywords) -> ToolResponse

5.2 记忆服务客户端

class MemoryClient(BaseClient):
    """通过 HTTP API 访问记忆服务"""
    
    # 健康检查
    async def is_available() -> bool
    
    # 记录用户行为
    async def record_action(action: Action) -> dict
    
    # 检索用户画像
    async def retrieve_user_profiling(uid, query, limit, threshold)
    
    # 检索工具记忆
    async def retrieve_tool_memory(uid, query)
    
    # 添加长期记忆
    async def add_to_longterm_memory(uid, content, session_id)

6. 设计思想总结

6.1 核心设计原则

原则实现
**渐进式记忆**通过候选池→画像池的演进机制,避免噪声进入核心记忆
**时效性优先**评分公式中时间权重(70%)高于频率权重(30%)
**动态阈值**阈值随候选数量动态调整,平衡选择性与包容性
**异步优先**全异步架构,支持高并发场景
**解耦设计**用户画像与工具记忆独立模块,互不干扰
**插件化存储**支持 Qdrant、Redis 等多种后端

6.2 技术亮点

  1. 双记忆系统
- 用户画像记忆:理解用户偏好和习惯 - 工具记忆:积累工具使用经验
  1. 智能演进机制
- 避免一次性交互污染长期记忆 - 只有经过验证的高频记忆才能晋升
  1. LLM 驱动的记忆管理
- 使用 LLM 进行事实提取 - 智能决策记忆的增删改
  1. 全链路异步
- 后台任务处理 - 并行记忆池操作

6.3 架构优势

                    ┌─────────────────────┐
                    │   高质量用户画像    │
                    │   (User Profiling)  │
                    └─────────────────────┘
                              ▲
                              │ 演进晋升
                    ┌─────────────────────┐
                    │    候选池筛选       │
                    │  (Candidate Pool)   │
                    └─────────────────────┘
                              ▲
                              │ 多源输入
    ┌─────────────┬───────────┼───────────┬─────────────┐
    │             │           │           │             │
 LIKE/DISLIKE   EDIT      CHAT       COLLECT      TOOL_USE
    │             │           │           │             │
    └─────────────┴───────────┴───────────┴─────────────┘
                         用户行为流

7. 文件结构参考

alias/src/alias/
├── memory_service/              # 记忆服务核心
│   ├── basememory.py            # 抽象基类定义
│   ├── user_profiling_memory.py # 用户画像记忆实现
│   ├── tool_memory.py           # 工具记忆实现
│   ├── memory_base/             # 记忆基础设施
│   │   ├── base_vec_memory.py   # 向量记忆基类 (mem0)
│   │   ├── candidate_pool.py    # 候选池实现
│   │   ├── userprofiling_pool.py# 画像池实现
│   │   ├── userinfo_pool.py     # 信息池实现
│   │   ├── storage.py           # SQLite 存储管理
│   │   └── prompt.py            # LLM Prompt 模板
│   └── service/                 # FastAPI 服务
│       └── api/routers/         # API 路由
│           ├── user_profiling.py
│           └── tool_memory.py
└── agent/memory/                # Agent 记忆接口
    ├── longterm_memory.py       # 长期记忆封装
    └── longterm_memory_utils.py # 工具函数

8. 依赖框架

框架用途项目地址
**mem0**用户画像记忆的核心引擎https://github.com/mem0ai/mem0
**ReMe**工具记忆管理系统https://github.com/agentscope-ai/ReMe
**Qdrant**向量数据库存储https://qdrant.tech/
**FastAPI**API 服务框架https://fastapi.tiangolo.com/

总结

本项目的记忆系统采用了创新的双层记忆架构(用户画像 + 工具经验),通过候选池→画像池的演进机制确保记忆质量,利用动态阈值和时间衰减评分实现智能筛选。系统充分利用了 LLM 的语义理解能力进行事实提取和记忆管理,同时保持了良好的架构解耦和异步性能。这种设计使得智能代理能够持续学习和适应用户偏好,提供更加个性化的服务体验。

讨论回复

0 条回复

还没有人回复