Files
AIChatRoom/backend/models/agent_memory.py

124 lines
3.9 KiB
Python
Raw Permalink Normal View History

"""
Agent记忆数据模型
定义Agent的记忆存储结构
"""
from datetime import datetime
from typing import Optional, List
from enum import Enum
from pydantic import Field
from beanie import Document
class MemoryType(str, Enum):
"""记忆类型枚举"""
SHORT_TERM = "short_term" # 短期记忆(会话内)
LONG_TERM = "long_term" # 长期记忆(跨会话)
EPISODIC = "episodic" # 情景记忆(特定事件)
SEMANTIC = "semantic" # 语义记忆(知识性)
class AgentMemory(Document):
"""
Agent记忆文档模型
存储Agent的记忆内容
"""
memory_id: str = Field(..., description="唯一标识")
agent_id: str = Field(..., description="Agent ID")
# 记忆内容
memory_type: str = Field(
default=MemoryType.SHORT_TERM.value,
description="记忆类型"
)
content: str = Field(..., description="记忆内容")
summary: str = Field(default="", description="内容摘要")
# 向量嵌入(用于相似度检索)
embedding: List[float] = Field(default_factory=list, description="向量嵌入")
# 元数据
importance: float = Field(default=0.5, ge=0, le=1, description="重要性评分")
access_count: int = Field(default=0, description="访问次数")
# 关联信息
source_room_id: Optional[str] = Field(default=None, description="来源聊天室ID")
source_discussion_id: Optional[str] = Field(default=None, description="来源讨论ID")
related_agents: List[str] = Field(default_factory=list, description="相关Agent列表")
tags: List[str] = Field(default_factory=list, description="标签")
# 时间戳
created_at: datetime = Field(default_factory=datetime.utcnow)
last_accessed: datetime = Field(default_factory=datetime.utcnow)
expires_at: Optional[datetime] = Field(default=None, description="过期时间")
class Settings:
name = "agent_memories"
indexes = [
[("agent_id", 1)],
[("memory_type", 1)],
[("importance", -1)],
[("last_accessed", -1)],
]
def access(self) -> None:
"""
记录访问更新访问计数和时间
"""
self.access_count += 1
self.last_accessed = datetime.utcnow()
def is_expired(self) -> bool:
"""
检查记忆是否已过期
Returns:
是否过期
"""
if self.expires_at is None:
return False
return datetime.utcnow() > self.expires_at
def calculate_relevance_score(
self,
similarity: float,
time_decay_factor: float = 0.1
) -> float:
"""
计算综合相关性分数
结合向量相似度重要性和时间衰减
Args:
similarity: 向量相似度 (0-1)
time_decay_factor: 时间衰减因子
Returns:
综合相关性分数
"""
# 计算时间衰减
hours_since_access = (datetime.utcnow() - self.last_accessed).total_seconds() / 3600
time_decay = 1.0 / (1.0 + time_decay_factor * hours_since_access)
# 综合评分
score = (
0.5 * similarity +
0.3 * self.importance +
0.2 * time_decay
)
return min(1.0, max(0.0, score))
class Config:
json_schema_extra = {
"example": {
"memory_id": "mem-001",
"agent_id": "product-manager",
"memory_type": "long_term",
"content": "在登录系统设计讨论中团队决定采用OAuth2.0方案",
"summary": "登录系统采用OAuth2.0",
"importance": 0.8,
"access_count": 5,
"source_room_id": "product-design-room",
"tags": ["登录", "OAuth", "认证"]
}
}