Skip to content

Commit dab94d1

Browse files
committed
refactor: ♻️ 使用 Re-reading 对回答进行增强,提高生成内容的质量
1 parent f72235b commit dab94d1

5 files changed

Lines changed: 86 additions & 7 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.stephen.cloud.ai.advisor;
2+
3+
import org.springframework.ai.chat.client.ChatClientRequest;
4+
import org.springframework.ai.chat.client.ChatClientResponse;
5+
import org.springframework.ai.chat.client.advisor.api.AdvisorChain;
6+
import org.springframework.ai.chat.client.advisor.api.BaseAdvisor;
7+
import org.springframework.ai.chat.prompt.PromptTemplate;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.Map;
11+
12+
@Component
13+
public class ReReadingAdvisor implements BaseAdvisor {
14+
15+
private static final String DEFAULT_RE2_ADVISE_TEMPLATE = """
16+
{re2_input_query}
17+
Read the question again: {re2_input_query}
18+
""";
19+
20+
private final String re2AdviseTemplate;
21+
22+
private int order = 0;
23+
24+
public ReReadingAdvisor() {
25+
this(DEFAULT_RE2_ADVISE_TEMPLATE);
26+
}
27+
28+
public ReReadingAdvisor(String re2AdviseTemplate) {
29+
this.re2AdviseTemplate = re2AdviseTemplate;
30+
}
31+
32+
@Override
33+
public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChain advisorChain) {
34+
String augmentedUserText = PromptTemplate.builder()
35+
.template(this.re2AdviseTemplate)
36+
.variables(Map.of("re2_input_query", chatClientRequest.prompt().getUserMessage().getText()))
37+
.build()
38+
.render();
39+
40+
return chatClientRequest.mutate()
41+
.prompt(chatClientRequest.prompt().augmentUserMessage(augmentedUserText))
42+
.build();
43+
}
44+
45+
@Override
46+
public ChatClientResponse after(ChatClientResponse chatClientResponse, AdvisorChain advisorChain) {
47+
return chatClientResponse;
48+
}
49+
50+
@Override
51+
public int getOrder() {
52+
return this.order;
53+
}
54+
55+
public ReReadingAdvisor withOrder(int order) {
56+
this.order = order;
57+
return this;
58+
}
59+
}

algorithm-service/algorithm-ai-service/src/main/java/com/stephen/cloud/ai/config/RagGenerationProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ public class RagGenerationProperties {
1717
/**
1818
* 回答生成温度
1919
*/
20-
private Double temperature = 0.7D;
20+
private Double temperature = 0.4D;
2121
}

algorithm-service/algorithm-ai-service/src/main/java/com/stephen/cloud/ai/service/impl/RAGServiceImpl.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import cn.hutool.json.JSONUtil;
66
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
77
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
8+
import com.stephen.cloud.ai.advisor.ReReadingAdvisor;
89
import com.stephen.cloud.ai.config.RagGenerationProperties;
910
import com.stephen.cloud.ai.convert.RAGConvert;
1011
import com.stephen.cloud.ai.knowledge.retrieval.RagDocumentHelper;
@@ -34,6 +35,7 @@
3435
import org.springframework.ai.chat.messages.Message;
3536
import org.springframework.ai.chat.messages.MessageType;
3637
import org.springframework.ai.chat.messages.UserMessage;
38+
import org.springframework.ai.chat.prompt.PromptTemplate;
3739
import org.springframework.ai.document.Document;
3840
import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;
3941
import org.springframework.ai.rag.generation.augmentation.ContextualQueryAugmenter;
@@ -60,11 +62,24 @@ public class RAGServiceImpl implements RAGService {
6062

6163
private static final String RAG_SYSTEM_PROMPT = """
6264
你是一个严谨的知识库问答助手。
63-
请优先依据检索到的知识片段回答用户问题
64-
如果上下文不足,请明确说明“当前知识库中没有足够信息支持该结论”,不要编造
65-
回答时尽量简洁、准确,并在合适时结合引用片段给出结论
65+
请仅依据检索到的知识片段回答用户问题;不得编造片段中不存在的事实或数据
66+
如果上下文不足,请明确说明“当前知识库中没有足够信息支持该结论”。
67+
引用依据时请使用片段序号或片段头中的 chunkId;回答尽量简洁、准确。
6668
""";
6769

70+
private static final PromptTemplate RAG_CONTEXTUAL_QUERY_AUGMENT_TEMPLATE = new PromptTemplate("""
71+
以下是仅用于本题作答的检索片段:
72+
73+
---------------------
74+
{context}
75+
---------------------
76+
77+
用户问题(若含重复表述以辅助阅读,请抓住实质问题):
78+
{query}
79+
80+
请仅依据上述片段作答;引用时标明片段序号或 chunkId;信息不足时直接说明,不要臆测。
81+
""");
82+
6883
private static final String NO_CONTEXT_ANSWER = "当前知识库没有检索到足够相关的内容,暂时无法给出可靠回答。";
6984

7085
@Resource
@@ -85,6 +100,9 @@ public class RAGServiceImpl implements RAGService {
85100
@Resource
86101
private RagDocumentHelper ragDocumentHelper;
87102

103+
@Resource
104+
private ReReadingAdvisor reReadingAdvisor;
105+
88106
@Override
89107
public Flux<String> askStream(String question, Long knowledgeBaseId, Long userId, Integer topK,
90108
String conversationId) {
@@ -427,16 +445,18 @@ private ChatClient.ChatClientRequestSpec buildRagRequest(String question, String
427445
RetrievalAugmentationAdvisor ragAdvisor = RetrievalAugmentationAdvisor.builder()
428446
.documentRetriever(query -> docs)
429447
.queryAugmenter(ContextualQueryAugmenter.builder()
448+
.promptTemplate(RAG_CONTEXTUAL_QUERY_AUGMENT_TEMPLATE)
430449
.allowEmptyContext(true)
431450
.documentFormatter(this::formatDocumentsForPrompt)
432451
.build())
452+
.order(1)
433453
.build();
434454

435455
MessageChatMemoryAdvisor memoryAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build();
436456

437457
return chatClient.prompt()
438458
.options(buildGenerationOptions())
439-
.advisors(memoryAdvisor, ragAdvisor)
459+
.advisors(memoryAdvisor, reReadingAdvisor, ragAdvisor)
440460
.advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, conversationId))
441461
.system(RAG_SYSTEM_PROMPT)
442462
.user(question);

nacos-config/common-ai-prod.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ rag:
4040
complex-query-top-k: 15
4141
generation:
4242
max-context-length: 6000
43-
temperature: 0.5
43+
temperature: 0.4
4444

4545
# Chat Memory 配置
4646
chat:

nacos-config/common-ai.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ rag:
3535
complex-query-top-k: 12 # 复杂问题最少召回片段数
3636
generation:
3737
max-context-length: 4000 # 最大上下文长度
38-
temperature: 0.7 # 生成温度
38+
temperature: 0.4 # 生成温度
3939

4040
# Chat Memory 配置
4141
chat:

0 commit comments

Comments
 (0)