fix(memory,loop,capacity): 打通记忆链三条空壳(P0-3 / P0-4 / P0-17,审计 §4.3)
- P0-3 持久向量索引**不再空壳**:Store.Add 落库后真做 Embed+Add(失败只记日志、绝不让记忆写入失败); NewRetriever 拿到 WithVectorIndex 时**自动接上写入路径**(无需改组合根);索引无命中 → WARN + **回退内存余弦**; 新增每进程一次的**回填**(索引确实为空时把已落库条目向量化,分批 64、上限 512) - P0-4 工作记忆**按会话接线**:回合落定时写入(owner 会话 + 带会话 id 的窗口,LRU 上限 64), 组装上下文时按会话读取 ⇒ 前导块真的出现;原单窗口 API 语义不变 - P0-17 L4 学习回环**真回写**:新增 capacity.Judge(只跑判定、不施人格覆盖/不发事件/不改状态); loop 在回合落定"只写 owner 会话 + 跳过子代理分支",写 ScopeUser(L4 的读域)+ 结构化溯源 - 顺带红线加固:意图记录是主人**原话**的机器可读形态 ⇒ **绝不注入群聊/陌生人块**(design/03 §5) - 复核:三条各自的包 build/vet/test 绿;「真生效」断言含生产构造路径(vector.New + 真实 SQLite 后端 + n-gram embedder)、跑完一轮窗口非空、L4 回写后能唤醒一个自身无强信号的表达; **5 条变异反证**(其中两条专门打「受限会话零写入」与「群聊不泄露主人原话」)均已还原 - 未做(登记):Index.Search 无 ID 过滤(客户端按候选集过滤,极端情况走回退);每条记忆一次 Embed
This commit is contained in:
1 parent
983bc49218
commit
fbad02899a
10 files changed
+1020
-81
No files matched your search
@@ -38,9 +38,11 @@ import (
|
||||
"io"
|
||||
"log/slog"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/runtime/memory/vector"
|
||||
)
|
||||
|
||||
// Scope 分类一条长期记忆归属于谁。它与 Kind 正交,
|
||||
@@ -139,12 +141,18 @@ const (
|
||||
//
|
||||
// 存储自己拥有 schema:NewStore 幂等地创建 memory_items 表及其
|
||||
// 索引。并发交由 *sql.DB,按约定它可安全
|
||||
// 并发使用,因此 Store 不再持锁。每个查询都
|
||||
// 并发使用,因此除语义索引的接入外,Store 不再持锁。每个查询都
|
||||
// 参数化(?)并显式列出列(无 SELECT *),读取带
|
||||
// context.Cancel。
|
||||
type Store struct {
|
||||
db *sql.DB
|
||||
log *slog.Logger
|
||||
|
||||
// vecMu 保护 vec,使持久语义索引能在装配后并发接入,而写入
|
||||
// 路径每写一条记忆就 embed + add 到它(见 indexItem)。vec 为
|
||||
// nil 表示没有配置持久索引,检索据此回退到内存余弦。
|
||||
vecMu sync.RWMutex
|
||||
vec vector.Index
|
||||
}
|
||||
|
||||
// rowScanner 同时被 *sql.Row 与 *sql.Rows 满足,因此单个 scanItem
|
||||
@@ -186,6 +194,13 @@ func NewStore(ctx context.Context, db *sql.DB, log *slog.Logger) (*Store, error)
|
||||
// Add 持久化 item,分配 id 与缺失的时间戳,并把
|
||||
// Scope/Kind/Confidence/DecayWeight 规范化到默认值。它返回已落库的
|
||||
// 条目,id 与时间戳均已填充。
|
||||
//
|
||||
// 接入持久语义索引(见 attachVectorIndex)时,落库后同一条目也会
|
||||
// 被向量化并写入索引,使索引与 memory_items 同步 —— 语义检索路径因此
|
||||
// 真的有向量可查,而不是对一个恒空索引搜索(design/03 §3「真正启用
|
||||
// 向量检索」、design/04 §7)。索引写入失败只记日志:条目已经在
|
||||
// 关系表里,语义增强的失败绝不使记忆写入失败,检索侧也会回退到
|
||||
// 内存余弦(见 Retriever.semanticScores)。
|
||||
func (s *Store) Add(ctx context.Context, item MemoryItem) (MemoryItem, error) {
|
||||
if err := item.normalize(); err != nil {
|
||||
return MemoryItem{}, err
|
||||
@@ -209,6 +224,7 @@ func (s *Store) Add(ctx context.Context, item MemoryItem) (MemoryItem, error) {
|
||||
if err != nil {
|
||||
return MemoryItem{}, fmt.Errorf("memory: insert item: %w", err)
|
||||
}
|
||||
s.indexItem(ctx, item)
|
||||
return item, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user