From f48d559a7b0ce9eb54f9250f6bb83ed049cd643d Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Sun, 30 Nov 2025 14:38:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=86=20ActionInterventor?= =?UTF-8?q?=20=E4=B8=AD=E6=95=B0=E6=8D=AE=E6=9E=84=E5=BB=BA=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E7=9A=84=E7=BB=84=E7=BB=87=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/interventor/ActionInterventor.java | 288 +++++++++--------- .../modules/action/planner/ActionPlanner.java | 27 +- 2 files changed, 168 insertions(+), 147 deletions(-) diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java index 75cd80e1..cf2e5c94 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/interventor/ActionInterventor.java @@ -55,6 +55,9 @@ public class ActionInterventor extends PreRunningModule implements ActivateModel @InjectCapability private MemoryCapability memoryCapability; + private final AssemblyHelper assemblyHelper = new AssemblyHelper(); + private final PromptHelper promptHelper = new PromptHelper(); + /** * 键: 本次调用uuid; * 值:本次调用对应的prompt; @@ -71,15 +74,15 @@ public class ActionInterventor extends PreRunningModule implements ActivateModel String uuid = context.getUuid(); String userId = context.getUserId(); RecognizerResult recognizerResult = interventionRecognizer - .execute(buildRecognizerInput(userId, context.getInput())); // 此处的输入内容携带了所有 PhaserRecord + .execute(assemblyHelper.buildRecognizerInput(userId, context.getInput())); // 此处的输入内容携带了所有 PhaserRecord if (!recognizerResult.isOk()) { - setupNoInterventionPrompt(uuid); + promptHelper.setupNoInterventionPrompt(uuid); return; } // 干预意图评估 EvaluatorResult evaluatorResult = interventionEvaluator - .execute(buildEvaluatorInput(recognizerResult, userId)); + .execute(assemblyHelper.buildEvaluatorInput(recognizerResult, userId)); List executingDataList = evaluatorResult.getExecutingDataList(); List preparedDataList = evaluatorResult.getPreparedDataList(); @@ -90,10 +93,10 @@ public class ActionInterventor extends PreRunningModule implements ActivateModel invalidActionKeysFilter(preparedDataList); // 同步写入prompt,异步处理干预行为,‘异步’在 interventionHandler 中体现 - setupInterventionPrompt(uuid, executingDataList, preparedDataList); - interventionHandler.execute(buildHandlerInput(executingDataList, preparedDataList, recognizerResult)); + promptHelper.setupInterventionPrompt(uuid, executingDataList, preparedDataList); + interventionHandler.execute(assemblyHelper.buildHandlerInput(executingDataList, preparedDataList, recognizerResult)); } else { - setupInterventionIgnoredPrompt(uuid, executingDataList, preparedDataList); + promptHelper.setupInterventionIgnoredPrompt(uuid, executingDataList, preparedDataList); } } @@ -136,137 +139,6 @@ public class ActionInterventor extends PreRunningModule implements ActivateModel return true; } - /** - * @param executingDataList 对应评估结果中的‘执行中行动’ - * @param preparedDataList 对应评估结果中的‘待执行行动’ - * @param recognizerResult 干预识别结果,包含‘执行中’‘待执行’两类评估结果各自对应的行动数据 - * @return 处理器输入 - */ - private HandlerInput buildHandlerInput(List executingDataList, - List preparedDataList, RecognizerResult recognizerResult) { - HandlerInput input = new HandlerInput(); - Map executingInterventions = recognizerResult.getExecutingInterventions(); - Map preparedInterventions = recognizerResult.getPreparedInterventions(); - - List executing = setupInputDataList(executingDataList, executingInterventions, - ExecutingInterventionData::new); - List prepared = setupInputDataList(preparedDataList, preparedInterventions, - PreparedInterventionData::new); - - input.setExecuting(executing); - input.setPrepared(prepared); - - return input; - } - - /** - * @param HandlerInput 中 List 对应的泛型 - * @param evaluatedDataList 评估结果列表 - * @param interventionMap 干预识别结果中的 tendency:data 映射 - * @param factory 输入类型构建工厂 - * @return 处理器输入(干预列表) - */ - private List setupInputDataList(List evaluatedDataList, - Map interventionMap, Supplier factory) { - - List result = new ArrayList<>(); - - for (EvaluatedInterventionData interventionData : evaluatedDataList) { - - I data = factory.get(); - - if (data instanceof InterventionData inputData) { - inputData.setTendency(interventionData.getTendency()); - inputData.setDescription(interventionData.getDescription()); - inputData.setInterventions(interventionData.getInterventionData()); - } - - if (data instanceof ExecutingInterventionData inputData) { - inputData.setRecord((PhaserRecord) interventionMap.get(interventionData.getTendency())); - } else if (data instanceof PreparedInterventionData inputData) { - inputData.setActionData((ActionData) interventionMap.get(interventionData.getTendency())); - } - - result.add(data); - } - - return result; - } - - private void setupInterventionIgnoredPrompt(String uuid, List executingDataList, List preparedDataList) { - List total = Stream.concat(executingDataList.stream(), preparedDataList.stream()).toList(); - - JSONArray reasons = new JSONArray(); - - for (EvaluatedInterventionData data : total) { - JSONObject reason = reasons.addObject(); - reason.put("[干预倾向]", data.getTendency()); - reason.put("[未采用原因]", data.getDescription()); - } - - synchronized (interventionPrompt) { - interventionPrompt.put(uuid, Map.of( - "[识别状态] <是否识别到干预已存在行动的意图>", "识别到,但都未采用", - "[忽略原因] <各个意图被忽略的原因>", reasons.toString(), - "[干预行动] <将对已存在行动做出的行为>", "无行为")); - } - } - - private void setupInterventionPrompt(String uuid, List executingDataList, - List preparedDataList) { - JSONArray contents = new JSONArray(); - List temp = Stream.concat(executingDataList.stream(), preparedDataList.stream()).toList(); - - for (EvaluatedInterventionData data : temp) { - if (!data.isOk()) { - continue; - } - String tendency = data.getTendency(); - JSONObject newElement = contents.addObject(); - newElement.put("[干预倾向]", tendency); - JSONArray changes = newElement.putArray("[行动链变动情况]"); - - for (MetaIntervention intervention : data.getInterventionData()) { - JSONObject change = changes.addObject(); - change.put("[干预类型]", intervention.getType()); - change.put("[干预序号]", intervention.getOrder()); - change.putArray("[干预内容]").addAll(intervention.getActions()); - } - } - - synchronized (interventionPrompt) { - interventionPrompt.put(uuid, Map.of( - "[识别状态] <是否识别到干预已存在行动的意图>", "识别到,将采用", - "[干预内容] <将对已存在行动做出的行为>", contents.toString())); - } - } - - private void setupNoInterventionPrompt(String uuid) { - interventionPrompt.put(uuid, Map.of( - "[识别状态] <是否识别到干预已存在行动的意图>", "未识别到干预意图", - "[干预行动] <将对已存在行动做出的行为>", "无行动")); - } - - private EvaluatorInput buildEvaluatorInput(RecognizerResult recognizerResult, String userId) { - EvaluatorInput input = new EvaluatorInput(); - input.setExecutingInterventions(recognizerResult.getExecutingInterventions()); - input.setPreparedInterventions(recognizerResult.getPreparedInterventions()); - input.setRecentMessages(cognationCapability.getChatMessages()); - input.setActivatedSlices(memoryCapability.getActivatedSlices(userId)); - return input; - } - - private RecognizerInput buildRecognizerInput(String userId, String input) { - RecognizerInput recognizerInput = new RecognizerInput(); - recognizerInput.setInput(input); - recognizerInput.setUserDialogMapStr(memoryCapability.getUserDialogMapStr(userId)); - // 参考的对话列表大小或需调整 - recognizerInput.setRecentMessages(cognationCapability.getChatMessages()); - recognizerInput.setExecutingActions(actionCapability.listPhaserRecords()); - recognizerInput.setPreparedActions(actionCapability.listPreparedAction(userId)); - return recognizerInput; - } - @Override public String modelKey() { return "action_identifier"; @@ -286,4 +158,146 @@ public class ActionInterventor extends PreRunningModule implements ActivateModel protected String moduleName() { return "[行动干预识别模块]"; } + + private final class AssemblyHelper { + private AssemblyHelper() { + } + + /** + * @param executingDataList 对应评估结果中的‘执行中行动’ + * @param preparedDataList 对应评估结果中的‘待执行行动’ + * @param recognizerResult 干预识别结果,包含‘执行中’‘待执行’两类评估结果各自对应的行动数据 + * @return 处理器输入 + */ + private HandlerInput buildHandlerInput(List executingDataList, + List preparedDataList, RecognizerResult recognizerResult) { + HandlerInput input = new HandlerInput(); + Map executingInterventions = recognizerResult.getExecutingInterventions(); + Map preparedInterventions = recognizerResult.getPreparedInterventions(); + + List executing = setupInputDataList(executingDataList, executingInterventions, + ExecutingInterventionData::new); + List prepared = setupInputDataList(preparedDataList, preparedInterventions, + PreparedInterventionData::new); + + input.setExecuting(executing); + input.setPrepared(prepared); + + return input; + } + + /** + * @param HandlerInput 中 List 对应的泛型 + * @param evaluatedDataList 评估结果列表 + * @param interventionMap 干预识别结果中的 tendency:data 映射 + * @param factory 输入类型构建工厂 + * @return 处理器输入(干预列表) + */ + private List setupInputDataList(List evaluatedDataList, + Map interventionMap, Supplier factory) { + + List result = new ArrayList<>(); + + for (EvaluatedInterventionData interventionData : evaluatedDataList) { + + I data = factory.get(); + + if (data instanceof InterventionData inputData) { + inputData.setTendency(interventionData.getTendency()); + inputData.setDescription(interventionData.getDescription()); + inputData.setInterventions(interventionData.getInterventionData()); + } + + if (data instanceof ExecutingInterventionData inputData) { + inputData.setRecord((PhaserRecord) interventionMap.get(interventionData.getTendency())); + } else if (data instanceof PreparedInterventionData inputData) { + inputData.setActionData((ActionData) interventionMap.get(interventionData.getTendency())); + } + + result.add(data); + } + + return result; + } + + + private RecognizerInput buildRecognizerInput(String userId, String input) { + RecognizerInput recognizerInput = new RecognizerInput(); + recognizerInput.setInput(input); + recognizerInput.setUserDialogMapStr(memoryCapability.getUserDialogMapStr(userId)); + // 参考的对话列表大小或需调整 + recognizerInput.setRecentMessages(cognationCapability.getChatMessages()); + recognizerInput.setExecutingActions(actionCapability.listPhaserRecords()); + recognizerInput.setPreparedActions(actionCapability.listPreparedAction(userId)); + return recognizerInput; + } + + private EvaluatorInput buildEvaluatorInput(RecognizerResult recognizerResult, String userId) { + EvaluatorInput input = new EvaluatorInput(); + input.setExecutingInterventions(recognizerResult.getExecutingInterventions()); + input.setPreparedInterventions(recognizerResult.getPreparedInterventions()); + input.setRecentMessages(cognationCapability.getChatMessages()); + input.setActivatedSlices(memoryCapability.getActivatedSlices(userId)); + return input; + } + } + + private final class PromptHelper { + private PromptHelper() { + } + + private void setupInterventionIgnoredPrompt(String uuid, List executingDataList, List preparedDataList) { + List total = Stream.concat(executingDataList.stream(), preparedDataList.stream()).toList(); + + JSONArray reasons = new JSONArray(); + + for (EvaluatedInterventionData data : total) { + JSONObject reason = reasons.addObject(); + reason.put("[干预倾向]", data.getTendency()); + reason.put("[未采用原因]", data.getDescription()); + } + + synchronized (interventionPrompt) { + interventionPrompt.put(uuid, Map.of( + "[识别状态] <是否识别到干预已存在行动的意图>", "识别到,但都未采用", + "[忽略原因] <各个意图被忽略的原因>", reasons.toString(), + "[干预行动] <将对已存在行动做出的行为>", "无行为")); + } + } + + private void setupInterventionPrompt(String uuid, List executingDataList, + List preparedDataList) { + JSONArray contents = new JSONArray(); + List temp = Stream.concat(executingDataList.stream(), preparedDataList.stream()).toList(); + + for (EvaluatedInterventionData data : temp) { + if (!data.isOk()) { + continue; + } + String tendency = data.getTendency(); + JSONObject newElement = contents.addObject(); + newElement.put("[干预倾向]", tendency); + JSONArray changes = newElement.putArray("[行动链变动情况]"); + + for (MetaIntervention intervention : data.getInterventionData()) { + JSONObject change = changes.addObject(); + change.put("[干预类型]", intervention.getType()); + change.put("[干预序号]", intervention.getOrder()); + change.putArray("[干预内容]").addAll(intervention.getActions()); + } + } + + synchronized (interventionPrompt) { + interventionPrompt.put(uuid, Map.of( + "[识别状态] <是否识别到干预已存在行动的意图>", "识别到,将采用", + "[干预内容] <将对已存在行动做出的行为>", contents.toString())); + } + } + + private void setupNoInterventionPrompt(String uuid) { + interventionPrompt.put(uuid, Map.of( + "[识别状态] <是否识别到干预已存在行动的意图>", "未识别到干预意图", + "[干预行动] <将对已存在行动做出的行为>", "无行动")); + } + } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java index 871168eb..babf2848 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/ActionPlanner.java @@ -1,14 +1,15 @@ package work.slhaf.partner.module.modules.action.planner; +import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.InjectCapability; import work.slhaf.partner.api.agent.factory.module.annotation.AfterExecute; import work.slhaf.partner.api.agent.factory.module.annotation.AgentModule; import work.slhaf.partner.api.agent.factory.module.annotation.Init; import work.slhaf.partner.api.agent.factory.module.annotation.InjectModule; import work.slhaf.partner.api.chat.pojo.Message; -import work.slhaf.partner.common.thread.InteractionThreadPoolExecutor; import work.slhaf.partner.common.vector.VectorClient; import work.slhaf.partner.core.action.ActionCapability; +import work.slhaf.partner.core.action.ActionCore; import work.slhaf.partner.core.action.entity.ActionData; import work.slhaf.partner.core.action.entity.ImmediateActionData; import work.slhaf.partner.core.action.entity.MetaAction; @@ -32,10 +33,12 @@ import work.slhaf.partner.runtime.interaction.data.context.PartnerRunningFlowCon import java.util.*; import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; /** * 负责针对本次输入生成基础的行动计划,在主模型传达意愿后,执行行动或者放入计划池 */ +@Slf4j @AgentModule(name = "action_planner", order = 2) public class ActionPlanner extends PreRunningModule { @@ -55,21 +58,25 @@ public class ActionPlanner extends PreRunningModule { @InjectModule private ActionConfirmer actionConfirmer; - private InteractionThreadPoolExecutor executor; - private ActionAssemblyHelper assemblyHelper; + private ExecutorService executor; + + private final ActionAssemblyHelper assemblyHelper = new ActionAssemblyHelper(); @Init public void init() { - executor = InteractionThreadPoolExecutor.getInstance(); - assemblyHelper = new ActionAssemblyHelper(); + executor = actionCapability.getExecutor(ActionCore.ExecutorType.VIRTUAL); } @Override protected void doExecute(PartnerRunningFlowContext context) { - List> tasks = new ArrayList<>(); - addConfirmTask(tasks, context); - addNewActionTask(tasks, context); - executor.invokeAll(tasks); + try { + List> tasks = new ArrayList<>(); + addConfirmTask(tasks, context); + addNewActionTask(tasks, context); + executor.invokeAll(tasks); + } catch (Exception e) { + log.error("执行异常", e); + } } /** @@ -200,7 +207,7 @@ public class ActionPlanner extends PreRunningModule { return "[行动模块]"; } - private class ActionAssemblyHelper { + private final class ActionAssemblyHelper { private ActionAssemblyHelper() { }