Logic Memory 是 Aster SDK 的第四种 Memory 类型,专门用于存储和管理用户偏好、行为模式和学习到的规则。与其他 Memory 类型不同,Logic Memory 专注于从用户交互中自动学习,并在后续交互中应用这些学习成果。
| 特性 | Text Memory | Working Memory | Semantic Memory | Logic Memory |
|---|---|---|---|---|
| 用途 | 长期知识存储 | 临时状态管理 | 语义检索 | 用户偏好和行为模式 |
| 格式 | Markdown 文件 | JSON Schema | 向量 + Metadata | 结构化对象 |
| 检索 | 文件路径/Grep | Key-Value | 向量相似度 | 类型/作用域/置信度 |
| 作用域 | Namespace | Thread/Resource | Namespace | Session/User/Global |
| 典型场景 | agent.md, 文档 | 对话上下文 | RAG, 素材检索 | 风格偏好、修改习惯 |
Logic Memory 让 AI Agent 能够:
package main
import (
"github.com/astercloud/aster/pkg/memory/logic"
"github.com/astercloud/aster/pkg/middleware"
)
func main() {
// 1. 创建存储后端
store := logic.NewInMemoryStore() // 或 NewPostgreSQLStore(db)
// 2. 创建 Manager
manager, err := logic.NewManager(&logic.ManagerConfig{
Store: store,
})
if err != nil {
panic(err)
}
// 3. 配置 Middleware
mw := middleware.NewLogicMemoryMiddleware(&middleware.LogicMemoryConfig{
Manager: manager,
EnableCapture: true,
EnableInjection: true,
MaxMemories: 5,
MinConfidence: 0.6,
})
// 4. 注册到 Agent
// deps.MiddlewareStack.Add(mw)
}
ctx := context.Background()
mem := &logic.LogicMemory{
Namespace: "user:123",
Scope: logic.ScopeUser,
Type: "preference",
Key: "writing_tone",
Value: "casual",
Description: "用户偏好口语化的写作风格",
Provenance: &memory.MemoryProvenance{
SourceType: memory.SourceUserInput,
Confidence: 0.8,
},
}
err := manager.RecordMemory(ctx, mem)
// 检索所有 Memory
memories, err := manager.RetrieveMemories(ctx, "user:123")
// 带过滤条件
memories, err := manager.RetrieveMemories(ctx, "user:123",
logic.WithTopK(5), // 最多返回 5 条
logic.WithMinConfidence(0.7), // 最低置信度 0.7
logic.WithType("preference"), // 只返回偏好类型
)
Logic Memory 支持三种作用域:
const (
ScopeSession MemoryScope = "session" // 单次会话,会话结束后失效
ScopeUser MemoryScope = "user" // 用户级别,跨会话持久化
ScopeGlobal MemoryScope = "global" // 全局,跨用户共享
)
Type 字段用于分类 Memory,常见类型包括:
preference - 用户偏好(语气、风格、格式)behavior - 行为模式(操作习惯、使用频率)rule - 学习到的规则(约束、规范)feedback - 用户反馈(评价、修正)每个 Memory 都有一个置信度分数(0.0-1.0):
置信度会随着:
PatternMatcher 是 Logic Memory 的核心扩展点,用于从事件中自动识别和提取 Memory。
type PatternMatcher interface {
// 从事件中识别 Memory
MatchEvent(ctx context.Context, event Event) ([]*LogicMemory, error)
// 支持的事件类型
SupportedEventTypes() []string
}
type WritingPatternMatcher struct{}
func (m *WritingPatternMatcher) SupportedEventTypes() []string {
return []string{"user_revision", "user_feedback"}
}
func (m *WritingPatternMatcher) MatchEvent(ctx context.Context, event Event) ([]*LogicMemory, error) {
switch event.Type {
case "user_revision":
return m.matchRevision(event)
case "user_feedback":
return m.matchFeedback(event)
}
return nil, nil
}
func (m *WritingPatternMatcher) matchRevision(event Event) ([]*LogicMemory, error) {
original := event.Data["original"].(string)
revised := event.Data["revised"].(string)
var memories []*LogicMemory
// 示例:检测是否删除了正式用语
if containsFormalWords(original) && !containsFormalWords(revised) {
memories = append(memories, &LogicMemory{
Namespace: event.Source,
Scope: ScopeUser,
Type: "preference",
Key: "casual_tone",
Value: true,
Description: "用户偏好口语化表达,避免使用书面语",
Provenance: &memory.MemoryProvenance{
SourceType: memory.SourceUserInput,
Confidence: 0.7,
},
})
}
return memories, nil
}
manager, err := logic.NewManager(&logic.ManagerConfig{
Store: store,
Matchers: []logic.PatternMatcher{
&WritingPatternMatcher{},
&BehaviorPatternMatcher{},
},
})
type Event struct {
Type string // 事件类型
Source string // 来源(user_id, agent_id)
Data map[string]any // 事件数据
Timestamp time.Time // 时间戳
}
| 事件类型 | 描述 | 典型数据 |
|---|---|---|
user_message | 用户发送消息 | {content, intent} |
user_revision | 用户修改内容 | {original, revised} |
user_feedback | 用户评价 | {rating, comment} |
tool_result | 工具执行结果 | {tool, success, output} |
agent_response | Agent 响应 | {content, tokens} |
event := logic.Event{
Type: "user_revision",
Source: "user:123",
Data: map[string]any{
"original": "然而,这个方法有几个缺点...",
"revised": "不过,这个方法有几个问题...",
},
Timestamp: time.Now(),
}
err := manager.ProcessEvent(ctx, event)
当多个相似的 Memory 存在时,ConsolidationEngine 会自动合并它们。
engine := logic.NewConsolidationEngine(&logic.ConsolidationConfig{
SimilarityThreshold: 0.85, // 相似度阈值
MergeStrategy: logic.MergeStrategyKeepNewest,
})
result, err := engine.Consolidate(ctx, memories)
const (
MergeStrategyKeepNewest = "keep_newest" // 保留最新
MergeStrategyKeepHighestConfidence = "keep_highest_confidence" // 保留最高置信度
MergeStrategyMergeDescriptions = "merge_descriptions" // 合并描述
)
定期清理低价值的 Memory 以保持系统性能。
criteria := logic.PruneCriteria{
MinConfidence: 0.3, // 置信度低于 0.3
SinceLastAccess: 30 * 24 * time.Hour, // 30 天未访问
MinAccessCount: 2, // 访问次数少于 2
MaxAge: 90 * 24 * time.Hour, // 创建超过 90 天
}
count, err := manager.PruneMemories(ctx, criteria)
store := logic.NewInMemoryStore()
import "database/sql"
db, _ := sql.Open("postgres", "postgres://...")
store, err := logic.NewPostgreSQLStore(db, &logic.PostgreSQLStoreConfig{
TableName: "logic_memories",
AutoMigrate: true,
})
db, _ := sql.Open("mysql", "user:pass@tcp(localhost:3306)/db")
store, err := logic.NewMySQLStore(db, &logic.MySQLStoreConfig{
TableName: "logic_memories",
AutoMigrate: true,
})
LogicMemoryMiddleware 提供自动捕获和注入功能。
mw := middleware.NewLogicMemoryMiddleware(&middleware.LogicMemoryConfig{
Manager: manager,
// 捕获配置
EnableCapture: true,
CaptureChannels: []types.AgentChannel{
types.ChannelControl,
types.ChannelMonitor,
},
AsyncCapture: true, // 异步捕获,不阻塞主流程
// 注入配置
EnableInjection: true,
InjectionPoint: "system_prompt",
MaxMemories: 5,
MinConfidence: 0.6,
// 性能配置
CacheTTL: time.Hour,
})
config.SystemPromptTemplate = `
## User Preferences
Based on past interactions, the following preferences have been learned:
%s
Please apply these preferences naturally without explicitly mentioning them.
`
Logic Memory 提供 Prometheus 兼容的监控指标。
| 指标名 | 类型 | 描述 |
|---|---|---|
logic_memory_save_total | Counter | 保存操作总数 |
logic_memory_save_errors_total | Counter | 保存错误数 |
logic_memory_get_total | Counter | 获取操作总数 |
logic_memory_event_process_total | Counter | 事件处理总数 |
logic_memory_total | Gauge | Memory 总数(按 namespace) |
logic_memory_save_duration_seconds | Histogram | 保存耗时 |
metrics := logic.NewMetrics()
// 记录操作
metrics.RecordSave("user:123", "preference", logic.ScopeUser, duration, nil)
metrics.RecordGet(duration, nil)
metrics.RecordEventProcess("user_revision", duration, nil)
// 导出
metrics.ExportToPrometheus(prometheusExporter)
Logic Memory 提供两个内置工具供 Agent 使用。
允许 Agent 查询 Memory:
{
"name": "logic_memory_query",
"input": {
"action": "list",
"type": "preference",
"top_k": 5
}
}
支持的 action:
list - 列出所有 Memoryget - 获取指定 Memorysearch - 搜索 Memorystats - 获取统计信息允许 Agent 更新 Memory:
{
"name": "logic_memory_update",
"input": {
"action": "record",
"type": "preference",
"key": "format_preference",
"value": {"bullet_points": true},
"description": "用户偏好使用列表格式"
}
}
// 对于重要决策,使用较高阈值
memories, _ := manager.RetrieveMemories(ctx, namespace,
logic.WithMinConfidence(0.8),
)
// 对于建议性内容,可以使用较低阈值
memories, _ := manager.RetrieveMemories(ctx, namespace,
logic.WithMinConfidence(0.5),
)
// 使用清晰的类型命名
const (
TypePreference = "preference" // 用户偏好
TypeBehavior = "behavior" // 行为模式
TypeRule = "rule" // 规则约束
TypeContext = "context" // 上下文信息
)
// 每天执行一次清理
go func() {
ticker := time.NewTicker(24 * time.Hour)
for range ticker.C {
criteria := logic.PruneCriteria{
MinConfidence: 0.3,
SinceLastAccess: 30 * 24 * time.Hour,
}
manager.PruneMemories(context.Background(), criteria)
}
}()
config := &middleware.LogicMemoryConfig{
AsyncCapture: true,
CaptureBufferSize: 100, // 缓冲区大小
}
EnableCapture 为 trueSupportedEventTypes() 包含对应事件类型EnableInjection 为 trueMinConfidence 是否设置过高AsyncCapture: trueCacheTTL: time.HourMaxMemories: 5详细的 API 文档请参考: