From 6af739a6d815329399f1b73cdeab2c476f4ae345 Mon Sep 17 00:00:00 2001 From: Ahoo Wang Date: Thu, 12 Jun 2025 17:34:38 +0800 Subject: [PATCH 1/2] fix(chat-client): Fix incorrect prompt position for system messages - First position of prompt to insert system message - Prioritize system messages in conversation history Signed-off-by: Ahoo Wang --- .../advisor/MessageChatMemoryAdvisor.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java index 1b8bbea84e9..74eb232ab93 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java @@ -19,6 +19,9 @@ import java.util.ArrayList; import java.util.List; +import org.springframework.ai.chat.messages.MessageType; +import org.springframework.ai.chat.messages.SystemMessage; +import org.springframework.util.StringUtils; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; @@ -83,8 +86,18 @@ public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChai List memoryMessages = this.chatMemory.get(conversationId); // 2. Advise the request messages list. - List processedMessages = new ArrayList<>(memoryMessages); - processedMessages.addAll(chatClientRequest.prompt().getInstructions()); + SystemMessage systemMessage = chatClientRequest.prompt().getSystemMessage(); + List processedMessages = new ArrayList<>(); + if (StringUtils.hasText(systemMessage.getText())) { + processedMessages.add(systemMessage); + } + processedMessages.addAll(memoryMessages); + List instructions = chatClientRequest.prompt() + .getInstructions() + .stream() + .filter(m -> m.getMessageType() != MessageType.SYSTEM) + .toList(); + processedMessages.addAll(instructions); // 3. Create a new request with the advised messages. ChatClientRequest processedChatClientRequest = chatClientRequest.mutate() From 744e475daa17c773a4f021cba2a3f6568d718885 Mon Sep 17 00:00:00 2001 From: Ahoo Wang Date: Thu, 12 Jun 2025 23:15:14 +0800 Subject: [PATCH 2/2] perf(ai-client-chat): optimize message processing in MemoryAdvisor - Replace stream-based instruction processing with a for loop - Improve readability and performance by avoiding unnecessary stream operations Signed-off-by: Ahoo Wang --- .../client/advisor/MessageChatMemoryAdvisor.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java index 74eb232ab93..2b3af3146c9 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java @@ -86,19 +86,18 @@ public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChai List memoryMessages = this.chatMemory.get(conversationId); // 2. Advise the request messages list. - SystemMessage systemMessage = chatClientRequest.prompt().getSystemMessage(); List processedMessages = new ArrayList<>(); + SystemMessage systemMessage = chatClientRequest.prompt().getSystemMessage(); if (StringUtils.hasText(systemMessage.getText())) { processedMessages.add(systemMessage); } processedMessages.addAll(memoryMessages); - List instructions = chatClientRequest.prompt() - .getInstructions() - .stream() - .filter(m -> m.getMessageType() != MessageType.SYSTEM) - .toList(); - processedMessages.addAll(instructions); - + // Add non-system messages from instructions + for (Message message : chatClientRequest.prompt().getInstructions()) { + if (message.getMessageType() != MessageType.SYSTEM) { + processedMessages.add(message); + } + } // 3. Create a new request with the advised messages. ChatClientRequest processedChatClientRequest = chatClientRequest.mutate() .prompt(chatClientRequest.prompt().mutate().messages(processedMessages).build())