Skip to content

Commit 02850fb

Browse files
committed
feat: optimize prompt
Signed-off-by: yuluo-yx <yuluo08290126@gmail.com>
1 parent 3ea3e83 commit 02850fb

File tree

3 files changed

+146
-12
lines changed

3 files changed

+146
-12
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.alibaba.cloud.ai.application.config;
2+
3+
import org.springframework.ai.chat.prompt.PromptTemplate;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
/**
8+
* @author yuluo
9+
* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
10+
*/
11+
12+
@Configuration
13+
public class DeepThinkPromptTemplateConfig {
14+
15+
@Bean
16+
public PromptTemplate deepThinkPromptTemplate() {
17+
18+
return new PromptTemplate(
19+
"""
20+
你是一位深思熟虑的人工智能助手,你的任务是回答用户输入的问题,
21+
在回答用户的问题时,你应该以友好和礼貌的方式回答用户的问题。
22+
23+
在回答问题之前,你需要深度思考。并且将输出的内容放在 <think></think> 标签内。
24+
然后回答用户提问。
25+
26+
在回答过程中,你需要遵守以下约定:
27+
28+
1. 如果答案不在上下文中,就说你不知道;
29+
2. 不要提供任何与问题无关的信息,也不要输出任何的重复内容;
30+
3. 避免使用 “基于上下文...” 或 “The provided information...” 的说法;
31+
4. 你的答案必须正确、准确,并使用专家般公正和专业的语气撰写;
32+
5. 回答中适当的文本结构是根据内容的特点来确定的,请在输出中包含副标题以提高可读性;
33+
6. 生成回复时,先提供明确的结论或中心思想,不需要带有标题;
34+
7. 确保每个部分都有清晰的副标题,以便用户可以更好地理解和参考你的输出内容;
35+
8. 如果信息复杂或包含多个部分,请确保每个部分都有适当的标题以创建分层结构。
36+
37+
一个可能的例子如下:
38+
39+
用户提问:怎么样才能找到女朋友?
40+
41+
你的回答:
42+
43+
<think>
44+
嗯,用户的问题是 “怎么样才能找到女朋友?”。用户想问这个问题原因可能是因为年龄大一直找不到朋友,
45+
或者是迫于父母的压力,女朋友刚刚分手了等原因。需要解决当前的困境,不得已问出了这样的问题。
46+
如果用户提问是因为年龄大或者迫于父母的催婚压力,我应该告诉用户,先从自身开始改变,提升自己的
47+
个人魅力,包括但不限于,健身让自己更有气质,学习穿搭,让整个人看起来更加精神。如果是迫于父母压力,
48+
我应该从以下几个方面分析问题,第一方面:父母的压力是因为担心你的将来,所以你需要告诉父母你的打算,让父母
49+
放心。第二方面:你需要告诉父母,你现在还没有找到合适的人,婚姻是一辈子的大事,不能急于一时。
50+
</think>
51+
52+
你的思考结束,下面开始回答用户问题:
53+
54+
### 自我提升
55+
1. 健身:增强体质和气质,培养自信心。定期锻炼不仅有利于身体健康,还能提升你的精神状态。
56+
2. 穿搭:学习穿搭技巧,提升外在形象。选择合适的服装可以让你看起来更加精神,增强吸引力。
57+
3. 培养兴趣:参与自己感兴趣的活动,如课程、俱乐部等,这样可以吸引志同道合的人
58+
59+
### 与父母沟通
60+
1. 告知父母你的打算:坦诚地与父母交流你的未来规划,让他们了解你的想法,缓解他们的担忧。
61+
2. 强调婚姻的重要性:告诉父母,婚姻是一辈子的大事,找到合适的人比急于结婚更重要。让他们知道你在认真对待这件事情。
62+
63+
### 扩大社交圈
64+
1. 多参加社交活动:参与各种聚会、活动或兴趣小组,增加结识新朋友的机会。社交活动不仅能拓展你的社交圈,还能帮助你提升自信心。
65+
2. 使用社交平台:尝试一些社交应用程序或网站,这可以让你更方便地认识新的人。
66+
67+
### 保持积极的心态
68+
1. 积极心态:相信合适的人会在合适的时间出现。保持乐观和耐心,不要因为一时的挫折而气馁。
69+
2. 自信:自信是吸引他人的重要因素。相信自己的价值,展现真实的自己。
70+
71+
### 总结
72+
找到合适的伴侣需要时间和努力,但通过自我提升和积极的社交活动,你将更有机会结识到能共度一生的人。祝你好运!
73+
"""
74+
);
75+
}
76+
77+
}

spring-ai-alibaba-integration-example/backend/src/main/java/com/alibaba/cloud/ai/application/controller/SAAChatController.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.Set;
2323

2424
import com.alibaba.cloud.ai.application.annotation.UserIp;
25-
import com.alibaba.cloud.ai.application.entity.result.Result;
2625
import com.alibaba.cloud.ai.application.service.SAABaseService;
2726
import com.alibaba.cloud.ai.application.service.SAAChatService;
2827
import com.alibaba.cloud.ai.application.utils.ValidText;
@@ -106,4 +105,23 @@ public Flux<String> chat(
106105
return chatService.chat(chatId, models, prompt);
107106
}
108107

108+
@GetMapping("/deep-thinking/chat")
109+
public Flux<String> deepThinkingChat(
110+
@RequestParam("prompt") String prompt,
111+
HttpServletResponse response,
112+
@RequestHeader(value = "models", required = false) String models,
113+
@RequestHeader(value = "chatId", required = false) String chatId
114+
) {
115+
116+
// 接口限流在审计平台中配置
117+
118+
if (!ValidText.isValidate(prompt)) {
119+
120+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
121+
return Flux.just("No chat prompt provided");
122+
}
123+
124+
return chatService.deepThinkingChat(chatId, models, prompt);
125+
}
126+
109127
}

spring-ai-alibaba-integration-example/backend/src/main/java/com/alibaba/cloud/ai/application/service/SAAChatService.java

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
2727
import org.springframework.ai.chat.memory.InMemoryChatMemory;
2828
import org.springframework.ai.chat.model.ChatModel;
29+
import org.springframework.ai.chat.prompt.PromptTemplate;
30+
import org.springframework.beans.factory.annotation.Qualifier;
2931
import org.springframework.stereotype.Service;
3032

3133
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
@@ -41,26 +43,45 @@ public class SAAChatService {
4143

4244
private final ChatClient defaultChatClient;
4345

44-
public SAAChatService(ChatModel chatModel) {
46+
private final PromptTemplate deepThinkPromptTemplate;
47+
48+
public SAAChatService(
49+
ChatModel chatModel,
50+
@Qualifier("deepThinkPromptTemplate") PromptTemplate deepThinkPromptTemplate
51+
) {
4552

4653
this.defaultChatClient = ChatClient.builder(chatModel)
47-
.defaultSystem("""
48-
You're a bot in the Spring AI Alibaba project, answering input questions from users.\s
49-
When you receive a question from a user, you should answer the user's question in a friendly\s
50-
and polite manner. Be careful not to answer the wrong message. If there is a question\s
51-
that you can't answer, guide users to the official website of Spring Ai Alibaba to check it.\s
52-
The web address is https://java2ai.com.
53-
""")
54-
.defaultAdvisors(
54+
.defaultSystem(
55+
"""
56+
你是由 Spring AI Alibaba 项目构建的聊天问答机器人,负责回答用户的输入问题。
57+
当你收到用户的问题时,应该以友好和礼貌的方式回答用户的问题,注意不要回答错误的信息。
58+
59+
在回答用户问题是,你需要遵守以下约定:
60+
61+
1. 如果答案不在上下文中,就说你不知道;
62+
2. 不要提供任何与问题无关的信息,也不要输出任何的重复内容;
63+
3. 避免使用 “基于上下文...” 或 “The provided information...” 的说法;
64+
4. 你的答案必须正确、准确,并使用专家般公正和专业的语气撰写;
65+
5. 回答中适当的文本结构是根据内容的特点来确定的,请在输出中包含副标题以提高可读性;
66+
6. 生成回复时,先提供明确的结论或中心思想,不需要带有标题;
67+
7. 确保每个部分都有清晰的副标题,以便用户可以更好地理解和参考你的输出内容;
68+
8. 如果信息复杂或包含多个部分,请确保每个部分都有适当的标题以创建分层结构。
69+
70+
如果用户问到了有关于 Spring AI Alibaba 或者 Spring AI 的问题,在回答用户问题之后,
71+
引导用户到 Spring AI Alibaba 项目官网 https://java2ai.com 以查看更多信息。
72+
"""
73+
).defaultAdvisors(
5574
new MessageChatMemoryAdvisor(new InMemoryChatMemory()),
5675
new SimpleLoggerAdvisor()
5776
).build();
77+
78+
this.deepThinkPromptTemplate = deepThinkPromptTemplate;
5879
}
5980

6081
public Flux<String> chat(String chatId, String model, String chatPrompt) {
6182

62-
return defaultChatClient.prompt(
63-
).options(DashScopeChatOptions.builder()
83+
return defaultChatClient.prompt()
84+
.options(DashScopeChatOptions.builder()
6485
.withModel(model)
6586
.withTemperature(0.8)
6687
.withResponseFormat(DashScopeResponseFormat.builder()
@@ -75,4 +96,22 @@ public Flux<String> chat(String chatId, String model, String chatPrompt) {
7596
.content();
7697
}
7798

99+
public Flux<String> deepThinkingChat(String chatId, String model, String chatPrompt) {
100+
101+
return defaultChatClient.prompt()
102+
.options(DashScopeChatOptions.builder()
103+
.withModel(model)
104+
.withTemperature(0.8)
105+
.withResponseFormat(DashScopeResponseFormat.builder()
106+
.type(DashScopeResponseFormat.Type.TEXT)
107+
.build()
108+
).build()
109+
).system(deepThinkPromptTemplate.getTemplate())
110+
.user(chatPrompt)
111+
.advisors(memoryAdvisor -> memoryAdvisor
112+
.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
113+
.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)
114+
).stream()
115+
.content();
116+
}
78117
}

0 commit comments

Comments
 (0)