2026-07-03 08:53:56 +08:00
|
|
|
"""
|
|
|
|
|
记忆域类型定义
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
2026-07-10 09:14:06 +08:00
|
|
|
from zhenxun.services.ai.utils.scope import ScopeBuilder
|
|
|
|
|
|
|
|
|
|
from .storage.interfaces import (
|
2026-07-03 08:53:56 +08:00
|
|
|
BaseChatContext,
|
|
|
|
|
BaseMemoryIngestionMiddleware,
|
|
|
|
|
BaseMemoryReducer,
|
|
|
|
|
)
|
2026-07-10 09:14:06 +08:00
|
|
|
from .types import (
|
2026-07-03 08:53:56 +08:00
|
|
|
Isolation,
|
|
|
|
|
SessionMetadata,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MemoryScoringConfig(BaseModel):
|
|
|
|
|
"""长期记忆的复合打分与检索配置"""
|
|
|
|
|
|
|
|
|
|
recency_weight: float = Field(default=0.3)
|
|
|
|
|
"""时间衰减权重"""
|
|
|
|
|
semantic_weight: float = Field(default=0.5)
|
|
|
|
|
"""语义相似度权重"""
|
|
|
|
|
importance_weight: float = Field(default=0.2)
|
|
|
|
|
"""重要性权重"""
|
|
|
|
|
recency_half_life_days: int = Field(default=30)
|
|
|
|
|
"""时间衰减的半衰期(天)"""
|
|
|
|
|
reinforcement_weight: float = Field(default=0.2)
|
|
|
|
|
"""访问强化的加权权重 (被检索越多得分越高)"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ShortTermConfig(BaseModel):
|
|
|
|
|
"""短期对话记忆配置"""
|
|
|
|
|
|
|
|
|
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
|
|
|
|
|
|
|
|
enable: bool = Field(default=True)
|
|
|
|
|
"""是否启用短期对话记忆上下文"""
|
|
|
|
|
backend: str | BaseChatContext | None = Field(default=None)
|
|
|
|
|
"""
|
|
|
|
|
指定底层短期记忆数据库注册名称,或直接传入 BaseChatContext 实例。
|
|
|
|
|
为空则使用全局默认
|
|
|
|
|
"""
|
|
|
|
|
isolation: ScopeBuilder = Field(default_factory=Isolation.AGENT_USER)
|
|
|
|
|
"""单一的记忆隔离级别 (ScopeBuilder),决定短期记忆存储边界"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ContextCompressionConfig(BaseModel):
|
|
|
|
|
"""上下文压缩与管理配置"""
|
|
|
|
|
|
|
|
|
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
|
|
|
|
|
|
|
|
threshold: float | None = Field(default=None)
|
|
|
|
|
"""(局部重写) 触发记忆压缩的 Token 阈值"""
|
|
|
|
|
max_history_turns: int | None = Field(default=None)
|
|
|
|
|
"""(局部重写) 触发记忆压缩的对话轮数上限。设为 0 表示不限制轮数。"""
|
|
|
|
|
vision_window: int | None = Field(default=None)
|
|
|
|
|
"""多模态滑动窗口大小。0表示关闭该功能,>0表示仅保留最近N轮包含多模态数据的消息,None表示跟随全局配置。"""
|
|
|
|
|
policy: list[BaseMemoryReducer] | None = Field(default=None)
|
|
|
|
|
"""核心记忆压缩策略管线 (List[BaseMemoryReducer])。为 None 时将应用全局默认策略。"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class IngestionConfig(BaseModel):
|
|
|
|
|
"""记忆入库管线配置"""
|
|
|
|
|
|
|
|
|
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
|
|
|
|
|
|
|
|
middlewares: list[BaseMemoryIngestionMiddleware] = Field(default_factory=list)
|
|
|
|
|
"""入库中间件列表(按顺序依次执行清洗过滤)"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MemoryConfig(BaseModel):
|
|
|
|
|
"""统一的记忆配置项声明"""
|
|
|
|
|
|
|
|
|
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
|
|
|
short_term: ShortTermConfig = Field(default_factory=ShortTermConfig)
|
|
|
|
|
"""短期对话记忆配置"""
|
|
|
|
|
compression: ContextCompressionConfig = Field(
|
|
|
|
|
default_factory=ContextCompressionConfig
|
|
|
|
|
)
|
|
|
|
|
"""上下文压缩与管理配置"""
|
|
|
|
|
ingestion: IngestionConfig = Field(default_factory=IngestionConfig)
|
|
|
|
|
"""记忆入库前的清洗与过滤管线配置"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__all__ = [
|
|
|
|
|
"BaseMemoryIngestionMiddleware",
|
|
|
|
|
"ContextCompressionConfig",
|
|
|
|
|
"IngestionConfig",
|
|
|
|
|
"Isolation",
|
|
|
|
|
"MemoryConfig",
|
|
|
|
|
"MemoryScoringConfig",
|
|
|
|
|
"SessionMetadata",
|
|
|
|
|
"ShortTermConfig",
|
|
|
|
|
]
|