SpringAi高度自定义Mysql数据库持久化教程

总所周知SpringAi提供的Mysql JDBC数据库记忆存储的表只有四个字段,这非常限制了我们的发挥,想要实现高度自定义可以参考我的方法;

创建MysqlChatMemory类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@RequiredArgsConstructor
@Component
public class MysqlChatMemory implements ChatMemory {

private final SpringAiChatMemoryMapper springAiChatMemoryMapper;

@Override
public void add(String conversationId, Message message){

}

@Override
public void add(String conversationId, List<Message> messages) {

}

@Override
public List<Message> get(String conversationId) {
List<SpringAiChatMemory> springAiChatMemories = springAiChatMemoryMapper.selectList(new QueryWrapper<SpringAiChatMemory>().lambda()
.eq(SpringAiChatMemory::getConversationId, conversationId)
.orderByDesc(SpringAiChatMemory::getId)
.last("LIMIT 10"));//最大记忆条数
List<Message> messages = new ArrayList<>();
for (SpringAiChatMemory springAiChatMemory : springAiChatMemories){
String type = springAiChatMemory.getType();
switch (type){
case "USER" -> messages.add(new UserMessage(springAiChatMemory.getContent()));
case "ASSISTANT" -> messages.add(new AssistantMessage(springAiChatMemory.getContent()));
case "SYSTEM" -> messages.add(new SystemMessage(springAiChatMemory.getContent()));
default -> throw new IllegalArgumentException("Unknown message type:"+type);
}
}
return messages;
}

@Override
public void clear(String conversationId) {
springAiChatMemoryMapper.delete(new QueryWrapper<SpringAiChatMemory>().lambda()
.eq(SpringAiChatMemory::getConversationId, conversationId));
}

}

可以看到ChatMemory有四个方法可以实现,get就是获取数据列表,其中last(“limit 10”)就是限制10条对话记忆上下文,同等于MessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).maxMessages(15).build();

  • 这里可以看到我的add方法没有实现,因为它传入的Message只能获取对话角色,文本,媒体三个参数;所以我们就需要在对话完后自己去添加数据库,参考我的对话代码:、

  • Flux<String> content = chatClient.prompt()
            .user(messageDto.getMessage())
            .advisors(advisorSpec -> advisorSpec.param(CONVERSATION_ID, messageDto.getChatId()))
            .stream()
            .content();
    
    content.doOnNext(chunk -> {}).reduce((s1, s2) -> s1 + s2).subscribe(
            result -> {
                // 流式结束后,
                springAiChatMemoryMapper.insert(new SpringAiChatMemory()
                        .setContent(messageDto.getMessage())
                        .setType("USER")
                        .setModel(modelName)
                        .setConversationId(messageDto.getChatId())
                        .setTimestamp(LocalDateTime.now()));
                springAiChatMemoryMapper.insert(new SpringAiChatMemory()
                        .setContent(result)
                        .setModel(modelName)
                        .setType("ASSISTANT")
                        .setConversationId(messageDto.getChatId())
                        .setTimestamp(LocalDateTime.now()));
            }
    );
    return content;
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    我的SpringAiChatMemory:

    ```java
    @Data
    @Accessors(chain = true)
    @TableName(value = "spring_ai_chat_memory")
    public class SpringAiChatMemory {

    private Long id;

    private String conversationId;

    private String content;

    private String type;

    private LocalDateTime timestamp;

    private String model;
    }

我在这里就实现了对话模型数据的添加,原来的JdbcChatMemoryRepository是没有这个字段的;


在线体验我的作品: https://hepingan.top