From e9053a4e88630ef66bd838c47a67f150b2d53cbf Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Thu, 12 Jun 2025 22:08:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E8=BF=9B=E6=84=9F=E7=9F=A5=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=9B=B8=E5=85=B3=E5=BC=80=E5=8F=91=EF=BC=8C=E8=BF=99?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=80=92=E6=84=8F=E5=A4=96=E5=9C=B0=E7=AE=80?= =?UTF-8?q?=E5=8D=95=EF=BC=8C=E7=8E=B0=E5=9C=A8=E6=9C=89=E4=BA=9B=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=EF=BC=8C=E5=8F=AF=E8=83=BD=E4=BB=A5=E5=90=8E=E4=BC=9A?= =?UTF-8?q?=E6=9C=89=E6=94=B9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PerceiveCore 中的 updateUser 方法 - 新增了 PerceiveSelector 用于获取用户信息,提供基础的身份建模信息 - 新增 PerceiveUpdater 类用于异步更新用户身份感知 - 抽取 MemoryUpdater 中的执行判定逻辑至新增的 PostprocessExecutor 类,判定逻辑适用于多个`后处理模块` - 重构 Model 类,改为抽象类,将modelKey定义为抽象方法,强制规范子类实现 --- .../work/slhaf/agent/core/InteractionHub.java | 3 +- .../core/cognation/CognationManager.java | 6 ++ .../perceive/PerceiveCapability.java | 2 + .../submodule/perceive/PerceiveCore.java | 11 +++ .../submodule/perceive/pojo/User.java | 11 +-- .../work/slhaf/agent/module/common/Model.java | 4 +- .../agent/module/common/ModelConstant.java | 1 + .../slhaf/agent/module/common/PreModule.java | 27 ++++++ .../agent/module/common/PreModuleActions.java | 12 --- .../memory/selector/MemorySelector.java | 25 +---- .../evaluator/SliceSelectEvaluator.java | 7 +- .../extractor/MemorySelectExtractor.java | 7 +- .../modules/memory/updater/MemoryUpdater.java | 24 +++-- .../updater/summarizer/MultiSummarizer.java | 7 +- .../updater/summarizer/SingleSummarizer.java | 7 +- .../updater/summarizer/TotalSummarizer.java | 8 +- .../perceive/selector/PerceiveSelector.java | 36 ++++--- .../perceive/updater/PerceiveUpdater.java | 94 +++++++++++++++++++ .../updater/pojo/PerceiveChatInput.java | 13 +++ .../updater/pojo/PerceiveChatResult.java | 13 +++ .../StaticPerceiveExtractor.java | 9 +- .../modules/process/PostprocessExecutor.java | 39 ++++++++ .../PreprocessExecutor.java | 2 +- 23 files changed, 286 insertions(+), 82 deletions(-) create mode 100644 src/main/java/work/slhaf/agent/module/common/PreModule.java delete mode 100644 src/main/java/work/slhaf/agent/module/common/PreModuleActions.java create mode 100644 src/main/java/work/slhaf/agent/module/modules/perceive/updater/PerceiveUpdater.java create mode 100644 src/main/java/work/slhaf/agent/module/modules/perceive/updater/pojo/PerceiveChatInput.java create mode 100644 src/main/java/work/slhaf/agent/module/modules/perceive/updater/pojo/PerceiveChatResult.java create mode 100644 src/main/java/work/slhaf/agent/module/modules/process/PostprocessExecutor.java rename src/main/java/work/slhaf/agent/module/modules/{preprocess => process}/PreprocessExecutor.java (98%) diff --git a/src/main/java/work/slhaf/agent/core/InteractionHub.java b/src/main/java/work/slhaf/agent/core/InteractionHub.java index 5367ef25..c99819a9 100644 --- a/src/main/java/work/slhaf/agent/core/InteractionHub.java +++ b/src/main/java/work/slhaf/agent/core/InteractionHub.java @@ -11,7 +11,7 @@ import work.slhaf.agent.core.interaction.data.context.InteractionContext; import work.slhaf.agent.core.interaction.module.InteractionModule; import work.slhaf.agent.core.interaction.module.InteractionModulesLoader; import work.slhaf.agent.module.modules.core.CoreModel; -import work.slhaf.agent.module.modules.preprocess.PreprocessExecutor; +import work.slhaf.agent.module.modules.process.PreprocessExecutor; import work.slhaf.agent.module.modules.task.TaskScheduler; import java.io.IOException; @@ -46,7 +46,6 @@ public class InteractionHub { public void call(InteractionInputData inputData) throws IOException, ClassNotFoundException { InteractionContext interactionContext = PreprocessExecutor.getInstance().execute(inputData); try { - //预处理 for (InteractionModule interactionModule : interactionModules) { interactionModule.execute(interactionContext); } diff --git a/src/main/java/work/slhaf/agent/core/cognation/CognationManager.java b/src/main/java/work/slhaf/agent/core/cognation/CognationManager.java index a54169e5..33e8c70a 100644 --- a/src/main/java/work/slhaf/agent/core/cognation/CognationManager.java +++ b/src/main/java/work/slhaf/agent/core/cognation/CognationManager.java @@ -21,6 +21,7 @@ import work.slhaf.agent.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.agent.core.cognation.submodule.perceive.PerceiveCapability; import work.slhaf.agent.core.cognation.submodule.perceive.PerceiveCore; import work.slhaf.agent.core.cognation.submodule.perceive.pojo.User; +import work.slhaf.agent.module.modules.perceive.updater.pojo.PerceiveChatResult; import work.slhaf.agent.shared.memory.EvaluatedSlice; import java.io.IOException; @@ -285,6 +286,11 @@ public class CognationManager extends PersistableObject implements CacheCapabili return perceiveCore.addUser(userInfo, platform, userNickName); } + @Override + public void updateUser(PerceiveChatResult perceiveChatResult, String userId) { + perceiveCore.updateUser(perceiveChatResult, userId); + } + @Override public HashMap> getActivatedSlices() { return activeData.getActivatedSlices(); diff --git a/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/PerceiveCapability.java b/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/PerceiveCapability.java index f8ef217a..f1e60f4a 100644 --- a/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/PerceiveCapability.java +++ b/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/PerceiveCapability.java @@ -1,9 +1,11 @@ package work.slhaf.agent.core.cognation.submodule.perceive; import work.slhaf.agent.core.cognation.submodule.perceive.pojo.User; +import work.slhaf.agent.module.modules.perceive.updater.pojo.PerceiveChatResult; public interface PerceiveCapability { User getUser(String userInfo, String client); User getUser(String id); User addUser(String userInfo, String platform, String userNickName); + void updateUser(PerceiveChatResult perceiveChatResult, String userId); } diff --git a/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/PerceiveCore.java b/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/PerceiveCore.java index f6e5cfcd..9bea723f 100644 --- a/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/PerceiveCore.java +++ b/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/PerceiveCore.java @@ -4,6 +4,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import work.slhaf.agent.common.serialize.PersistableObject; import work.slhaf.agent.core.cognation.submodule.perceive.pojo.User; +import work.slhaf.agent.module.modules.perceive.updater.pojo.PerceiveChatResult; import java.io.Serial; import java.util.ArrayList; @@ -74,4 +75,14 @@ public class PerceiveCore extends PersistableObject { usersLock.unlock(); return null; } + + public void updateUser(PerceiveChatResult perceiveChatResult, String userId) { + usersLock.lock(); + User user = selectUser(userId); + user.setRelation(perceiveChatResult.getRelation()); + user.setImpressions(perceiveChatResult.getImpressions()); + user.setAttitude(perceiveChatResult.getAttitude()); + user.setStaticMemory(perceiveChatResult.getStaticMemory()); + usersLock.unlock(); + } } diff --git a/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/pojo/User.java b/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/pojo/User.java index 57b1515c..aa60ce14 100644 --- a/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/pojo/User.java +++ b/src/main/java/work/slhaf/agent/core/cognation/submodule/perceive/pojo/User.java @@ -5,7 +5,6 @@ import lombok.EqualsAndHashCode; import work.slhaf.agent.common.serialize.PersistableObject; import java.io.Serial; -import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -19,21 +18,21 @@ public class User extends PersistableObject { private String uuid; private String nickName; - private HashMap info = new HashMap<>(); + private HashMap info = new HashMap<>(); - private String relation; - private HashMap events = new HashMap<>(); + private String relation = Constant.Relation.STRANGER; + // private HashMap events = new HashMap<>(); private List impressions = new ArrayList<>(); private List attitude = new ArrayList<>(); private List staticMemory = new ArrayList<>(); - public void addInfo(String platform,String userInfo) { + public void addInfo(String platform, String userInfo) { this.info.put(platform, userInfo); } public static class Constant { public static class Relation { - public static final String STRANGER = "stranger"; + public static final String STRANGER = "陌生"; } } } diff --git a/src/main/java/work/slhaf/agent/module/common/Model.java b/src/main/java/work/slhaf/agent/module/common/Model.java index 9a5f82f1..e7cef4e4 100644 --- a/src/main/java/work/slhaf/agent/module/common/Model.java +++ b/src/main/java/work/slhaf/agent/module/common/Model.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; @Data -public class Model { +public abstract class Model { protected ChatClient chatClient; protected List chatMessages; protected List baseMessages; @@ -41,4 +41,6 @@ public class Model { this.chatClient.setTemperature(0.4); this.chatClient.setTop_p(0.8); } + + protected abstract String modelKey(); } diff --git a/src/main/java/work/slhaf/agent/module/common/ModelConstant.java b/src/main/java/work/slhaf/agent/module/common/ModelConstant.java index e8048bd5..ba578804 100644 --- a/src/main/java/work/slhaf/agent/module/common/ModelConstant.java +++ b/src/main/java/work/slhaf/agent/module/common/ModelConstant.java @@ -6,6 +6,7 @@ public class ModelConstant { public static final String MEMORY = "memory"; public static final String SCHEDULE = "schedule"; public static final String CORE = "core"; + public static final String PERCEIVE = "perceive"; } public static class CharacterPrefix { diff --git a/src/main/java/work/slhaf/agent/module/common/PreModule.java b/src/main/java/work/slhaf/agent/module/common/PreModule.java new file mode 100644 index 00000000..cae61971 --- /dev/null +++ b/src/main/java/work/slhaf/agent/module/common/PreModule.java @@ -0,0 +1,27 @@ +package work.slhaf.agent.module.common; + +import work.slhaf.agent.core.interaction.data.context.InteractionContext; +import work.slhaf.agent.core.interaction.module.InteractionModule; + +import java.util.HashMap; + +/** + * 前置模块抽象类 + */ +public abstract class PreModule implements InteractionModule { + protected void setAppendedPrompt(InteractionContext context) { + AppendPromptData data = new AppendPromptData(); + data.setModuleName(moduleName()); + HashMap map = getPromptDataMap(context.getUserId()); + data.setAppendedPrompt(map); + context.getModuleContext().getAppendedPrompt().add(data); + } + + protected void setActiveModule(InteractionContext context) { + context.getCoreContext().addActiveModule(moduleName()); + } + + protected abstract HashMap getPromptDataMap(String userId); + + protected abstract String moduleName(); +} diff --git a/src/main/java/work/slhaf/agent/module/common/PreModuleActions.java b/src/main/java/work/slhaf/agent/module/common/PreModuleActions.java deleted file mode 100644 index 13696fe4..00000000 --- a/src/main/java/work/slhaf/agent/module/common/PreModuleActions.java +++ /dev/null @@ -1,12 +0,0 @@ -package work.slhaf.agent.module.common; - -import work.slhaf.agent.core.interaction.data.context.InteractionContext; - -/** - * 用于在前置模块设置追加提示词 - */ -public interface PreModuleActions { - void setAppendedPrompt(InteractionContext context); - void setActiveModule(InteractionContext context); - String getModuleName(); -} diff --git a/src/main/java/work/slhaf/agent/module/modules/memory/selector/MemorySelector.java b/src/main/java/work/slhaf/agent/module/modules/memory/selector/MemorySelector.java index cd59c723..178fbbf9 100644 --- a/src/main/java/work/slhaf/agent/module/modules/memory/selector/MemorySelector.java +++ b/src/main/java/work/slhaf/agent/module/modules/memory/selector/MemorySelector.java @@ -12,10 +12,8 @@ import work.slhaf.agent.core.cognation.submodule.cache.CacheCapability; import work.slhaf.agent.core.cognation.submodule.memory.MemoryCapability; import work.slhaf.agent.core.cognation.submodule.memory.pojo.MemorySlice; import work.slhaf.agent.core.interaction.data.context.InteractionContext; -import work.slhaf.agent.core.interaction.module.InteractionModule; import work.slhaf.agent.core.session.SessionManager; -import work.slhaf.agent.module.common.AppendPromptData; -import work.slhaf.agent.module.common.PreModuleActions; +import work.slhaf.agent.module.common.PreModule; import work.slhaf.agent.module.modules.memory.selector.evaluator.SliceSelectEvaluator; import work.slhaf.agent.module.modules.memory.selector.evaluator.data.EvaluatorInput; import work.slhaf.agent.module.modules.memory.selector.extractor.MemorySelectExtractor; @@ -32,7 +30,7 @@ import java.util.List; @Data @Slf4j -public class MemorySelector implements InteractionModule, PreModuleActions { +public class MemorySelector extends PreModule { private static volatile MemorySelector memorySelector; @@ -152,26 +150,11 @@ public class MemorySelector implements InteractionModule, PreModuleActions { } @Override - public void setAppendedPrompt(InteractionContext context) { - String userId = context.getUserId(); - HashMap map = getPromptDataMap(userId); - AppendPromptData data = new AppendPromptData(); - data.setModuleName(getModuleName()); - data.setAppendedPrompt(map); - context.setAppendedPrompt(data); - } - - @Override - public void setActiveModule(InteractionContext context) { - context.getCoreContext().addActiveModule(getModuleName()); - } - - @Override - public String getModuleName() { + public String moduleName() { return "[记忆模块]"; } - private HashMap getPromptDataMap(String userId) { + protected HashMap getPromptDataMap(String userId) { HashMap map = new HashMap<>(); String dialogMapStr = cacheCapability.getDialogMapStr(); if (!dialogMapStr.isEmpty()) { diff --git a/src/main/java/work/slhaf/agent/module/modules/memory/selector/evaluator/SliceSelectEvaluator.java b/src/main/java/work/slhaf/agent/module/modules/memory/selector/evaluator/SliceSelectEvaluator.java index 38d11e42..c19df151 100644 --- a/src/main/java/work/slhaf/agent/module/modules/memory/selector/evaluator/SliceSelectEvaluator.java +++ b/src/main/java/work/slhaf/agent/module/modules/memory/selector/evaluator/SliceSelectEvaluator.java @@ -31,7 +31,6 @@ import static work.slhaf.agent.common.util.ExtractUtil.extractJson; @Data @Slf4j public class SliceSelectEvaluator extends Model { - public static final String MODEL_KEY = "slice_evaluator"; private static volatile SliceSelectEvaluator sliceSelectEvaluator; private InteractionThreadPoolExecutor executor; @@ -44,7 +43,7 @@ public class SliceSelectEvaluator extends Model { if (sliceSelectEvaluator == null) { sliceSelectEvaluator = new SliceSelectEvaluator(); sliceSelectEvaluator.setExecutor(InteractionThreadPoolExecutor.getInstance()); - setModel(sliceSelectEvaluator, MODEL_KEY, ModelConstant.Prompt.MEMORY, false); + setModel(sliceSelectEvaluator, sliceSelectEvaluator.modelKey(), ModelConstant.Prompt.MEMORY, false); log.info("SliceEvaluator注册完毕..."); } } @@ -135,4 +134,8 @@ public class SliceSelectEvaluator extends Model { } + @Override + protected String modelKey() { + return "slice_evaluator"; + } } diff --git a/src/main/java/work/slhaf/agent/module/modules/memory/selector/extractor/MemorySelectExtractor.java b/src/main/java/work/slhaf/agent/module/modules/memory/selector/extractor/MemorySelectExtractor.java index b8972f97..0c3bf957 100644 --- a/src/main/java/work/slhaf/agent/module/modules/memory/selector/extractor/MemorySelectExtractor.java +++ b/src/main/java/work/slhaf/agent/module/modules/memory/selector/extractor/MemorySelectExtractor.java @@ -32,7 +32,6 @@ import static work.slhaf.agent.common.util.ExtractUtil.fixTopicPath; @Data @Slf4j public class MemorySelectExtractor extends Model { - public static final String MODEL_KEY = "topic_extractor"; private static volatile MemorySelectExtractor memorySelectExtractor; private MemoryCapability memoryCapability; @@ -50,7 +49,7 @@ public class MemorySelectExtractor extends Model { memorySelectExtractor.setMemoryCapability(CognationManager.getInstance()); memorySelectExtractor.setCognationCapability(CognationManager.getInstance()); memorySelectExtractor.setSessionManager(SessionManager.getInstance()); - setModel(memorySelectExtractor, MODEL_KEY, ModelConstant.Prompt.MEMORY, false); + setModel(memorySelectExtractor, memorySelectExtractor.modelKey(), ModelConstant.Prompt.MEMORY, false); } } } @@ -106,4 +105,8 @@ public class MemorySelectExtractor extends Model { return extractorResult; } + @Override + protected String modelKey() { + return "topic_extractor"; + } } diff --git a/src/main/java/work/slhaf/agent/module/modules/memory/updater/MemoryUpdater.java b/src/main/java/work/slhaf/agent/module/modules/memory/updater/MemoryUpdater.java index 71740ac6..94c4bf9d 100644 --- a/src/main/java/work/slhaf/agent/module/modules/memory/updater/MemoryUpdater.java +++ b/src/main/java/work/slhaf/agent/module/modules/memory/updater/MemoryUpdater.java @@ -36,9 +36,6 @@ public class MemoryUpdater implements InteractionModule { private static final long SCHEDULED_UPDATE_INTERVAL = 10 * 1000; private static final long UPDATE_TRIGGER_INTERVAL = 60 * 60 * 1000; - // private static final int TRIGGER_TOKEN_LIMIT = 5 * 1000; - private static final int TOKEN_PER_RECALL = 230; - private static final int TRIGGER_ROLL_LIMIT = 36; private CognationCapability cognationCapability; private MemoryCapability memoryCapability; @@ -101,31 +98,32 @@ public class MemoryUpdater implements InteractionModule { } @Override - public void execute(InteractionContext interactionContext) { - if (interactionContext.isFinished()) { + public void execute(InteractionContext context) { + if (context.isFinished()) { log.warn("[MemoryUpdater] 流程强制结束, 不触发记忆被动更新机制"); return; } executor.execute(() -> { //如果token 大于阈值,则更新记忆 - JSONObject moduleContext = interactionContext.getModuleContext().getExtraContext(); + JSONObject moduleContext = context.getModuleContext().getExtraContext(); boolean recall = moduleContext.getBoolean("recall"); if (recall) { log.debug("[MemoryUpdater] 存在回忆"); int recallCount = moduleContext.getIntValue("recall_count"); log.debug("[MemoryUpdater] 记忆切片数量 [{}]", recallCount); } - int messageCount = cognationCapability.getChatMessages().size(); - if (messageCount >= TRIGGER_ROLL_LIMIT) { + boolean trigger = context.getModuleContext().getExtraContext().getBoolean("post_process_trigger"); + if (!trigger) { + return; + } try { - log.debug("[MemoryUpdater] 记忆更新: 已达{}轮", TRIGGER_ROLL_LIMIT); + log.debug("[MemoryUpdater] 记忆更新触发"); updateMemory(); //清空chatMessages clearChatMessages(); } catch (Exception e) { log.error("[MemoryUpdater] 记忆更新线程出错: ", e); } - } }); } @@ -195,9 +193,9 @@ public class MemoryUpdater implements InteractionModule { private void clearChatMessages() { //不全部清空,保留一部分输入防止上下文割裂 cognationCapability.getMessageLock().lock(); - List temp = new ArrayList<>(tempMessage.subList(tempMessage.size() - TRIGGER_ROLL_LIMIT / 6, tempMessage.size())); - cognationCapability.getChatMessages().clear(); - cognationCapability.getChatMessages().addAll(temp); + List temp = new ArrayList<>(tempMessage.subList(tempMessage.size() - tempMessage.size() / 6, tempMessage.size())); + cognationCapability.getChatMessages().removeAll(tempMessage); + cognationCapability.getChatMessages().addAll(0, temp); cognationCapability.getMessageLock().unlock(); } diff --git a/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/MultiSummarizer.java b/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/MultiSummarizer.java index f0ab0b2c..3f7a6952 100644 --- a/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/MultiSummarizer.java +++ b/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/MultiSummarizer.java @@ -22,7 +22,6 @@ import static work.slhaf.agent.common.util.ExtractUtil.fixTopicPath; @Slf4j public class MultiSummarizer extends Model { - public static final String MODEL_KEY = "multi_summarizer"; private static volatile MultiSummarizer multiSummarizer; public static MultiSummarizer getInstance() { @@ -30,7 +29,7 @@ public class MultiSummarizer extends Model { synchronized (MultiSummarizer.class) { if (multiSummarizer == null) { multiSummarizer = new MultiSummarizer(); - setModel(multiSummarizer, MODEL_KEY, ModelConstant.Prompt.MEMORY, true); + setModel(multiSummarizer, multiSummarizer.modelKey(), ModelConstant.Prompt.MEMORY, true); multiSummarizer.updateChatClientSettings(); } } @@ -61,4 +60,8 @@ public class MultiSummarizer extends Model { return result; } + @Override + protected String modelKey() { + return "multi_summarizer"; + } } diff --git a/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/SingleSummarizer.java b/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/SingleSummarizer.java index 5900b3a9..10e2bb00 100644 --- a/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/SingleSummarizer.java +++ b/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/SingleSummarizer.java @@ -22,7 +22,6 @@ import java.util.concurrent.atomic.AtomicInteger; @Data public class SingleSummarizer extends Model { - public static final String MODEL_KEY = "single_summarizer"; private static volatile SingleSummarizer singleSummarizer; private InteractionThreadPoolExecutor executor; @@ -33,7 +32,7 @@ public class SingleSummarizer extends Model { if (singleSummarizer == null) { singleSummarizer = new SingleSummarizer(); singleSummarizer.setExecutor(InteractionThreadPoolExecutor.getInstance()); - setModel(singleSummarizer, MODEL_KEY, ModelConstant.Prompt.MEMORY, false); + setModel(singleSummarizer, singleSummarizer.modelKey(), ModelConstant.Prompt.MEMORY, false); } } } @@ -72,4 +71,8 @@ public class SingleSummarizer extends Model { } } + @Override + protected String modelKey() { + return "single_summarizer"; + } } diff --git a/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/TotalSummarizer.java b/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/TotalSummarizer.java index 43be3c69..bef70f79 100644 --- a/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/TotalSummarizer.java +++ b/src/main/java/work/slhaf/agent/module/modules/memory/updater/summarizer/TotalSummarizer.java @@ -18,7 +18,6 @@ import static work.slhaf.agent.common.util.ExtractUtil.extractJson; @Slf4j public class TotalSummarizer extends Model { - public static final String MODEL_KEY = "total_summarizer"; private static volatile TotalSummarizer totalSummarizer; public static TotalSummarizer getInstance() { @@ -26,7 +25,7 @@ public class TotalSummarizer extends Model { synchronized (TotalSummarizer.class) { if (totalSummarizer == null) { totalSummarizer = new TotalSummarizer(); - setModel(totalSummarizer, MODEL_KEY, ModelConstant.Prompt.MEMORY, true); + setModel(totalSummarizer, totalSummarizer.modelKey(), ModelConstant.Prompt.MEMORY, true); totalSummarizer.updateChatClientSettings(); } } @@ -38,4 +37,9 @@ public class TotalSummarizer extends Model { ChatResponse response = this.singleChat(JSONUtil.toJsonPrettyStr(singleMemorySummary)); return JSONObject.parseObject(extractJson(response.getMessage())).getString("content"); } + + @Override + protected String modelKey() { + return "total_summarizer"; + } } diff --git a/src/main/java/work/slhaf/agent/module/modules/perceive/selector/PerceiveSelector.java b/src/main/java/work/slhaf/agent/module/modules/perceive/selector/PerceiveSelector.java index 450a6233..27574b43 100644 --- a/src/main/java/work/slhaf/agent/module/modules/perceive/selector/PerceiveSelector.java +++ b/src/main/java/work/slhaf/agent/module/modules/perceive/selector/PerceiveSelector.java @@ -2,24 +2,29 @@ package work.slhaf.agent.module.modules.perceive.selector; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.core.cognation.CognationManager; +import work.slhaf.agent.core.cognation.submodule.perceive.PerceiveCapability; +import work.slhaf.agent.core.cognation.submodule.perceive.pojo.User; import work.slhaf.agent.core.interaction.data.context.InteractionContext; -import work.slhaf.agent.core.interaction.module.InteractionModule; -import work.slhaf.agent.module.common.PreModuleActions; +import work.slhaf.agent.module.common.PreModule; import java.io.IOException; +import java.util.HashMap; @Slf4j @Setter -public class PerceiveSelector implements InteractionModule, PreModuleActions { +public class PerceiveSelector extends PreModule { private static volatile PerceiveSelector perceiveSelector; + private PerceiveCapability perceiveCapability; public static PerceiveSelector getInstance() throws IOException, ClassNotFoundException { if (perceiveSelector == null) { synchronized (PerceiveSelector.class) { if (perceiveSelector == null) { perceiveSelector = new PerceiveSelector(); + perceiveSelector.setPerceiveCapability(CognationManager.getInstance()); } } } @@ -28,21 +33,26 @@ public class PerceiveSelector implements InteractionModule, PreModuleActions { @Override public void execute(InteractionContext context) throws IOException, ClassNotFoundException { - + log.debug("[PerceiveSelector] 感知模块处理流程开始..."); + //处理思路: 根据用户id,查询用户相关身份感知数据,直接添加到appendPrompt中,这直接执行appendPrompt方法应该可以 + setAppendedPrompt(context); + setActiveModule(context); + log.debug("[PerceiveSelector] 感知模块处理流程结束..."); } @Override - public void setAppendedPrompt(InteractionContext context) { - + protected HashMap getPromptDataMap(String userId) { + HashMap map = new HashMap<>(); + User user = perceiveCapability.getUser(userId); + map.put("[关系] <你与最新聊天用户的关系>", user.getRelation()); + map.put("[态度] <你对于最新聊天用户的态度>", user.getAttitude().toString()); + map.put("[印象] <你对于最新聊天用户的印象>", user.getImpressions().toString()); + map.put("[静态记忆] <你关于最新聊天用户的静态记忆>", user.getStaticMemory().toString()); + return map; } @Override - public void setActiveModule(InteractionContext context) { - - } - - @Override - public String getModuleName() { - return ""; + public String moduleName() { + return "[感知模块]"; } } diff --git a/src/main/java/work/slhaf/agent/module/modules/perceive/updater/PerceiveUpdater.java b/src/main/java/work/slhaf/agent/module/modules/perceive/updater/PerceiveUpdater.java new file mode 100644 index 00000000..1b591bfd --- /dev/null +++ b/src/main/java/work/slhaf/agent/module/modules/perceive/updater/PerceiveUpdater.java @@ -0,0 +1,94 @@ +package work.slhaf.agent.module.modules.perceive.updater; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.common.chat.pojo.ChatResponse; +import work.slhaf.agent.common.chat.pojo.Message; +import work.slhaf.agent.common.thread.InteractionThreadPoolExecutor; +import work.slhaf.agent.core.cognation.CognationCapability; +import work.slhaf.agent.core.cognation.CognationManager; +import work.slhaf.agent.core.cognation.submodule.perceive.PerceiveCapability; +import work.slhaf.agent.core.cognation.submodule.perceive.pojo.User; +import work.slhaf.agent.core.interaction.data.context.InteractionContext; +import work.slhaf.agent.core.interaction.module.InteractionModule; +import work.slhaf.agent.module.common.Model; +import work.slhaf.agent.module.common.ModelConstant; +import work.slhaf.agent.module.modules.perceive.updater.pojo.PerceiveChatInput; +import work.slhaf.agent.module.modules.perceive.updater.pojo.PerceiveChatResult; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * 感知更新,异步 + */ +@EqualsAndHashCode(callSuper = true) +@Slf4j +@Data +public class PerceiveUpdater extends Model implements InteractionModule { + + private static volatile PerceiveUpdater perceiveUpdater; + private PerceiveCapability perceiveCapability; + private CognationCapability cognationCapability; + private InteractionThreadPoolExecutor executor; + + private List tempMessages; + + public static PerceiveUpdater getInstance() throws IOException, ClassNotFoundException { + if (perceiveUpdater == null) { + synchronized (PerceiveUpdater.class) { + if (perceiveUpdater == null) { + perceiveUpdater = new PerceiveUpdater(); + perceiveUpdater.setPerceiveCapability(CognationManager.getInstance()); + perceiveUpdater.setCognationCapability(CognationManager.getInstance()); + perceiveUpdater.setExecutor(InteractionThreadPoolExecutor.getInstance()); + setModel(perceiveUpdater, perceiveUpdater.modelKey(), ModelConstant.Prompt.PERCEIVE, false); + } + } + } + return perceiveUpdater; + } + + @Override + public void execute(InteractionContext context) throws IOException, ClassNotFoundException { + executor.execute(() -> { + boolean trigger = context.getModuleContext().getExtraContext().getBoolean("perceive_updater"); + if (!trigger){ + return; + } + tempMessages = new ArrayList<>(cognationCapability.getChatMessages()); + String userId = context.getUserId(); + PerceiveChatInput input = getPerceiveInput(userId); + PerceiveChatResult perceiveChatResult = getPerceiveResult(input); + perceiveCapability.updateUser(perceiveChatResult,context.getUserId()); + }); + } + + private PerceiveChatResult getPerceiveResult(PerceiveChatInput input) { + ChatResponse response = singleChat(JSONObject.toJSONString(input)); + return JSONObject.parseObject(response.getMessage(), PerceiveChatResult.class); + } + + private PerceiveChatInput getPerceiveInput(String userId) { + HashMap map = new HashMap<>(); + User user = perceiveCapability.getUser(userId); + map.put("[用户昵称] <用户的昵称信息>",user.getNickName()); + map.put("[关系] <你与用户的关系>", user.getRelation()); + map.put("[态度] <你对于用户的态度>", user.getAttitude().toString()); + map.put("[印象] <你对于用户的印象>", user.getImpressions().toString()); + map.put("[静态记忆] <你关于用户的静态记忆>", user.getStaticMemory().toString()); + PerceiveChatInput input = new PerceiveChatInput(); + input.setPrimaryUserPerceive(map); + input.setChatMessages(tempMessages); + return input; + } + + @Override + protected String modelKey() { + return "perceive_updater"; + } +} diff --git a/src/main/java/work/slhaf/agent/module/modules/perceive/updater/pojo/PerceiveChatInput.java b/src/main/java/work/slhaf/agent/module/modules/perceive/updater/pojo/PerceiveChatInput.java new file mode 100644 index 00000000..fc8faa7b --- /dev/null +++ b/src/main/java/work/slhaf/agent/module/modules/perceive/updater/pojo/PerceiveChatInput.java @@ -0,0 +1,13 @@ +package work.slhaf.agent.module.modules.perceive.updater.pojo; + +import lombok.Data; +import work.slhaf.agent.common.chat.pojo.Message; + +import java.util.HashMap; +import java.util.List; + +@Data +public class PerceiveChatInput { + private HashMap primaryUserPerceive; + private List chatMessages; +} diff --git a/src/main/java/work/slhaf/agent/module/modules/perceive/updater/pojo/PerceiveChatResult.java b/src/main/java/work/slhaf/agent/module/modules/perceive/updater/pojo/PerceiveChatResult.java new file mode 100644 index 00000000..919ebc6e --- /dev/null +++ b/src/main/java/work/slhaf/agent/module/modules/perceive/updater/pojo/PerceiveChatResult.java @@ -0,0 +1,13 @@ +package work.slhaf.agent.module.modules.perceive.updater.pojo; + +import lombok.Data; + +import java.util.List; + +@Data +public class PerceiveChatResult { + private String relation; + private List impressions; + private List attitude; + private List staticMemory; +} diff --git a/src/main/java/work/slhaf/agent/module/modules/perceive/updater/static_extractor/StaticPerceiveExtractor.java b/src/main/java/work/slhaf/agent/module/modules/perceive/updater/static_extractor/StaticPerceiveExtractor.java index f9241198..0d112161 100644 --- a/src/main/java/work/slhaf/agent/module/modules/perceive/updater/static_extractor/StaticPerceiveExtractor.java +++ b/src/main/java/work/slhaf/agent/module/modules/perceive/updater/static_extractor/StaticPerceiveExtractor.java @@ -18,15 +18,13 @@ public class StaticPerceiveExtractor extends Model { private static volatile StaticPerceiveExtractor staticPerceiveExtractor; - public static final String MODEL_KEY = "static_extractor"; - public static StaticPerceiveExtractor getInstance() { if (staticPerceiveExtractor == null) { synchronized (StaticPerceiveExtractor.class) { if (staticPerceiveExtractor == null) { staticPerceiveExtractor = new StaticPerceiveExtractor(); - setModel(staticPerceiveExtractor, MODEL_KEY, ModelConstant.Prompt.MEMORY, true); + setModel(staticPerceiveExtractor, staticPerceiveExtractor.modelKey(), ModelConstant.Prompt.MEMORY, true); } } } @@ -40,4 +38,9 @@ public class StaticPerceiveExtractor extends Model { jsonObject.forEach((k, v) -> result.put(k, (String) v)); return result; } + + @Override + protected String modelKey() { + return "static_extractor"; + } } diff --git a/src/main/java/work/slhaf/agent/module/modules/process/PostprocessExecutor.java b/src/main/java/work/slhaf/agent/module/modules/process/PostprocessExecutor.java new file mode 100644 index 00000000..cd8deb4d --- /dev/null +++ b/src/main/java/work/slhaf/agent/module/modules/process/PostprocessExecutor.java @@ -0,0 +1,39 @@ +package work.slhaf.agent.module.modules.process; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import work.slhaf.agent.core.cognation.CognationCapability; +import work.slhaf.agent.core.cognation.CognationManager; +import work.slhaf.agent.core.interaction.data.context.InteractionContext; +import work.slhaf.agent.core.interaction.module.InteractionModule; + +import java.io.IOException; + +@Slf4j +@Data +public class PostprocessExecutor implements InteractionModule { + + private static volatile PostprocessExecutor postprocessExecutor; + private static final int POST_PROCESS_TRIGGER_ROLL_LIMIT = 36; + + private CognationCapability cognationCapability; + + public static PostprocessExecutor getInstance() throws IOException, ClassNotFoundException { + if (postprocessExecutor == null) { + synchronized (PostprocessExecutor.class) { + if (postprocessExecutor == null) { + postprocessExecutor = new PostprocessExecutor(); + postprocessExecutor.setCognationCapability(CognationManager.getInstance()); + } + } + } + return postprocessExecutor; + } + + @Override + public void execute(InteractionContext context) throws IOException, ClassNotFoundException { + boolean trigger = cognationCapability.getChatMessages().size() >= POST_PROCESS_TRIGGER_ROLL_LIMIT; + context.getModuleContext().getExtraContext().put("post_process_trigger", trigger); + log.debug("[PostprocessExecutor] 是否执行后处理: {}", trigger); + } +} diff --git a/src/main/java/work/slhaf/agent/module/modules/preprocess/PreprocessExecutor.java b/src/main/java/work/slhaf/agent/module/modules/process/PreprocessExecutor.java similarity index 98% rename from src/main/java/work/slhaf/agent/module/modules/preprocess/PreprocessExecutor.java rename to src/main/java/work/slhaf/agent/module/modules/process/PreprocessExecutor.java index 6f7a7874..17e5fe28 100644 --- a/src/main/java/work/slhaf/agent/module/modules/preprocess/PreprocessExecutor.java +++ b/src/main/java/work/slhaf/agent/module/modules/process/PreprocessExecutor.java @@ -1,4 +1,4 @@ -package work.slhaf.agent.module.modules.preprocess; +package work.slhaf.agent.module.modules.process; import lombok.Data; import lombok.extern.slf4j.Slf4j;