diff --git a/src/main/java/com/supervision/pdfqaserver/cache/PromptCache.java b/src/main/java/com/supervision/pdfqaserver/cache/PromptCache.java index b3666ca..dc8b96e 100644 --- a/src/main/java/com/supervision/pdfqaserver/cache/PromptCache.java +++ b/src/main/java/com/supervision/pdfqaserver/cache/PromptCache.java @@ -220,7 +220,7 @@ public class PromptCache { } 请处理以下文本: - {} + {}/no_think """; private static final String DOERE_TABLE_PROMPT = """ @@ -270,7 +270,7 @@ public class PromptCache { } 请处理以下表格: - {} + {}/no_think """; private static final String TEXT_TO_CYPHER_PROMPT = """ @@ -316,7 +316,7 @@ public class PromptCache { 【用户问题】 {query} 【你的任务】 - 根据以上数据库结构和用户问题,生成正确的Cypher查询语句。 + 根据以上数据库结构和用户问题,生成正确的Cypher查询语句。/no_think """; private static final String GENERATE_ANSWER_PROMPT = """ @@ -358,7 +358,7 @@ public class PromptCache { 5. **输出要求**: - 不要使用``````等任何Markdown标记包装 - - 只需返回转换后的英文名称,无需解释。 + - 只需返回转换后的英文名称,无需解释。/no_think """; @@ -398,7 +398,7 @@ public class PromptCache { 2. 不要使用中文标签(如`人物`→`Person`); 3. 不要省略MERGE的安全约束。 ### 请转换以下三元组: - {} + {}/no_think """; private static final String CLASSIFY_TABLE_PROMPT = """ @@ -440,7 +440,7 @@ public class PromptCache { 是 请处理以下表格: - {} + {}/no_think """; private static final String EXTRACT_TABLE_TITLE_PROMPT = """ @@ -454,7 +454,7 @@ public class PromptCache { - 直接给出结果,不要解释 **需要处理的文本** - {} + {}/no_think """; @@ -535,10 +535,7 @@ public class PromptCache { 2. 不需要解释,不需要说明。 仅返回以下两种结果之一: - 匹配成功:`{"ContentType": 0/1/2}` - - 匹配失败:`{}` - - ./no_think - + - 匹配失败:`{}`/no_think """; private static final String CLASSIFY_INDUSTRY_PROMPT = """ @@ -548,10 +545,7 @@ public class PromptCache { 请结合文本内容中的专业术语、关键领域、上下文信息,准确判断其所属行业,并返回对应的行业名称。 ### 输入: - - ``` {text} - ``` ### 行业列表 @@ -566,12 +560,9 @@ public class PromptCache { ### 示例输出: - - ``` { industryCategory:软件与信息技术 - } - ``` + }/no_think """; private static final String CLASSIFY_INTENT_PROMPT = """ @@ -607,9 +598,10 @@ public class PromptCache { 输出: { "IntentTypeList": [] - } + }/no_think """; + // 需要大模型进行思考 private static final String CLASSIFY_INTENT_TRAIN_PROMPT = """ # 提取出文本片段的意图 @@ -688,7 +680,7 @@ public class PromptCache { ... ], "意图2": ... - } + }/no_think """; private static final String EXTRACT_ERE_BASE_INTENT_PROMPT = """ @@ -751,7 +743,7 @@ public class PromptCache { } } ] - } + }/no_think """; @@ -776,7 +768,7 @@ public class PromptCache { 输出:["意图1", "意图2", "意图3", ...] ## 当前用户问题: - {query} + {query}/no_think """; @@ -814,6 +806,6 @@ public class PromptCache { 5. 生成最终Cypher脚本: - 仅返回最终Cypher查询语句——不包含任何评论或额外文本 - 仅当用户显式要求且模式支持时使用OPTIONAL MATCH - - 确保RETURN子句包含关系数据,可通过显式列出关系变量或使用路径变量实现 + - 确保RETURN子句包含关系数据,可通过显式列出关系变量或使用路径变量实现/no_think """; } diff --git a/src/main/java/com/supervision/pdfqaserver/config/OllamaChatModelAspect.java b/src/main/java/com/supervision/pdfqaserver/config/OllamaChatModelAspect.java index c2a7678..271f908 100644 --- a/src/main/java/com/supervision/pdfqaserver/config/OllamaChatModelAspect.java +++ b/src/main/java/com/supervision/pdfqaserver/config/OllamaChatModelAspect.java @@ -30,12 +30,12 @@ public class OllamaChatModelAspect { // 获取原始参数 Object[] args = joinPoint.getArgs(); // 如果是String类型的call方法,修改其参数 - if (StrUtil.equals(signature, callStringMessage) && args.length > 0) { + /*if (StrUtil.equals(signature, callStringMessage) && args.length > 0) { args[0] = args[0] + "\n /no_think"; - } + }*/ // 执行原方法 Object result = joinPoint.proceed(args); - if (StrUtil.equals(model,"qwen3:30b-a3b") ) { + if (StrUtil.equals(model,"qwen3:30b-a3b")|| StrUtil.equals(model,"qwen3:32b")) { if(StrUtil.equals(signature, callStringMessage)){ result = ((String) result).replaceAll("(?is)]*>(.*?)", "").trim(); } diff --git a/src/main/java/com/supervision/pdfqaserver/dto/DomainMetadataDTO.java b/src/main/java/com/supervision/pdfqaserver/dto/DomainMetadataDTO.java index a11ec43..02d8ac5 100644 --- a/src/main/java/com/supervision/pdfqaserver/dto/DomainMetadataDTO.java +++ b/src/main/java/com/supervision/pdfqaserver/dto/DomainMetadataDTO.java @@ -95,4 +95,42 @@ public class DomainMetadataDTO { } } + /** + * 构造函数 倒反天罡.... + * @param erAttributes erAttributes + * @param domainMetadata domainMetadata + */ + public DomainMetadataDTO(List erAttributes,DomainMetadata domainMetadata) { + this.id = domainMetadata.getId(); + this.domainCategoryId = domainMetadata.getDomainCategoryId(); + this.sourceType = domainMetadata.getSourceType(); + this.relation = domainMetadata.getRelation(); + this.targetType = domainMetadata.getTargetType(); + this.generationType = domainMetadata.getGenerationType(); + + for (ErAttribute erAttribute : erAttributes) { + if(StrUtil.equals(erAttribute.getErType(),"1")){ + // 节点数据 + if (StrUtil.equals(erAttribute.getErLabel(),this.sourceType)) { + boolean none = this.sourceAttributes.stream().noneMatch(item -> StrUtil.equals(item.getAttrName(), erAttribute.getAttrName())); + if (none){ + this.sourceAttributes.add(new ERAttributeDTO(erAttribute)); + } + } + if (StrUtil.equals(erAttribute.getErLabel(),this.targetType)) { + boolean none = this.targetAttributes.stream().noneMatch(item -> StrUtil.equals(item.getAttrName(), erAttribute.getAttrName())); + if (none){ + this.targetAttributes.add(new ERAttributeDTO(erAttribute)); + } + } + }else { + if (StrUtil.equals(erAttribute.getErLabel(),this.relation)) { + if (this.relationAttributes.stream().noneMatch(item -> StrUtil.equals(item.getAttrName(), erAttribute.getAttrName()))){ + this.relationAttributes.add(new ERAttributeDTO(erAttribute)); + } + } + } + } + } + } diff --git a/src/main/java/com/supervision/pdfqaserver/mapper/ErAttributeMapper.java b/src/main/java/com/supervision/pdfqaserver/mapper/ErAttributeMapper.java index c0ab13d..d36f293 100644 --- a/src/main/java/com/supervision/pdfqaserver/mapper/ErAttributeMapper.java +++ b/src/main/java/com/supervision/pdfqaserver/mapper/ErAttributeMapper.java @@ -2,6 +2,8 @@ package com.supervision.pdfqaserver.mapper; import com.supervision.pdfqaserver.domain.ErAttribute; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; /** * @author Administrator @@ -11,6 +13,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface ErAttributeMapper extends BaseMapper { + List listByDomainCategoryId(@Param("domainCategoryId") String domainCategoryId); } diff --git a/src/main/java/com/supervision/pdfqaserver/service/DomainMetadataService.java b/src/main/java/com/supervision/pdfqaserver/service/DomainMetadataService.java index 673433f..677cd15 100644 --- a/src/main/java/com/supervision/pdfqaserver/service/DomainMetadataService.java +++ b/src/main/java/com/supervision/pdfqaserver/service/DomainMetadataService.java @@ -52,4 +52,12 @@ public interface DomainMetadataService extends IService { * @return */ List listByIntentionIds(List intentionIds); + + /** + * 根据意图ID和领域分类ID查询领域元数据 + * @param intentionIds 意图ID列表 + * @param domainCategoryId 领域分类ID + * @return + */ + List listByIntentionIds(List intentionIds,String domainCategoryId); } diff --git a/src/main/java/com/supervision/pdfqaserver/service/ErAttributeService.java b/src/main/java/com/supervision/pdfqaserver/service/ErAttributeService.java index 4c08384..f321648 100644 --- a/src/main/java/com/supervision/pdfqaserver/service/ErAttributeService.java +++ b/src/main/java/com/supervision/pdfqaserver/service/ErAttributeService.java @@ -18,4 +18,6 @@ public interface ErAttributeService extends IService { List listByDomainMetadataId(String domainMetadataId); List listByDomainMetadataIds(List domainMetadataIds); + + List listByDomainCategoryId(String domainCategoryId); } diff --git a/src/main/java/com/supervision/pdfqaserver/service/impl/DomainMetadataServiceImpl.java b/src/main/java/com/supervision/pdfqaserver/service/impl/DomainMetadataServiceImpl.java index 4f241c3..905802b 100644 --- a/src/main/java/com/supervision/pdfqaserver/service/impl/DomainMetadataServiceImpl.java +++ b/src/main/java/com/supervision/pdfqaserver/service/impl/DomainMetadataServiceImpl.java @@ -147,10 +147,28 @@ public class DomainMetadataServiceImpl extends ServiceImpl erAttributes = erAttributeService.listByDomainMetadataIds(domainMetadataIds); for (IntentionDomainMetadata intentionDomainMetadata : intentionDomainMetadataList) { DomainMetadata domainMetadata = this.getById(intentionDomainMetadata.getDomainMetadataId()); + // 要求合并全局属性 domainMetadataDTOS.add(new DomainMetadataDTO(domainMetadata, erAttributes)); } return domainMetadataDTOS; } + + @Override + public List listByIntentionIds(List intentionIds, String domainCategoryId) { + List domainMetadataDTOS = new ArrayList<>(); + List intentionDomainMetadataList = intentionDomainMetadataService.listByIntentionIds(intentionIds); + if (CollUtil.isEmpty(intentionDomainMetadataList)){ + return domainMetadataDTOS; + } + // 查询domainCategoryId下的所有属性 + List erAttributes = erAttributeService.listByDomainCategoryId(domainCategoryId); + for (IntentionDomainMetadata intentionDomainMetadata : intentionDomainMetadataList) { + DomainMetadata domainMetadata = this.getById(intentionDomainMetadata.getDomainMetadataId()); + // 要求合并全局属性 + domainMetadataDTOS.add(new DomainMetadataDTO(erAttributes,domainMetadata)); + } + return domainMetadataDTOS; + } } diff --git a/src/main/java/com/supervision/pdfqaserver/service/impl/ErAttributeServiceImpl.java b/src/main/java/com/supervision/pdfqaserver/service/impl/ErAttributeServiceImpl.java index 21cbfba..5823a5a 100644 --- a/src/main/java/com/supervision/pdfqaserver/service/impl/ErAttributeServiceImpl.java +++ b/src/main/java/com/supervision/pdfqaserver/service/impl/ErAttributeServiceImpl.java @@ -9,6 +9,7 @@ import com.supervision.pdfqaserver.service.ErAttributeService; import com.supervision.pdfqaserver.mapper.ErAttributeMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; /** @@ -47,6 +48,14 @@ public class ErAttributeServiceImpl extends ServiceImpl listByDomainCategoryId(String domainCategoryId) { + if (StrUtil.isEmpty(domainCategoryId)){ + return new ArrayList<>(); + } + return super.getBaseMapper().listByDomainCategoryId(domainCategoryId); + } } diff --git a/src/main/java/com/supervision/pdfqaserver/service/impl/TripleConversionPipelineImpl.java b/src/main/java/com/supervision/pdfqaserver/service/impl/TripleConversionPipelineImpl.java index 5e5971a..6320697 100644 --- a/src/main/java/com/supervision/pdfqaserver/service/impl/TripleConversionPipelineImpl.java +++ b/src/main/java/com/supervision/pdfqaserver/service/impl/TripleConversionPipelineImpl.java @@ -116,7 +116,7 @@ public class TripleConversionPipelineImpl implements TripleConversionPipeline { log.info("makeOutDomainMetadata:format:{}", format); String call = aiCallService.call(format); log.info("makeOutDomainMetadata:响应结果:{}", call); - return parseDomainMetadata(call); + return parseDomainMetadataObj(call); } /** @@ -186,6 +186,59 @@ public class TripleConversionPipelineImpl implements TripleConversionPipeline { return domainMetadataDTOS; } + private List parseDomainMetadataObj(String jsonStr) { + JSONObject entries = JSONUtil.parseObj(jsonStr); + List domainMetadataDTOS = new ArrayList<>(); + for (Map.Entry entry : entries) { + String intent = entry.getKey();// 意图 + Object value = entry.getValue(); + JSONArray jsonArray = JSONUtil.parseArray(value); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + DomainMetadataDTO domainMetadataDTO = new DomainMetadataDTO(); + JSONObject source = jsonObject.getJSONObject("source"); + JSONObject relation = jsonObject.getJSONObject("relation"); + JSONObject target = jsonObject.getJSONObject("target"); + domainMetadataDTO.setIntentDigest(intent); + if (null != source){ + String type = source.getStr("type"); + JSONArray attributes = source.getJSONArray("attributes"); + if (StrUtil.isNotEmpty(type)){ + domainMetadataDTO.setSourceType(type); + } + if (CollUtil.isNotEmpty(attributes)){ + List erAttributeDTOS = attributes.stream().map(at -> new ERAttributeDTO(at.toString())).collect(Collectors.toList()); + domainMetadataDTO.setSourceAttributes(erAttributeDTOS); + } + } + if (null != relation){ + String type = relation.getStr("type"); + JSONArray attributes = relation.getJSONArray("attributes"); + if (StrUtil.isNotEmpty(type)){ + domainMetadataDTO.setRelation(type); + } + if (CollUtil.isNotEmpty(attributes)){ + List erAttributeDTOS = attributes.stream().map(at -> new ERAttributeDTO(at.toString())).collect(Collectors.toList()); + domainMetadataDTO.setRelationAttributes(erAttributeDTOS); + } + } + if (null != target){ + String type = target.getStr("type"); + JSONArray attributes = target.getJSONArray("attributes"); + if (StrUtil.isNotEmpty(type)){ + domainMetadataDTO.setTargetType(type); + } + if (CollUtil.isNotEmpty(attributes)){ + List erAttributeDTOS = attributes.stream().map(at -> new ERAttributeDTO(at.toString())).collect(Collectors.toList()); + domainMetadataDTO.setTargetAttributes(erAttributeDTOS); + } + } + domainMetadataDTOS.add(domainMetadataDTO); + } + } + return domainMetadataDTOS; + } + @Override public EREDTO doEre(TruncateDTO truncateDTO, List intents) { if (StrUtil.equals(truncateDTO.getLayoutType(),String.valueOf(LayoutTypeEnum.TEXT.getCode()))){ @@ -197,7 +250,7 @@ public class TripleConversionPipelineImpl implements TripleConversionPipeline { if (CollUtil.isEmpty(intentIds)) { return null; } - List domainMetadataDTOS = domainMetadataService.listByIntentionIds(intentIds); + List domainMetadataDTOS = domainMetadataService.listByIntentionIds(intentIds,CollUtil.getFirst(intents).getDomainCategoryId()); log.info("doEre:领域元数据列表个数:{}", domainMetadataDTOS.size()); domainMetadataDTOS = domainMetadataDTOS.stream() .filter(domainMetadataDTO -> StrUtil.equals(domainMetadataDTO.getGenerationType(), "0"))// 过滤出手动确认的数据 diff --git a/src/main/java/com/supervision/pdfqaserver/service/impl/TripleToCypherExecutorImpl.java b/src/main/java/com/supervision/pdfqaserver/service/impl/TripleToCypherExecutorImpl.java index 3e960a4..faec4e8 100644 --- a/src/main/java/com/supervision/pdfqaserver/service/impl/TripleToCypherExecutorImpl.java +++ b/src/main/java/com/supervision/pdfqaserver/service/impl/TripleToCypherExecutorImpl.java @@ -251,9 +251,9 @@ public class TripleToCypherExecutorImpl implements TripleToCypherExecutor { List> intentionSplit = CollUtil.split(intentions, 200); for (List intentionList : intentionSplit) { log.info("分类意图,query: {}, intentions size: {}", query, intentionList.size()); - String intents = intentionList.stream().map(i -> " - " + i.getDigest() + "\n").collect(Collectors.joining()); + List intents = intentionList.stream().map(Intention::getDigest).toList(); Map params = Map.of("query", query, - "intents", intents); + "intents", JSONUtil.toJsonStr(intents)); String format = StrUtil.format(prompt, params); String call = aiCallService.call(format); diff --git a/src/main/resources/mapper/ErAttributeMapper.xml b/src/main/resources/mapper/ErAttributeMapper.xml index 13fd2f1..5072d1d 100644 --- a/src/main/resources/mapper/ErAttributeMapper.xml +++ b/src/main/resources/mapper/ErAttributeMapper.xml @@ -20,4 +20,12 @@ attr_name,attr_value_type,er_type, create_time,update_time + diff --git a/src/test/java/com/supervision/pdfqaserver/PdfQaServerApplicationTests.java b/src/test/java/com/supervision/pdfqaserver/PdfQaServerApplicationTests.java index 93c9fc7..5f034cf 100644 --- a/src/test/java/com/supervision/pdfqaserver/PdfQaServerApplicationTests.java +++ b/src/test/java/com/supervision/pdfqaserver/PdfQaServerApplicationTests.java @@ -3,7 +3,6 @@ package com.supervision.pdfqaserver; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; import com.supervision.pdfqaserver.constant.DocumentContentTypeEnum; import com.supervision.pdfqaserver.domain.PdfAnalysisOutput; import com.supervision.pdfqaserver.dto.*; @@ -289,7 +288,11 @@ class PdfQaServerApplicationTests { } return jsa.toString(); + } + @Test + public void domainCategoryListTest() { - + List domainMetadataDTOS = domainMetadataService.listByIntentionIds(List.of("1928020787140612097"), "1"); + System.out.println(domainMetadataDTOS); } }