From 5864760f35b3016195b127539c19f0a56dddf021 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Sun, 19 Oct 2025 22:05:27 +0800 Subject: [PATCH] =?UTF-8?q?Action=20=E6=A8=A1=E5=9D=97=E8=AF=AD=E4=B9=89?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=9C=BA=E5=88=B6=E5=AE=9E=E7=8E=B0=E5=AE=8C?= =?UTF-8?q?=E6=AF=95=EF=BC=8C=E6=94=AF=E6=8C=81=E4=B8=89=E7=A7=8D=E6=83=85?= =?UTF-8?q?=E5=86=B5=E7=9A=84=E8=AF=AD=E4=B9=89=E7=BC=93=E5=AD=98=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=A1=8C=E4=B8=BA:=20=E5=91=BD=E4=B8=AD=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E4=B8=94=E8=AF=84=E4=BC=B0=E9=80=9A=E8=BF=87=E3=80=81?= =?UTF-8?q?=E5=91=BD=E4=B8=AD=E7=BC=93=E5=AD=98=E4=BD=86=E8=AF=84=E4=BC=B0?= =?UTF-8?q?=E6=9C=AA=E9=80=9A=E8=BF=87=E3=80=81=E6=9C=AA=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=BD=86=E8=AF=84=E4=BC=B0=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E3=80=82=E5=B0=86=E5=9C=A8=E8=AF=84=E4=BC=B0=E8=BF=87=E5=90=8E?= =?UTF-8?q?=E6=AD=A5=E5=85=A5=E4=B8=BB=E6=A8=A1=E5=9D=97=E4=B9=8B=E5=89=8D?= =?UTF-8?q?=EF=BC=8C=E8=BF=9B=E8=A1=8C=E5=BC=82=E6=AD=A5=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=93=8D=E4=BD=9C(=E5=80=9F=E5=8A=A9@AfterExecute=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=EF=BC=8C=E9=80=9A=E8=BF=87=E8=99=9A=E6=8B=9F=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E8=BF=9B=E5=85=A5=E5=BC=82=E6=AD=A5=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E7=9C=9F=E6=AD=A3=E8=B0=83=E7=94=A8=E5=A4=84?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=B9=B3=E5=8F=B0=E7=BA=BF=E7=A8=8B=E5=8A=A0?= =?UTF-8?q?=E9=80=9F=E8=AE=A1=E7=AE=97)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../partner/common/vector/VectorClient.java | 21 +++ .../partner/core/action/ActionCapability.java | 2 +- .../slhaf/partner/core/action/ActionCore.java | 124 ++++++++++--- .../core/action/entity/ActionCacheData.java | 168 +++++++++++++++++- .../core/action/entity/CacheAdjustData.java | 6 +- .../action/entity/CacheAdjustMetaData.java | 10 ++ .../modules/action/planner/ActionPlanner.java | 26 +-- .../planner/extractor/ActionExtractor.java | 1 - .../extractor/entity/ExtractorResult.java | 1 - 9 files changed, 317 insertions(+), 42 deletions(-) create mode 100644 Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/CacheAdjustMetaData.java diff --git a/Partner-Main/src/main/java/work/slhaf/partner/common/vector/VectorClient.java b/Partner-Main/src/main/java/work/slhaf/partner/common/vector/VectorClient.java index 26229d4b..bd8f7bf9 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/common/vector/VectorClient.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/common/vector/VectorClient.java @@ -64,4 +64,25 @@ public abstract class VectorClient { return Transforms.cosineSim(a1, a2); } } + + public float[] weightedAverage(float[] newVector, float[] primaryVector) { + try (INDArray primary = Nd4j.create(primaryVector); + INDArray latest = Nd4j.create(newVector)) { + + // 1️⃣ 计算余弦相似度 + double similarity = Transforms.cosineSim(primary, latest); + + // 2️⃣ 根据相似度决定更新比例 α(差异越大,新输入影响越强) + double alpha = (1.0 - similarity) * 0.5; + alpha = Math.max(0.05, Math.min(alpha, 0.5)); + + // 3️⃣ 按比例混合旧向量与新向量 + INDArray updated = primary.mul(1 - alpha).add(latest.mul(alpha)); + + // 4️⃣ 归一化结果(保持方向空间一致) + updated = updated.div(updated.norm2Number()); + + return updated.toFloatVector(); + } + } } \ No newline at end of file diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java index c75bd8b7..69bf78bd 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java @@ -22,5 +22,5 @@ public interface ActionCapability { List selectTendencyCache(String input); - void updateTendencyCache(List list); + void updateTendencyCache(CacheAdjustData data); } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java index e412d02d..502a3753 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java @@ -1,21 +1,28 @@ package work.slhaf.partner.core.action; +import lombok.extern.slf4j.Slf4j; import work.slhaf.partner.api.agent.factory.capability.annotation.Capability; import work.slhaf.partner.api.agent.factory.capability.annotation.CapabilityMethod; import work.slhaf.partner.common.vector.VectorClient; import work.slhaf.partner.core.PartnerCore; import work.slhaf.partner.core.action.entity.ActionCacheData; import work.slhaf.partner.core.action.entity.CacheAdjustData; +import work.slhaf.partner.core.action.entity.CacheAdjustMetaData; import work.slhaf.partner.core.action.entity.MetaActionInfo; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; @SuppressWarnings("FieldMayBeFinal") @Capability(value = "action") +@Slf4j public class ActionCore extends PartnerCore { /** @@ -33,6 +40,10 @@ public class ActionCore extends PartnerCore { */ private List actionCache = new ArrayList<>(); + private Lock cacheLock = new ReentrantLock(); + + private Executor executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + public ActionCore() throws IOException, ClassNotFoundException { } @@ -105,43 +116,116 @@ public class ActionCore extends PartnerCore { } @CapabilityMethod - public void updateTendencyCache(List list) { - List matchAndPassed = new ArrayList<>(); - List matchNotPassed = new ArrayList<>(); - List notMatchPassed = new ArrayList<>(); + public void updateTendencyCache(CacheAdjustData data) { + VectorClient vectorClient = VectorClient.INSTANCE; + List list = data.getMetaDataList(); + String input = data.getInput(); + float[] inputVector = vectorClient.compute(input); - for (CacheAdjustData data : list) { - if (data.isHit() && data.isPassed()) { - matchAndPassed.add(data); - } else if (data.isHit()) { - matchNotPassed.add(data); - } else if (!data.isPassed()) { - notMatchPassed.add(data); + List matchAndPassed = new ArrayList<>(); + List matchNotPassed = new ArrayList<>(); + List notMatchPassed = new ArrayList<>(); + + for (CacheAdjustMetaData metaData : list) { + if (metaData.isHit() && metaData.isPassed()) { + matchAndPassed.add(metaData); + } else if (metaData.isHit()) { + matchNotPassed.add(metaData); + } else if (!metaData.isPassed()) { + notMatchPassed.add(metaData); } } - VectorClient vectorClient = VectorClient.INSTANCE; - adjustMatchAndPassed(matchAndPassed, vectorClient); - adjustMatchNotPassed(matchNotPassed, vectorClient); - adjustNotMatchPassed(notMatchPassed, vectorClient); + executor.execute(() -> adjustMatchAndPassed(matchAndPassed, inputVector, input, vectorClient)); + executor.execute(() -> adjustMatchNotPassed(matchNotPassed, vectorClient)); + executor.execute(() -> adjustNotMatchPassed(notMatchPassed, inputVector, input, vectorClient)); } /** - * 命中缓存且评估通过时,根据输入内容的语义向量与现有的输入语义向量进行带权移动平均,以相似度为权重 + * 命中缓存且评估通过时 * * @param matchAndPassed 该类型的带调整缓存信息列表 + * @param inputVector 本次输入内容的语义向量 * @param vectorClient 向量客户端 */ - private void adjustMatchAndPassed(List matchAndPassed, VectorClient vectorClient) { - + private void adjustMatchAndPassed(List matchAndPassed, float[] inputVector, String input, VectorClient vectorClient) { + matchAndPassed.forEach(adjustData -> { + //获取原始缓存条目 + String tendency = adjustData.getTendency(); + ActionCacheData primaryCacheData = selectCacheData(tendency); + if (primaryCacheData == null) { + return; + } + primaryCacheData.updateAfterMatchAndPassed(inputVector, vectorClient, input); + }); } - private void adjustMatchNotPassed(List matchNotPassed, VectorClient vectorClient) { + /** + * 针对命中缓存、但评估未通过的条目与输入进行处理 + * + * @param matchNotPassed 该类型的带调整缓存信息列表 + * @param vectorClient 向量客户端 + */ + private void adjustMatchNotPassed(List matchNotPassed, VectorClient vectorClient) { + List toRemove = new ArrayList<>(); + matchNotPassed.forEach(adjustData -> { + //获取原始缓存条目 + String tendency = adjustData.getTendency(); + ActionCacheData primaryCacheData = selectCacheData(tendency); + if (primaryCacheData == null) { + return; + } + boolean remove = primaryCacheData.updateAfterMatchNotPassed(vectorClient); + if (remove) { + toRemove.add(primaryCacheData); + } + }); + cacheLock.lock(); + actionCache.removeAll(toRemove); + cacheLock.unlock(); } - private void adjustNotMatchPassed(List notMatchPassed, VectorClient vectorClient) { + /** + * 针对未命中但评估通过的缓存做出调整: + *
    + *

    如果存在缓存条目

    + *
  1. + * 若已生效,但此时未匹配到则说明尚未生效或者阈值、向量{@link ActionCacheData#getInputVector()}存在问题,调低阈值,同时带权移动平均 + *
  2. + *
  3. + * 若未生效,则只增加计数并带权移动平均 + *
  4. + *
+ * 如果不存在缓存条目,则新增并填充字段 + * + * @param notMatchPassed 该类型的带调整缓存信息列表 + * @param inputVector 本次输入内容的语义向量 + * @param input 本次输入内容 + * @param vectorClient 向量客户端 + */ + private void adjustNotMatchPassed(List notMatchPassed, float[] inputVector, String input, VectorClient vectorClient) { + notMatchPassed.forEach(adjustData -> { + //获取原始缓存条目 + String tendency = adjustData.getTendency(); + ActionCacheData primaryCacheData = selectCacheData(tendency); + float[] tendencyVector = vectorClient.compute(tendency); + if (primaryCacheData == null) { + actionCache.add(new ActionCacheData(tendency, tendencyVector, inputVector, input)); + return; + } + primaryCacheData.updateAfterNotMatchPassed(input, inputVector, tendencyVector, vectorClient); + }); + } + private ActionCacheData selectCacheData(String tendency) { + for (ActionCacheData actionCacheData : actionCache) { + if (actionCacheData.getTendency().equals(tendency)) { + return actionCacheData; + } + } + log.warn("[{}] 未找到行为倾向[{}]对应的缓存条目,可能是代码逻辑存在错误", getCoreKey(), tendency); + return null; } @Override diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionCacheData.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionCacheData.java index ce859d6b..caba8198 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionCacheData.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/ActionCacheData.java @@ -1,25 +1,181 @@ package work.slhaf.partner.core.action.entity; import lombok.Data; +import work.slhaf.partner.common.vector.VectorClient; import java.util.ArrayList; import java.util.List; @Data public class ActionCacheData { - private boolean activated; - private int inputMatchCount; + private boolean activated = false; + private int inputMatchCount = 1; private float[] inputVector; private float[] tendencyVector; private String tendency; - private double threshold; + private double threshold = 0.75; private List validSamples = new ArrayList<>(); - private int failedCount; - private Type type; + private int failedCount = 0; + private Type type = Type.PRIMARY; - enum Type { + public ActionCacheData(String tendency, float[] tendencyVector, float[] inputVector, String input) { + this.tendency = tendency; + this.inputVector = inputVector; + this.tendencyVector = tendencyVector; + this.validSamples.add(input); + } + + /** + * 命中缓存且评估通过时,根据输入内容的语义向量与现有的输入语义向量进行带权移动平均,以相似度为权重,同时降低失败计数,为零时置为上一级缓存类型{@link ActionCacheData.Type} + * + * @param inputVector 本次输入内容对应的语义向量 + * @param vectorClient 向量客户端 + * @param input 本次输入内容 + */ + public synchronized void updateAfterMatchAndPassed(float[] inputVector, VectorClient vectorClient, String input) { + updateInputVector(inputVector, vectorClient); + addValidSample(input); + reduceFailedCount(); + updateType(); + addInputMatchCount(); + } + + private void updateType() { + if (this.failedCount == 0) { + this.type = switch (type) { + case PRIMARY, REBUILD_V1 -> ActionCacheData.Type.PRIMARY; + case REBUILD_V2 -> ActionCacheData.Type.REBUILD_V1; + case REBUILD_V3 -> ActionCacheData.Type.REBUILD_V2; + }; + } + } + + private void reduceFailedCount() { + this.failedCount = Math.max(this.failedCount - 1, 0); + } + + private void addValidSample(String input) { + if (this.validSamples.size() == 12) { + this.validSamples.removeFirst(); + } + this.validSamples.add(input); + } + + private void updateInputVector(float[] inputVector, VectorClient vectorClient) { + this.inputVector = vectorClient.weightedAverage(inputVector, this.inputVector); + } + + /** + * 针对命中缓存、但评估未通过的条目与输入进行处理: 增加失败计数(必要时重建并更新类型等级)、调高阈值(0.02),由于缓存匹配但评估未通过,所以不进行带权移动平均 + * + * @param vectorClient 向量客户端 + * @return 是否需要删除(已在REBUILD_V3状态且达到最大误判次数的) + */ + public synchronized boolean updateAfterMatchNotPassed(VectorClient vectorClient) { + adjustThreshold(); + addFailedCount(); + if (this.failedCount < 3) { + return false; + } + if (this.type == Type.REBUILD_V3) { + return true; + } + rebuildAndSwitchType(vectorClient); + return false; + } + + private void rebuildAndSwitchType(VectorClient vectorClient) { + this.type = switch (this.type) { + case PRIMARY -> { + //样本顺序反转后,以全部样本重建 + this.validSamples = this.validSamples.reversed(); + rebuildWithSamples(vectorClient); + yield Type.REBUILD_V1; + } + case REBUILD_V1 -> { + //截取后一半样本,反转后以此重建 + List temp = this.validSamples.subList(this.validSamples.size() / 2, this.validSamples.size()); + this.validSamples = temp.reversed(); + rebuildWithSamples(vectorClient); + yield Type.REBUILD_V2; + } + case REBUILD_V2 -> { + //截取后四分之一样本,反转后以此重建 + List temp = this.validSamples.subList(this.validSamples.size() / 4, this.validSamples.size()); + this.validSamples = temp.reversed(); + rebuildWithSamples(vectorClient); + yield Type.REBUILD_V3; + } + case REBUILD_V3 -> null; + }; + //阈值减0.05,防止重建后一直升高 + this.threshold = Math.max(this.threshold - 0.05, 0.75); + this.failedCount = 0; + } + + private void rebuildWithSamples(VectorClient vectorClient) { + for (int i = 0; i < this.validSamples.size(); i++) { + String sample = this.validSamples.get(i); + if (i == 0) { + this.inputVector = vectorClient.compute(sample); + } else { + float[] newSampleVector = vectorClient.compute(sample); + this.inputVector = vectorClient.weightedAverage(this.inputVector, newSampleVector); + } + } + } + + private void addFailedCount() { + this.failedCount = Math.min(this.failedCount + 1, 3); + } + + private void adjustThreshold() { + double newThreshold = this.threshold + 0.03; + this.threshold = Math.min(newThreshold, 0.95); + } + + /** + * 针对未命中但评估通过的已存在缓存做出调整: + *
    + *
  1. + * 若已生效,但此时未匹配到则说明阈值或者向量{@link ActionCacheData#getInputVector()}存在问题,调低阈值,同时带权移动平均 + *
  2. + *
  3. + * 若未生效,则只增加计数并带权移动平均 + *
  4. + *
+ * + * @param input 本次输入内容 + * @param inputVector 本次输入内容对应的语义向量 + * @param tendencyVector 本次倾向对应的语义向量 + * @param vectorClient 向量客户端 + */ + public synchronized void updateAfterNotMatchPassed(String input, float[] inputVector, float[] tendencyVector, VectorClient vectorClient) { + if (this.activated) { + reduceThreshold(); + this.inputVector = vectorClient.weightedAverage(inputVector, this.inputVector); + } else { + addValidSample(input); + this.tendencyVector = vectorClient.weightedAverage(tendencyVector, this.tendencyVector); + addInputMatchCount(); + } + } + + private void reduceThreshold() { + double newThreshold = this.threshold - 0.02; + this.threshold = Math.max(newThreshold, 0.75); + } + + private void addInputMatchCount() { + this.inputMatchCount += 1; + if (inputMatchCount >= 6) { + this.activated = true; + } + } + + public enum Type { PRIMARY, REBUILD_V1, REBUILD_V2, REBUILD_V3 } } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/CacheAdjustData.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/CacheAdjustData.java index 24a06ba3..b0289fde 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/CacheAdjustData.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/CacheAdjustData.java @@ -2,10 +2,10 @@ package work.slhaf.partner.core.action.entity; import lombok.Data; +import java.util.List; + @Data public class CacheAdjustData { private String input; - private String tendency; - private boolean passed; - private boolean hit; + private List metaDataList; } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/CacheAdjustMetaData.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/CacheAdjustMetaData.java new file mode 100644 index 00000000..3afed553 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/CacheAdjustMetaData.java @@ -0,0 +1,10 @@ +package work.slhaf.partner.core.action.entity; + +import lombok.Data; + +@Data +public class CacheAdjustMetaData { + private String tendency; + private boolean passed; + private boolean hit; +} 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 01452070..abfbe049 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,11 +1,13 @@ package work.slhaf.partner.module.modules.action.planner; 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.entity.*; import work.slhaf.partner.core.cognation.CognationCapability; @@ -83,26 +85,30 @@ public class ActionPlanner extends PreRunningModule { } EvaluatorInput evaluatorInput = assemblyHelper.buildEvaluatorInput(extractorResult, context.getUserId()); List evaluatorResults = actionEvaluator.execute(evaluatorInput); //并发操作均为访问 - if (extractorResult.isCacheEnabled()) - updateTendencyCache(evaluatorResults, context.getInput(), extractorResult); setupActionInfo(evaluatorResults, context); return null; }); } + @AfterExecute private void updateTendencyCache(List evaluatorResults, String input, ExtractorResult extractorResult) { + if (!VectorClient.status) { + return; + } executor.execute(() -> { - List list = new ArrayList<>(); + CacheAdjustData data = new CacheAdjustData(); + List list = new ArrayList<>(); List hitTendencies = extractorResult.getTendencies(); for (EvaluatorResult result : evaluatorResults) { - CacheAdjustData data = new CacheAdjustData(); - data.setTendency(result.getTendency()); - data.setInput(input); - data.setPassed(result.isOk()); - data.setHit(hitTendencies.contains(result.getTendency())); - list.add(data); + CacheAdjustMetaData metaData = new CacheAdjustMetaData(); + metaData.setTendency(result.getTendency()); + metaData.setPassed(result.isOk()); + metaData.setHit(hitTendencies.contains(result.getTendency())); + list.add(metaData); } - actionCapability.updateTendencyCache(list); + data.setMetaDataList(list); + data.setInput(input); + actionCapability.updateTendencyCache(data); }); } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/ActionExtractor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/ActionExtractor.java index a9f19f43..eb1acb9b 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/ActionExtractor.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/ActionExtractor.java @@ -24,7 +24,6 @@ public class ActionExtractor extends AgentRunningSubModule tendencyCache = actionCapability.selectTendencyCache(data.getInput()); - result.setCacheEnabled(tendencyCache != null); if (tendencyCache != null && !tendencyCache.isEmpty()) { result.setTendencies(tendencyCache); return result; diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorResult.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorResult.java index 5d8791d5..fd13d86c 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorResult.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/planner/extractor/entity/ExtractorResult.java @@ -7,6 +7,5 @@ import java.util.List; @Data public class ExtractorResult { - private boolean cacheEnabled; private List tendencies = new ArrayList<>(); }