diff --git a/README.md b/README.md index 9d120ee3..3725ec74 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ### 结构化记忆系统 > 构建以**主题树+记忆切片**为基础的记忆图谱。 -单个主题节点下存在多级子主题。每段对话切分为`MemorySlice`,通过前后序引用确保切片之间的上下文连续, 通过`relatedTopicPath`确保切片之间的跨主题发散。同一天的所有切片将聚合为`MemoryNode`(记忆节点)的形式挂载到主题节点。除此之外,每个记忆节点还将按照日期进行索引。 +单个主题节点下存在多级子主题。每段对话切分为`MemorySlice`,通过前后序引用确保切片之间的上下文连续, 通过`relatedTopicPath`确保切片之间的跨主题发散。切片将聚合为`MemoryNode`(记忆节点)的形式挂载到主题节点。除此之外,每个记忆节点还将按照日期进行索引。 ### 多用户会话管理 > 构建区分用户的单上下文窗口、多用户会话的管理机制 @@ -42,117 +42,3 @@ ### 长期规划 - [ ] 实现角色演进机制 - [ ] 实现任务调度模块(主动调度、意图推断、定时调度) - -## 目录结构 - -``` -main -├── java -│ └── work -│ └── slhaf -│ ├── agent -│ │ ├── Agent.java -│ │ ├── common -│ │ │ ├── chat -│ │ │ │ ├── ChatClient.java -│ │ │ │ ├── constant -│ │ │ │ │ └── ChatConstant.java -│ │ │ │ └── pojo -│ │ │ │ ├── ChatBody.java -│ │ │ │ ├── ChatResponse.java -│ │ │ │ ├── Message.java -│ │ │ │ ├── MetaMessage.java -│ │ │ │ └── PrimaryChatResponse.java -│ │ │ ├── config -│ │ │ │ ├── Config.java -│ │ │ │ ├── ModelConfig.java -│ │ │ │ ├── ModuleConfig.java -│ │ │ │ └── WebSocketConfig.java -│ │ │ ├── model -│ │ │ │ ├── ModelConstant.java -│ │ │ │ └── Model.java -│ │ │ ├── monitor -│ │ │ │ └── DebugMonitor.java -│ │ │ ├── pojo -│ │ │ │ └── PersistableObject.java -│ │ │ └── util -│ │ │ └── ExtractUtil.java -│ │ ├── core -│ │ │ ├── interaction -│ │ │ │ ├── data -│ │ │ │ │ ├── InteractionContext.java -│ │ │ │ │ ├── InteractionInputData.java -│ │ │ │ │ └── InteractionOutputData.java -│ │ │ │ ├── InputReceiver.java -│ │ │ │ ├── InteractionModule.java -│ │ │ │ ├── InteractionModulesLoader.java -│ │ │ │ ├── InteractionThreadPoolExecutor.java -│ │ │ │ └── TaskCallback.java -│ │ │ ├── InteractionHub.java -│ │ │ ├── memory -│ │ │ │ ├── exception -│ │ │ │ │ ├── NullSliceListException.java -│ │ │ │ │ ├── UnExistedDateIndexException.java -│ │ │ │ │ └── UnExistedTopicException.java -│ │ │ │ ├── MemoryGraph.java -│ │ │ │ ├── MemoryManager.java -│ │ │ │ ├── node -│ │ │ │ │ ├── MemoryNode.java -│ │ │ │ │ └── TopicNode.java -│ │ │ │ └── pojo -│ │ │ │ ├── MemoryResult.java -│ │ │ │ ├── MemorySlice.java -│ │ │ │ ├── MemorySliceResult.java -│ │ │ │ └── User.java -│ │ │ ├── module -│ │ │ │ └── CoreModel.java -│ │ │ └── session -│ │ │ └── SessionManager.java -│ │ ├── gateway -│ │ │ ├── AgentWebSocketServer.java -│ │ │ └── MessageSender.java -│ │ ├── modules -│ │ │ ├── memory -│ │ │ │ ├── selector -│ │ │ │ │ ├── evaluator -│ │ │ │ │ │ ├── data -│ │ │ │ │ │ │ ├── EvaluatorBatchInput.java -│ │ │ │ │ │ │ ├── EvaluatorInput.java -│ │ │ │ │ │ │ ├── EvaluatorResult.java -│ │ │ │ │ │ │ └── SliceSummary.java -│ │ │ │ │ │ └── SliceSelectEvaluator.java -│ │ │ │ │ ├── extractor -│ │ │ │ │ │ ├── data -│ │ │ │ │ │ │ ├── ExtractorInput.java -│ │ │ │ │ │ │ ├── ExtractorMatchData.java -│ │ │ │ │ │ │ └── ExtractorResult.java -│ │ │ │ │ │ └── MemorySelectExtractor.java -│ │ │ │ │ └── MemorySelector.java -│ │ │ │ └── updater -│ │ │ │ ├── MemoryUpdater.java -│ │ │ │ ├── static_extractor -│ │ │ │ │ ├── data -│ │ │ │ │ │ └── StaticMemoryExtractInput.java -│ │ │ │ │ └── StaticMemoryExtractor.java -│ │ │ │ └── summarizer -│ │ │ │ ├── data -│ │ │ │ │ ├── SummarizeInput.java -│ │ │ │ │ └── SummarizeResult.java -│ │ │ │ └── MemorySummarizer.java -│ │ │ ├── preprocess -│ │ │ │ └── PreprocessExecutor.java -│ │ │ ├── task -│ │ │ │ ├── data -│ │ │ │ │ └── TaskData.java -│ │ │ │ ├── TaskEvaluator.java -│ │ │ │ ├── TaskExecutor.java -│ │ │ │ └── TaskScheduler.java -│ │ │ └── topic -│ │ └── shared -│ │ └── memory -│ │ └── EvaluatedSlice.java -│ └── Main.java -└── resources - └── logback.xml -``` - diff --git a/src/main/java/work/slhaf/agent/core/memory/MemoryGraph.java b/src/main/java/work/slhaf/agent/core/memory/MemoryGraph.java index bb58b5e3..3a7ea83e 100644 --- a/src/main/java/work/slhaf/agent/core/memory/MemoryGraph.java +++ b/src/main/java/work/slhaf/agent/core/memory/MemoryGraph.java @@ -353,7 +353,7 @@ public class MemoryGraph extends PersistableObject { //每日刷新缓存 checkCacheDate(); //检测缓存并更新计数, 查看是否需要放入缓存 - updateCacheCounter(path); + updateCacheCounter(topicPath); //查看是否存在缓存,如果存在,则直接返回 if (memorySliceCache.containsKey(path)) { return memorySliceCache.get(path); diff --git a/src/main/java/work/slhaf/agent/modules/memory/selector/evaluator/SliceSelectEvaluator.java b/src/main/java/work/slhaf/agent/modules/memory/selector/evaluator/SliceSelectEvaluator.java index 2b743c8b..f8c3031b 100644 --- a/src/main/java/work/slhaf/agent/modules/memory/selector/evaluator/SliceSelectEvaluator.java +++ b/src/main/java/work/slhaf/agent/modules/memory/selector/evaluator/SliceSelectEvaluator.java @@ -71,8 +71,8 @@ public class SliceSelectEvaluator extends Model { List sliceSummaryList = new ArrayList<>(); //映射查找键值 Map map = new HashMap<>(); - setSliceSummaryList(memoryResult, sliceSummaryList, map); try { + setSliceSummaryList(memoryResult, sliceSummaryList, map); EvaluatorBatchInput batchInput = EvaluatorBatchInput.builder() .text(evaluatorInput.getInput()) .memory_slices(sliceSummaryList) @@ -87,6 +87,7 @@ public class SliceSelectEvaluator extends Model { .summary(sliceSummary.getSummary()) .date(sliceSummary.getDate()) .build(); + setEvaluatedSliceMessages(evaluatedSlice, memoryResult, sliceSummary.getId()); queue.offer(evaluatedSlice); } } catch (Exception e) { @@ -101,17 +102,39 @@ public class SliceSelectEvaluator extends Model { return queue.stream().toList(); } + private void setEvaluatedSliceMessages(EvaluatedSlice evaluatedSlice, MemoryResult memoryResult, Long id) { + //补充消息列表 + for (MemorySliceResult memorySliceResult : memoryResult.getMemorySliceResult()) { + if (memorySliceResult.getMemorySlice().getTimestamp().equals(id)) { + evaluatedSlice.setChatMessages(memorySliceResult.getMemorySlice().getChatMessages()); + return; + } + } + for (MemorySlice memorySlice : memoryResult.getRelatedMemorySliceResult()) { + if (memorySlice.getTimestamp().equals(id)) { + evaluatedSlice.setChatMessages(memorySlice.getChatMessages()); + return; + } + } + } + private void setSliceSummaryList(MemoryResult memoryResult, List sliceSummaryList, Map map) { for (MemorySliceResult memorySliceResult : memoryResult.getMemorySliceResult()) { SliceSummary sliceSummary = new SliceSummary(); sliceSummary.setId(memorySliceResult.getMemorySlice().getTimestamp()); - String stringBuilder = memorySliceResult.getSliceBefore().getSummary() + - "\r\n" + - memorySliceResult.getMemorySlice().getSummary() + - "\r\n" + - memorySliceResult.getSliceAfter().getSummary(); - sliceSummary.setSummary(stringBuilder); + StringBuilder stringBuilder = new StringBuilder(); + if (memorySliceResult.getSliceBefore() != null) { + stringBuilder.append(memorySliceResult.getSliceBefore().getSummary()) + .append("\r\n"); + } + stringBuilder.append(memorySliceResult.getMemorySlice().getSummary()); + if (memorySliceResult.getSliceAfter() != null) { + stringBuilder.append("\r\n") + .append(memorySliceResult.getSliceAfter().getSummary()) + .append("\r\n"); + } + sliceSummary.setSummary(stringBuilder.toString()); Long timestamp = memorySliceResult.getMemorySlice().getTimestamp(); sliceSummary.setDate(DateUtil.date(timestamp).toLocalDateTime().toLocalDate());