langchain4j整合mongo实现对话记忆

langchain4j整合mongo实现对话记忆

起男 17 2025-04-25

langchain4j整合mongo实现对话记忆

依赖

<dependencyManagement>
        <!--langchain包管理-->
        <dependencies>
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-bom</artifactId>
                <version>1.0.0-beta3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合阿里百炼-->
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-community-bom</artifactId>
                <version>1.0.0-beta3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

	<dependencies>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>

配置

langchain4j:
  community:
    dashscope:
      chat-model:
        api-key: ${ALI_API_KEY}
        model-name: qwen-max
spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/test

存储类

@Component
public class MongoChatMemoryStore implements ChatMemoryStore {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public List<ChatMessage> getMessages(Object o) {
        Query query = new Query(Criteria.where("memoryId").is(o));
        ChatMessages chatMessages = mongoTemplate.findOne(query, ChatMessages.class);
        if (chatMessages == null) {
            return List.of();
        }
        String content = chatMessages.getContent();

        return ChatMessageDeserializer.messagesFromJson(content);
    }

    @Override
    public void updateMessages(Object o, List<ChatMessage> list) {
        Query query = new Query(Criteria.where("memoryId").is(o));

        String s = ChatMessageSerializer.messagesToJson(list);
        Update update = new Update();
        update.set("content", s);
        mongoTemplate.upsert(query, update, ChatMessages.class);
    }

    @Override
    public void deleteMessages(Object o) {
        Query query = new Query(Criteria.where("memoryId").is(o));
        mongoTemplate.remove(query, ChatMessages.class);
    }
}

配置类

@Configuration
public class AIConfig {

    @Bean
    public ChatMemoryProvider chatMemoryProvider(MongoChatMemoryStore store){
        return mid-> MessageWindowChatMemory.builder()
                .id(mid)//对话隔离
                .maxMessages(10)
                .chatMemoryStore(store)//使用存储类
                .build();
    }
}

AiService

@AiService(wiringMode = AiServiceWiringMode.EXPLICIT,
        chatModel = "qwenChatModel",
        chatMemoryProvider = "chatMemoryProvider")
public interface Assistant {

    String chat(@MemoryId Integer id,@UserMessage String message);
}

controller

@RestController
@RequestMapping("chat")
public class ChatController {

    @Autowired
    private Assistant assistant;

    @GetMapping("{id}/{message}")
    public String chat(@PathVariable Integer id,@PathVariable("message") String message) {
        return assistant.chat(id,message);
    }
}