From 6e789a252da3e6966b57b86ee87144991234d994 Mon Sep 17 00:00:00 2001 From: qianbao Date: Mon, 18 May 2026 22:36:26 +0800 Subject: [PATCH] 添加未清选择 改成动态引导语 --- src/main/java/com/xly/service/XlyErpService.java | 48 ++++++++++++++++++++++++++++-------------------- src/main/java/com/xly/tool/DynamicToolProvider.java | 46 ++++++++++++++++++++-------------------------- src/main/java/com/xly/tool/ToolSpecificationHolder.java | 7 ++++++- src/main/java/com/xly/tts/service/PythonTtsProxyService.java | 1 - src/main/resources/application.yml | 3 ++- 5 files changed, 56 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java index 2af76ce..b5fe019 100644 --- a/src/main/java/com/xly/service/XlyErpService.java +++ b/src/main/java/com/xly/service/XlyErpService.java @@ -949,29 +949,37 @@ public class XlyErpService { }else {return null;} } // 4. 获取/创建用Agent - ErpAiAgent aiAgent = UserSceneSessionService.ERP_AGENT_CACHE.get(userId); - if(ObjectUtil.isEmpty(aiAgent)){ - List dataList = dynamicToolProvider.sceneToolCacheMap.get(session.getCurrentScene().getSId()); - Set immediateReturnToolNames = new HashSet<>(); - Map executors = new HashMap<>(); - if(ObjectUtil.isNotEmpty(dataList)){ - dataList.forEach(one->{ - immediateReturnToolNames.add(one.getsName()); - executors.put(one.getToolSpecification(),one.getToolExecutor()); - }); - } - aiAgent = AiServices.builder(ErpAiAgent.class) - .chatModel(chatModel) - .chatMemoryProvider(operableChatMemoryProvider) - .tools(executors,immediateReturnToolNames) + // ErpAiAgent aiAgent = UserSceneSessionService.ERP_AGENT_CACHE.get(userId); +// if(ObjectUtil.isEmpty(aiAgent)){ + List dataList = dynamicToolProvider.sceneToolCacheMap.get(session.getCurrentScene().getSId()); + List dataListOne = + dataList.stream().filter(m-> + userInput.equals(m.getsMethodName().trim()) || ("查询"+userInput).equals(m.getsMethodName().trim()) + ).collect(Collectors.toUnmodifiableList()); + + if(ObjectUtil.isNotEmpty(dataListOne)){ + dataList = dataListOne; + } + Set immediateReturnToolNames = new HashSet<>(); + Map executors = new HashMap<>(); + if(ObjectUtil.isNotEmpty(dataList)){ + dataList.forEach(one->{ + immediateReturnToolNames.add(one.getsName()); + executors.put(one.getToolSpecification(),one.getToolExecutor()); + }); + } + return AiServices.builder(ErpAiAgent.class) + .chatModel(chatModel) + .chatMemoryProvider(operableChatMemoryProvider) + .tools(executors,immediateReturnToolNames) // .toolProvider(dynamicToolProvider) // .returnBehavior(ReturnBehavior.IMMEDIATE) // .toolChoice(ChatCompletionToolChoice.ofRequired()) - .build(); - UserSceneSessionService.ERP_AGENT_CACHE.put(userId, aiAgent); - log.info("用户{}Agent构建完成,已选场景:{},场景ID{}", userId, session.isSceneSelected() ? session.getCurrentScene().getSSceneName() : "未选(全场景匹配)", dynamicToolProvider.sSceneIdMap.get(userId)); - } - return aiAgent; + .build(); +// UserSceneSessionService.ERP_AGENT_CACHE.put(userId, aiAgent); +// log.info("用户{}Agent构建完成,已选场景:{},场景ID{}", userId, session.isSceneSelected() ? session.getCurrentScene().getSSceneName() : "未选(全场景匹配)", dynamicToolProvider.sSceneIdMap.get(userId)); +// } +// return aiAgent; } private ErpAiAgent createConfirmeAgent(UserSceneSession session) { diff --git a/src/main/java/com/xly/tool/DynamicToolProvider.java b/src/main/java/com/xly/tool/DynamicToolProvider.java index 6cc12ef..060305c 100644 --- a/src/main/java/com/xly/tool/DynamicToolProvider.java +++ b/src/main/java/com/xly/tool/DynamicToolProvider.java @@ -83,14 +83,14 @@ public class DynamicToolProvider implements ToolProvider { doSetToolAIshowfieldShow(meta); ToolSpecification spec = buildToolSpecification(meta); ToolExecutor executor = createToolExecutor(meta); - toolCache.put(meta.getSMethodNo(), new ToolSpecificationHolder(spec, executor,meta.getSMethodNo())); + toolCache.put(meta.getSMethodNo(), new ToolSpecificationHolder(spec, executor,meta.getSMethodNo(),meta.getSMethodName())); log.info("已加载动态工具:{}", meta.getSMethodNo()); String sceneId = meta.getSSceneId(); List dataList = new ArrayList<>(); if(ObjectUtil.isNotEmpty(sceneToolCacheMap.get(sceneId))) { dataList = sceneToolCacheMap.get(sceneId); } - dataList.add(new ToolSpecificationHolder(spec, executor,meta.getSMethodNo())); + dataList.add(new ToolSpecificationHolder(spec, executor,meta.getSMethodNo(),meta.getSMethodName())); sceneToolCacheMap.put(sceneId, dataList); } catch (Exception e) { e.printStackTrace(); @@ -1016,31 +1016,25 @@ public class DynamicToolProvider implements ToolProvider { public String buildDynamicSystemPrompt(UserSceneSession session) { String methodNo = session.getCurrentTool().getSMethodNo(); String rowJson = JSONUtil.toJsonStr(session.getCurrentRowData()); - return """ - 【极强约束·必须执行】 - 1. 禁止说话!禁止解释! - 2. 必须调用工具! - 3. 只输出标准工具调用JSON! - - 表格数据: - %s - - 【解析规则】 - 1. 用户说“第N行” → 取对应sSlaveId - 2. 用户说“全部确认” → 取所有sSlaveId - 3. 多行用英文逗号拼接 - - 【输出格式·绝对严格·必须照做】 - 你必须输出标准工具调用JSON,只输出这一段,不许加任何文字: - { - "name": "%s", - "parameters": { - "operateType": "全部确认/合并确认/单行确认", - "sSlaveId": "id1,id2,id3" - } - } - """.formatted(rowJson, methodNo); + 【极强约束·必须执行】 + 1. 禁止说话!禁止解释! + 2. 必须调用工具! + 3. 只输出标准工具调用JSON! + + 表格数据(key是行号): + %s + + 【规则】 + 用户输入如"第N条数据确认",N为行号。 + 在表格中查找 key = N 的数据,取出 sSlaveId。 + + 【输出格式】 + {"name": "%s", "parameters": {"operateType": "单行确认", "sSlaveId": "取出的ID"}} + + 【警告】 + 禁止编造!必须从表格中提取! + """.formatted(rowJson, methodNo); } private List> findFieldNameByChinese(List> sAIshowfieldShow,List> rows){ diff --git a/src/main/java/com/xly/tool/ToolSpecificationHolder.java b/src/main/java/com/xly/tool/ToolSpecificationHolder.java index 758520a..c1a439c 100644 --- a/src/main/java/com/xly/tool/ToolSpecificationHolder.java +++ b/src/main/java/com/xly/tool/ToolSpecificationHolder.java @@ -8,10 +8,12 @@ public class ToolSpecificationHolder { private final ToolSpecification toolSpecification; private final ToolExecutor toolExecutor; private final String sName; - public ToolSpecificationHolder(ToolSpecification toolSpecification, ToolExecutor toolExecutor,String sName) { + private final String sMethodName; + public ToolSpecificationHolder(ToolSpecification toolSpecification, ToolExecutor toolExecutor,String sName,String sMethodName) { this.toolSpecification = toolSpecification; this.toolExecutor = toolExecutor; this.sName = sName; + this.sMethodName = sMethodName; } public ToolSpecification getToolSpecification() { @@ -26,5 +28,8 @@ public class ToolSpecificationHolder { return sName; } + public String getsMethodName() { + return sMethodName; + } } diff --git a/src/main/java/com/xly/tts/service/PythonTtsProxyService.java b/src/main/java/com/xly/tts/service/PythonTtsProxyService.java index 7c74f00..5fdf374 100644 --- a/src/main/java/com/xly/tts/service/PythonTtsProxyService.java +++ b/src/main/java/com/xly/tts/service/PythonTtsProxyService.java @@ -4,7 +4,6 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.xly.constant.BusinessCode; import com.xly.constant.ReturnTypeCode; -import com.xly.entity.AiResponseAccumulator; import com.xly.entity.AiResponseDTO; import com.xly.entity.UserSceneSession; import com.xly.service.UserSceneSessionService; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2e0a787..7bee45b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -135,7 +135,8 @@ langchain4j: ollama: # 聊天模型配置(用于一般对话) base-url: http://112.82.245.194:11434 - chat-model-name: qwen2.5:7b-instruct +# chat-model-name: qwen2.5:7b-instruct + chat-model-name: qwen2.5:14b # chat-model-name: qwen3:14b # chat-model-name: qwen3.5:9b # SQL/代码模型配置(专门用于代码和SQL生成) -- libgit2 0.22.2