记忆

项目级记忆

基于 AGENTS.md 的项目级持久化记忆系统

项目级记忆 (Project Memory)

项目级记忆系统提供基于文件(AGENTS.md)的结构化记忆存储,用于跨会话保持项目上下文。

核心概念

pkg/memory/project/
├── types.go      # 类型定义
├── store.go      # Store 接口
└── file_store.go # AGENTS.md 文件存储实现

数据结构

// ProjectMemory 项目记忆
type ProjectMemory struct {
    ProjectID   string             // 项目 ID
    Title       string             // 项目标题
    Description string             // 项目描述
    Sections    map[string]*Section // 章节
    Metadata    map[string]any     // 元数据
    CreatedAt   time.Time
    UpdatedAt   time.Time
}

// Section 章节(如「用户偏好」「关键选择」)
type Section struct {
    Name      string
    Protected bool      // 是否受保护(不自动清理)
    Entries   []*Entry
}

// Entry 条目
type Entry struct {
    Timestamp time.Time
    Category  string    // 分类标签
    Content   string
    Source    string    // 来源(dialog/tool/system)
    Metadata  map[string]any
}

基本用法

创建存储

import "github.com/astercloud/aster/pkg/memory/project"

// 创建文件存储
store := project.NewFileStore(&project.StoreConfig{
    BasePath: "workspaces",       // 项目基础路径
    FileName: "AGENTS.md",        // 记忆文件名
})

追加条目

ctx := context.Background()

// 追加用户偏好
err := store.AppendEntry(ctx, projectID, project.SectionPreferences, &project.Entry{
    Category: "style",
    Content:  "用户希望轻松幽默的风格",
    Source:   "dialog",
})

// 追加关键选择
err = store.AppendEntry(ctx, projectID, project.SectionChoices, &project.Entry{
    Category: "topic",
    Content:  "[选题确认] 选择了「AI 时代的写作革命」",
    Source:   "workflow",
})

更新工作流状态

err := store.UpdateWorkflowStatus(ctx, projectID, &project.WorkflowStep{
    Step:      "选题确认",
    Status:    "completed",
    Timestamp: time.Now(),
})

获取记忆摘要

// 获取摘要用于注入 AI 上下文
summary, err := store.GetSummary(ctx, projectID)
// 返回格式化的 Markdown 摘要

预定义章节

const (
    SectionPreferences = "用户偏好"    // 自动提取的用户偏好
    SectionChoices     = "关键选择"    // 用户的选项选择记录
    SectionWorkflow    = "工作流状态"  // 当前进度追踪
    SectionParams      = "生成参数"    // 每次生成的参数快照
)

AGENTS.md 文件格式

# 项目名称

## 项目信息

- **创建时间**: 2024-12-08
- **项目类型**: 长篇小说

## 用户偏好 [protected]

<!-- 自动从对话中提取,检测关键词:想要、希望、喜欢、必须、不要等 -->

- 2024-12-08 10:30: [style] 用户希望轻松幽默的风格
- 2024-12-08 11:15: [constraint] 不要使用网络流行语

## 关键选择 [protected]

<!-- 记录用户在工作流中的选项选择 -->

- 2024-12-08 10:35: [选题确认] 选择了「AI 时代的写作革命」

## 工作流状态

| 步骤 | 状态 | 时间 |
|------|------|------|
| 选题确认 | ✅ 完成 | 2024-12-08 10:35 |
| 大纲生成 | 🔄 进行中 | 2024-12-08 11:00 |

## 生成参数

### 2024-12-08 11:00 生成

- **模型**: gpt-4
- **温度**: 0.7
- **最大长度**: 2000

与其他模块集成

结合对话提取器

import (
    "github.com/astercloud/aster/pkg/memory/project"
    "github.com/astercloud/aster/pkg/memory/dialog"
)

store := project.NewFileStore(config)
extractor := dialog.NewExtractor(dialog.WritingStyleKeywords(), nil)

// 从对话中提取并保存
prefs := extractor.Extract(userMessage)
for _, pref := range prefs {
    store.AppendEntry(ctx, projectID, project.SectionPreferences, &project.Entry{
        Category: string(pref.Category),
        Content:  pref.Content,
        Source:   "dialog",
    })
}

最佳实践

  1. 使用 [protected] 标记重要章节 - 防止自动清理误删
  2. 异步写入 - 不阻塞主流程,使用 goroutine 写入
  3. 定期获取摘要 - 在关键节点注入 AI 上下文
  4. 分类存储 - 使用 Category 字段便于后续过滤和检索