diff --git a/src/main/java/com/supervision/pdfqaserver/cache/PromptCache.java b/src/main/java/com/supervision/pdfqaserver/cache/PromptCache.java index 91938bd..a18808b 100644 --- a/src/main/java/com/supervision/pdfqaserver/cache/PromptCache.java +++ b/src/main/java/com/supervision/pdfqaserver/cache/PromptCache.java @@ -224,7 +224,9 @@ public class PromptCache { "\\{ "cypherQueries": [ "MATCH (c:`公司`)-[r:`收购`]->(t:`公司`) RETURN c, r, t", + "MATCH (c:`上市公司`)-[r:`收购`]->(t:`公司`) RETURN c, r, t", "MATCH (c:`公司`)-[r:`收购`]->(t:`上市公司`) RETURN c, r, t", + "MATCH (c:`电力公司`)-[r:`收购`]->(t:`国有企业`) RETURN c, r, t", ..... ] \\}" @@ -245,15 +247,15 @@ public class PromptCache { private static final String GENERATE_ANSWER_PROMPT = """ 一、任务说明 你是一个审计报告的整理助手,你需要对用户询问的问题根据产考数据进行回答。 - 二、用户输入: - {query} - 三、参考文本: + 二、参考数据: {example_text} + 三、用户输入: + {query} 四、注意事项 - 1. 数据核实:需确认是否使用参考文本中的数据。 - 2. 信息时效:可能需要确认数据的时间。 - 3. 问题范围界定:当用户提问超出审计报告分析范畴时,统一采用以下话术回复: - "您好!当前系统功能聚焦于审计报告相关内容分析,您的问题暂不在支持范围内。如需查询财务数据、票据详情或其他审计相关信息,请提供具体问题,我们将全力协助。" + 1. 参考数据进行问答:使用参考数据来回答用户问题 + 2. 问题范围界定:如果参考数据中没有与用户问题相关的信息,统一采用以下话术回复。 + "抱歉目前知识库没有这个问题的答案." + 3. 参考数据是绝对正确的,不需要质疑。不需要解释。 /no_think """; diff --git a/src/main/java/com/supervision/pdfqaserver/service/impl/ChatServiceImpl.java b/src/main/java/com/supervision/pdfqaserver/service/impl/ChatServiceImpl.java index 48e5dcc..b6d1647 100644 --- a/src/main/java/com/supervision/pdfqaserver/service/impl/ChatServiceImpl.java +++ b/src/main/java/com/supervision/pdfqaserver/service/impl/ChatServiceImpl.java @@ -13,9 +13,11 @@ import com.supervision.pdfqaserver.service.DomainMetadataService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.messages.Message; +import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.SystemPromptTemplate; import org.springframework.ai.ollama.OllamaChatModel; +import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; @@ -69,8 +71,10 @@ public class ChatServiceImpl implements ChatService { SystemPromptTemplate textToCypherTemplate = new SystemPromptTemplate(PromptCache.promptMap.get(TEXT_TO_CYPHER)); Message textToCypherMessage = textToCypherTemplate.createMessage(Map.of(PROMPT_PARAM_SOURCE_TYPE_LIST, sourceTypeListEn, PROMPT_PARAM_RELATION_TYPE_LIST, relationListEn, PROMPT_PARAM_TARGET_TYPE_LIST, targetTypeListEn, PROMPT_PARAM_QUERY, userQuery)); log.info("生成CYPHER语句的消息:{}", textToCypherMessage); - String cypherJsonStr = ollamaChatModel.call(textToCypherMessage.getText()); + String cypherJsonStr = ollamaChatModel.call(new Prompt(textToCypherMessage, OllamaOptions.builder().temperature(3.0).build())).getResult().getOutput().getText(); log.info(cypherJsonStr); + log.info(cypherJsonStr.replaceAll("(?is)]*>(.*?)", "").trim()); + cypherJsonStr = cypherJsonStr.replaceAll("(?is)]*>(.*?)", "").trim(); List cypherQueries; try { JSONObject jsonObj = JSONUtil.parseObj(cypherJsonStr); @@ -78,7 +82,7 @@ public class ChatServiceImpl implements ChatService { .toList(String.class); } catch (Exception e) { log.error("解析CYPHER JSON字符串失败: {}", e.getMessage()); - return Flux.just("查无结果"); + return Flux.just("查无结果").concatWith(Flux.just("[END]")); } log.info("转换后的Cypher语句:{}", cypherQueries.toString()); @@ -90,13 +94,14 @@ public class ChatServiceImpl implements ChatService { } } if (relationObjects.isEmpty()) { - return Flux.just("查无结果"); + return Flux.just("查无结果").concatWith(Flux.just("[END]")); } log.info("三元组数据: {}", relationObjects); //生成回答 SystemPromptTemplate generateAnswerTemplate = new SystemPromptTemplate(PromptCache.promptMap.get(GENERATE_ANSWER)); Message generateAnswerMessage = generateAnswerTemplate.createMessage(Map.of(PROMPT_PARAM_EXAMPLE_TEXT, relationObjects, PROMPT_PARAM_QUERY, userQuery)); - return ollamaChatModel.stream(new Prompt(generateAnswerMessage)).map(response -> response.getResult().getOutput().getText()); + log.info("生成回答的提示词:{}", generateAnswerMessage); + return ollamaChatModel.stream(new Prompt(generateAnswerMessage)).map(response -> response.getResult().getOutput().getText()).concatWith(Flux.just("[END]")); } }