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]"));
}
}