Files
smartmate/backend/memory/utils/decision_validate.go
Losita 634a9fb926 Version: 0.9.21.dev.260416
后端:
1. Memory 写入链路新增"召回→比对→汇总"去重决策层
- 新增决策流程:Runner 根据decision.enabled 配置走决策路径(语义召回候选 → Hash 精确命中 → LLM 逐对比对 → 汇总决策 → 执行 ADD/UPDATE/DELETE/NONE),默认关闭,旧路径完全保留
- 新增 LLMDecisionOrchestrator:单对关系判断编排器,输出 duplicate/update/conflict/unrelated 四种关系
- 新增 decision_flow / apply_actions:决策流程主循环与动作落地(新增、更新内容、软删除、跳过)
- 新增 aggregate_decision / decision_validate:汇总规则(按优先级判定动作)与 LLM 输出校验
- 新增 decision model:CandidateSnapshot / ComparisonResult / FinalDecision 等决策层核心类型
- ItemRepo 新增 FindActiveByHash / UpdateContentByID / SoftDeleteByID 三个决策层专用方法
- RAG Runtime / Pipeline / Service 新增 DeleteMemory 向量删除能力,MilvusStore 补充 duplicate collection 错误识别
- Runner 新增 syncVectorDeletes 处理决策层 DELETE 动作的向量清理
- config 新增 decision(enabled/candidateTopK/candidateMinScore/fallbackMode)和 write.mode 配置项,config_loader 增加默认值兜底
- 删除 HANDOFF-RAG复用后续实施计划.md 和旧 log.txt,新增 Log.txt 记录决策流程调试日志
- normalize_facts 导出 HashContent 供决策层复用,audit 新增 update 操作常量

前端:无 仓库:无
2026-04-16 12:11:58 +08:00

50 lines
1.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package utils
import (
"fmt"
"strings"
memorymodel "github.com/LoveLosita/smartflow/backend/memory/model"
)
// 合法关系类型集合,用于校验 LLM 输出的 relation 字段。
var validRelations = map[string]struct{}{
memorymodel.RelationDuplicate: {},
memorymodel.RelationUpdate: {},
memorymodel.RelationConflict: {},
memorymodel.RelationUnrelated: {},
}
// ValidateComparisonResult 校验单次比对结果的基本合法性。
//
// 职责边界:
// 1. 只校验 LLM 输出的结构合法性,不校验业务语义;
// 2. relation 必须是四种合法值之一update 时必须有 UpdatedContent
// 3. 校验失败直接返回 error调用方决定丢弃或重试。
func ValidateComparisonResult(result *memorymodel.ComparisonResult) error {
if result == nil {
return fmt.Errorf("比对结果不能为空")
}
// 1. MemoryID 必须大于 0确保能定位到旧记忆。
if result.MemoryID <= 0 {
return fmt.Errorf("比对结果 memory_id 无效: %d", result.MemoryID)
}
// 2. relation 必须是四种合法值之一,防止 LLM 输出非法值。
relation := strings.TrimSpace(strings.ToLower(result.Relation))
if _, ok := validRelations[relation]; !ok {
return fmt.Errorf("比对结果 relation 非法: %s", result.Relation)
}
// 3. relation=update 时UpdatedContent 不能为空。
// 原因update 需要合并后的完整内容,不能只写差异部分。
if relation == memorymodel.RelationUpdate {
if strings.TrimSpace(result.UpdatedContent) == "" {
return fmt.Errorf("relation=update 时 updated_content 不能为空")
}
}
return nil
}