diff --git a/src/main/java/com/knowledge/base/application/service/LLMAppServiceImpl.java b/src/main/java/com/knowledge/base/application/service/LLMAppServiceImpl.java index 578e9c0..0ac1435 100644 --- a/src/main/java/com/knowledge/base/application/service/LLMAppServiceImpl.java +++ b/src/main/java/com/knowledge/base/application/service/LLMAppServiceImpl.java @@ -71,6 +71,7 @@ public class LLMAppServiceImpl implements LLMAppService { if (StrUtil.isNotEmpty(slugId)) { // pin逻辑 pinnedDocs = pinDocsByKeywords(llmToken, slugId, esFilepaths, question); + log.info("question={} , 已占用 slugId={}, pinnedDocs={}", question, slugId, JSONUtil.toJsonStr(pinnedDocs)); } else { log.info("无可用的LLM工作区(slug),降级为无pin模式: question={}, 正在回答的问题: {}", question, JSONUtil.toJsonStr(workspaceSelector.getAllInUseSlugQuestions())); } diff --git a/src/main/java/com/knowledge/base/infrastructure/config/DynamicConfig.java b/src/main/java/com/knowledge/base/infrastructure/config/DynamicConfig.java index 8403dfd..ed74589 100644 --- a/src/main/java/com/knowledge/base/infrastructure/config/DynamicConfig.java +++ b/src/main/java/com/knowledge/base/infrastructure/config/DynamicConfig.java @@ -44,14 +44,14 @@ public class DynamicConfig { @Value("${llm.enable.auto.pin:false}") private String enableAutoPin; - @Value("{llm.default.workspace.name:部门知识库}") + @Value("${llm.default.workspace.name:部门知识库}") private String llmDefaultWsName; - @Value("{llm.default.slug.id:87e14982-a821-48d8-9c6b-3557d0bb2f96}") + @Value("${llm.default.slug.id:87e14982-a821-48d8-9c6b-3557d0bb2f96}") private String llmDefaultSlugId; - @Value("${llm.active.slug.ids: 87e14982-a821-48d8-9c6b-3557d0bb2f96,bcd9ba38-36a6-4e1d-a0a4-933a96fce665}") - private String llmActiveSlugIds; + @Value("${llm.active.slug.ids:0fbab149-0bdb-4499-93c7-936dec40812d,bcd9ba38-36a6-4e1d-a0a4-933a96fce665}") + private String llmSharedActiveSlugIds; @Value("${markdown.path}") private String mdDirectoryPath; @@ -61,7 +61,7 @@ public class DynamicConfig { public Set getLlmActiveSlugs() { // 支持逗号、分号和换行分隔 - return Arrays.stream(llmActiveSlugIds.split("[,;\\n]")) + return Arrays.stream(llmSharedActiveSlugIds.split("[,;\\n]")) .map(String::trim) .filter(StrUtil::isNotBlank) .collect(Collectors.toSet()); diff --git a/src/main/java/com/knowledge/base/infrastructure/south/llm/AnythingLLMServiceImpl.java b/src/main/java/com/knowledge/base/infrastructure/south/llm/AnythingLLMServiceImpl.java index d7676f4..06cb1f5 100644 --- a/src/main/java/com/knowledge/base/infrastructure/south/llm/AnythingLLMServiceImpl.java +++ b/src/main/java/com/knowledge/base/infrastructure/south/llm/AnythingLLMServiceImpl.java @@ -60,6 +60,7 @@ public class AnythingLLMServiceImpl implements AnythingLLMService { slug = fetchSlugByWsName(llmToken, (String) params.getOrDefault(ConstantConfig.LLM_WS_NAME_KEY, dynamicConfig.getLlmDefaultWsName())); } + log.info("[准备开始回答问题]: question={}, slug={}", question, slug); String url = baseUrl + "/api/workspace/" + slug + "/stream-chat"; Map body = Map.of( diff --git a/src/main/java/com/knowledge/base/infrastructure/south/llm/WorkspaceSelector.java b/src/main/java/com/knowledge/base/infrastructure/south/llm/WorkspaceSelector.java index 96b3a8c..5c0e42e 100644 --- a/src/main/java/com/knowledge/base/infrastructure/south/llm/WorkspaceSelector.java +++ b/src/main/java/com/knowledge/base/infrastructure/south/llm/WorkspaceSelector.java @@ -2,31 +2,47 @@ package com.knowledge.base.infrastructure.south.llm; import cn.hutool.core.util.StrUtil; import com.knowledge.base.infrastructure.config.DynamicConfig; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Component +@Slf4j public class WorkspaceSelector { - private final Set availableSlugs; + + private final DynamicConfig dynamicConfig; + // slugInUse 状态只保留当前 Nacos 配置的 slug private final Map slugInUse = new ConcurrentHashMap<>(); - // 仅为日志打印保存 slug->question,释放时清理即可 private final Map slugQuestion = new ConcurrentHashMap<>(); @Autowired public WorkspaceSelector(DynamicConfig dynamicConfig) { - this.availableSlugs = dynamicConfig.getLlmActiveSlugs(); - availableSlugs.forEach(slug -> slugInUse.put(slug, false)); + this.dynamicConfig = dynamicConfig; + } + + /** + * 获取当前最新的slug集合 + */ + private Set getCurrentSlugs() { + Set slugs = dynamicConfig.getLlmActiveSlugs(); + // 同步slugInUse和slugQuestion,仅保留现有slug + slugInUse.keySet().removeIf(slug -> !slugs.contains(slug)); + slugQuestion.keySet().removeIf(slug -> !slugs.contains(slug)); + // 为新slug初始化状态 + for (String slug : slugs) { + slugInUse.putIfAbsent(slug, false); + } + return slugs; } /** * 获取一个空闲的slug,返回StrUtil.EMPTY则无可用 - * 并记录question,方便日志打印 */ public synchronized String acquire(String question) { + Set availableSlugs = getCurrentSlugs(); for (String slug : availableSlugs) { if (!slugInUse.getOrDefault(slug, false)) { slugInUse.put(slug, true); @@ -39,7 +55,9 @@ public class WorkspaceSelector { /** 释放slug,同时清理question */ public synchronized void release(String slug) { + Set availableSlugs = getCurrentSlugs(); if (availableSlugs.contains(slug)) { + log.info("slug is released: {}, question: {}", slug, slugQuestion.get(slug)); slugInUse.put(slug, false); slugQuestion.remove(slug); } @@ -54,8 +72,8 @@ public class WorkspaceSelector { * 获取当前所有已占用的slug及对应的question */ public Map getAllInUseSlugQuestions() { - // 返回不可变拷贝,避免外部修改内部map + // 返回当前有效slug的快照 + getCurrentSlugs(); // 同步最新 return new ConcurrentHashMap<>(slugQuestion); } - }