Commit 262f1b7cc048615434c5ebf28b35d538a7ce4751
1 parent
e715e1dd
添加未清选择 改成动态引导语
Showing
6 changed files
with
21 additions
and
8 deletions
src/main/java/com/xly/agent/AgentSystemPrompt.java
| ... | ... | @@ -20,4 +20,12 @@ public class AgentSystemPrompt { |
| 20 | 20 | "2. 严禁与用户进行任何对话!严禁输出“您好”、“请提供”、“需要补充”等任何纯文本回复!\n" + |
| 21 | 21 | "3. 无论用户输入多么简短(例如只输入了公司名),或者参数缺失多么严重,你都必须直接调用工具,将缺失的字段留空或填0。\n" + |
| 22 | 22 | "4. 不要试图去引导用户,引导用户是你的后端程序要做的事,你只需要负责把提取到的参数传出去。"; |
| 23 | + | |
| 24 | + public static final String sSystemPromptQuo = "你是参数提取器,不是聊天助手。\n" + | |
| 25 | + "【绝对指令】\n" + | |
| 26 | + "1. 你的唯一任务是提取用户输入中的参数,并立即调用工具。\n" + | |
| 27 | + "2. 严禁与用户进行任何对话!严禁输出“您好”、“请提供”、“需要补充”等任何纯文本回复!\n" + | |
| 28 | + "3. 无论用户输入多么简短(例如只输入了公司名),或者参数缺失多么严重,你都必须直接调用工具,将缺失的字段留空或填0。\n" + | |
| 29 | + "4. 印刷行业知识库:提取参数前,请先理解行业知识库,再进行方法匹配和参数提取,知识库内容如下:" + | |
| 30 | + " - {}"; | |
| 23 | 31 | } |
| 24 | 32 | \ No newline at end of file | ... | ... |
src/main/java/com/xly/agent/SystemPromptGenerator.java
| ... | ... | @@ -12,16 +12,18 @@ import java.util.stream.Collectors; |
| 12 | 12 | |
| 13 | 13 | public class SystemPromptGenerator { |
| 14 | 14 | |
| 15 | - public static String generate(String toolName, UserSceneSession session) { | |
| 15 | + public static String generate(String toolName, UserSceneSession session,String sKnowledgeBase) { | |
| 16 | 16 | StringBuilder sb = new StringBuilder(); |
| 17 | - | |
| 18 | 17 | sb.append("你是一个无情的参数提取器,不是聊天助手。\n\n"); |
| 19 | 18 | sb.append("【核心任务】\n"); |
| 20 | 19 | sb.append("从用户输入中提取参数,并立即调用工具 ").append(toolName).append("。\n\n"); |
| 21 | 20 | sb.append("【绝对指令】\n"); |
| 22 | 21 | sb.append("1. 严禁与用户对话,严禁输出任何纯文本回复。\n"); |
| 23 | 22 | sb.append("2. 无论参数缺失多么严重,都必须直接调用工具,缺失字段填空字符串或0。\n"); |
| 24 | - sb.append("3. 不要引导用户,后端程序会处理引导逻辑。\n\n"); | |
| 23 | + if(ObjectUtil.isNotEmpty(sKnowledgeBase)){ | |
| 24 | + sb.append("3. 印刷行业知识库:提取参数前,请先理解行业知识库,再进行方法匹配和参数提取,知识库内容如下: \n"); | |
| 25 | + sb.append(" - "+sKnowledgeBase); | |
| 26 | + } | |
| 25 | 27 | sb.append("【参数提取规则】\n"); |
| 26 | 28 | sb.append("用户输入格式为 \"参数名: 值\" 或 \"参数名 值\",你必须识别参数名并提取对应的值。\n\n"); |
| 27 | 29 | sb.append("【可提取的参数列表】\n"); |
| ... | ... | @@ -37,7 +39,6 @@ public class SystemPromptGenerator { |
| 37 | 39 | if (count++ >= 3) break; |
| 38 | 40 | sb.append("- 用户输入 \"").append(paramRule.getSParam()).append(": {值}\" → 提取 ").append(paramRule.getSParam()).append("\n"); |
| 39 | 41 | } |
| 40 | - | |
| 41 | 42 | if(ObjectUtil.isNotEmpty(session.getArgs())){ |
| 42 | 43 | sb.append("【已提取参数】\n"); |
| 43 | 44 | sb.append(JSON.toJSONString(session.getArgs(), JSONWriter.Feature.PrettyFormat)); | ... | ... |
src/main/java/com/xly/entity/ToolMeta.java
| ... | ... | @@ -52,6 +52,7 @@ public class ToolMeta { |
| 52 | 52 | private String sVectorjson; |
| 53 | 53 | private String sVectorfiledAll; |
| 54 | 54 | private String sVectorfiledShow; |
| 55 | + private String sKnowledgeBase; | |
| 55 | 56 | private String sTsMemo; |
| 56 | 57 | private Boolean sQue = false; |
| 57 | 58 | private Boolean bQuo = false; | ... | ... |
src/main/java/com/xly/mapper/ToolMetaMapper.java
| ... | ... | @@ -13,6 +13,6 @@ import java.util.List; |
| 13 | 13 | public interface ToolMetaMapper { |
| 14 | 14 | |
| 15 | 15 | // XML配置方式 |
| 16 | - @Select("SELECT A.* FROM ai_tool AS A order by iOrder") | |
| 16 | + @Select("SELECT A.*,fun_ai_getsKnowledgeBase(A.sId) AS sKnowledgeBase FROM ai_tool AS A order by iOrder") | |
| 17 | 17 | List<ToolMeta> findAll(); |
| 18 | 18 | } |
| 19 | 19 | \ No newline at end of file | ... | ... |
src/main/java/com/xly/service/XlyErpService.java
| ... | ... | @@ -355,7 +355,8 @@ public class XlyErpService { |
| 355 | 355 | && ObjectUtil.isNotEmpty(session.getCurrentTool().getSInputTabelName()) |
| 356 | 356 | && ObjectUtil.isNotEmpty(session.getCurrentTool().getSStructureMemo())) |
| 357 | 357 | ){ |
| 358 | - String sSystemPrompt = AgentSystemPrompt.sSystemPrompt; | |
| 358 | + String sSystemPrompt = session.getCurrentTool().getBQuo()?AgentSystemPrompt.sSystemPromptQuo:AgentSystemPrompt.sSystemPrompt; | |
| 359 | + sSystemPrompt = StrUtil.format(sSystemPrompt,session.getCurrentTool().getSKnowledgeBase()); | |
| 359 | 360 | //如果客户输入了确认/生成 切换引导语言 |
| 360 | 361 | if(ObjectUtil.isNotEmpty(session.getSSystemPrompt()) && isConfirmed){ |
| 361 | 362 | sSystemPrompt = session.getSSystemPrompt(); |
| ... | ... | @@ -365,7 +366,7 @@ public class XlyErpService { |
| 365 | 366 | } |
| 366 | 367 | //报价每次定义参数 |
| 367 | 368 | if(!isConfirmed && ObjectUtil.isNotEmpty(session) && ObjectUtil.isNotEmpty(session.getCurrentTool()) && session.getCurrentTool().getBQuo()){ |
| 368 | - sSystemPrompt = SystemPromptGenerator.generate(session.getCurrentTool().getSMethodName(),session); | |
| 369 | + sSystemPrompt = SystemPromptGenerator.generate(session.getCurrentTool().getSMethodName(),session,session.getCurrentTool().getSKnowledgeBase()); | |
| 369 | 370 | aiAgent = createConfirmeAgent(session); |
| 370 | 371 | } |
| 371 | 372 | Result<String> rs = aiAgent.chat(userId, input,sSystemPrompt); | ... | ... |
src/main/java/com/xly/tool/DynamicToolProvider.java
| ... | ... | @@ -590,7 +590,9 @@ public class DynamicToolProvider implements ToolProvider { |
| 590 | 590 | } |
| 591 | 591 | } |
| 592 | 592 | String sendUrl = baseUrl + UrlErpConstant.getBusinessDataByFormcustomId; |
| 593 | - sendUrl = StrUtil.format(sendUrl,sAIshowfieldShowAll.get(0).get("sFormcustomId"),sSrcFormId); | |
| 593 | + if(ObjectUtil.isNotEmpty(sAIshowfieldShowAll) && ObjectUtil.isNotEmpty(sAIshowfieldShowAll.get(0))){ | |
| 594 | + sendUrl = StrUtil.format(sendUrl,sAIshowfieldShowAll.get(0).get("sFormcustomId"),sSrcFormId); | |
| 595 | + } | |
| 594 | 596 | meta.setSendUrl(sendUrl); |
| 595 | 597 | paramRuleList = paramRuleListNew; |
| 596 | 598 | paramRuleListCheck = paramRuleListNew; | ... | ... |