본문 바로가기

Programming!

로컬 RAG 에서 채팅 내용 유지하기.

상담 챗봇을 특정 메시지 수 만큼 영속성을 갖도록 하고 싶어 보니..

Langchain4J에서는 기본적으로 지원이 되고 있었다.  https://docs.langchain4j.dev/tutorials/chat-memory/

 

Chat Memory | LangChain4j

Maintaining and managing ChatMessages manually is cumbersome.

docs.langchain4j.dev

 

MessageWindowChatMemory 단순 N개 관리면 충분해 보여서 이걸로 정한 후, 사용될 Store 는 Redis 로 간략히 설정해 봤다.

    fun createCounselorChatMemory(sessionId: String, maxMessages: Int = 20): ChatMemory {
        return MessageWindowChatMemory.builder()
            .id(sessionId)
            .chatMemoryStore(counselorRedisChatMemoryStore())
            .maxMessages(maxMessages)
            .build()
    }

 

20개의 메시지만 저장한다.

 

그럼 결과를 함 보자.

 

잘 되는 듯 하다. 그럼 Redis 에는 어떻게 저장되고 있을까?

 

[
   {
      "text":"\n        당신은 상담 Mental Health Counselor 입니다.\n        입력한 글을 토대로 유저에게 심리 상담 결과를 내주어야 합니다.\n\n        입력된 글에 맞춰 대화하듯 상담을 진행해주고, 맞춤형 해결책 및 개선 전략을 친절하게 설명해주어야 합니다.\n        또, 입력된 글이 짧으면, 그에 맞춰서 짤게 2-3줄로 이야기 해주어야 하며, 문단이 길 경우 알맞게 두 줄 정도 내려쓰기를 해서 반환해주세요.\n        ",
      "type":"SYSTEM"
   },
   {
      "text":"크리스피 크림 도넛의 가장 큰 매력은 부드럽고 달콤한 글레이즈에 촉촉한 식감이에요. 특히 따뜻한 상태의 \"오리지널 글레이즈드\"는 정말 입 안에서 녹는 맛이죠! 😊  \n\n달달한 기분이 필요하시거나, 간단하면서도 만족스러운 간식을 찾으실 때 딱 좋은 선택이에요. 크리스피의 달콤함으로 오늘 기분 좋은 하루를 만들어보는 건 어떨까요? 🍩",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 아까는 던킨이라며!?\n",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"아, 맞아요! 😊 사실 두 브랜드 각각의 장점이 달라서 어떻게 보느냐에 따라 추천이 달라질 수 있어요.  \n\n던킨은 다양한 맛과 종류로 취향 따라 골라 먹는 재미가 있고, 크리스피는 부드럽고 달콤한 원래의 맛이 특별하죠. 결국은 오늘 어떤 맛이 더 끌리는지가 중요해요! 어떤 쪽이든 절대 후회 없는 선택이 될 거예요. 🍩✨",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 안녕!",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"안녕하세요! 😊  \n기분 좋게 인사해 주셔서 감사해요. 오늘은 어떤 이야기를 나눠볼까요?",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 도넛이 먹고 싶은데 크리스피와 던킨중 어느게 좋을까?\n",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"도넛 좋아하시나 봐요! 😊 정말 맛있는 고민이네요.  \n\n크리스피는 부드럽고 달달한 기본 맛으로 베스트예요, 특히 따끈한 \"오리지널 글레이즈드\"는 최고죠. 던킨은 다양한 종류와 색다른 토핑들 덕에 취향 따라 골라 먹는 재미가 있어요.  \n\n오늘은 달달한 클래식한 맛을 원하면 크리스피, 재미있고 다채로운 맛을 원하면 던킨을 선택해 보세요! 🍩✨",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 크리스피가 좋은데..",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"다들 크리스피의 부드럽고 달콤한 매력에 반하곤 하죠! 😊  \n특히 \"오리지널 글레이즈드\"는 따뜻하게 먹을 때 정말 입안에서 녹는 맛이 최고랍니다.  \n\n기분 좋은 달달함으로 하루를 채우고 싶을 때 딱 좋은 선택이에요. 맛있는 도넛 즐기시고, 행복한 시간 보내세요! 🍩✨",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 좀전에 던킨이라며?",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"아하, 그랬었죠! 😊 사실 크리스피와 던킨은 각각 매력이 달라서 그런 고민이 생기는 것 같아요.  \n\n던킨은 다양한 맛과 독특한 조합들로 재미를 느낄 수 있고, 크리스피는 아주 부드럽고 달콤한 기본 맛으로 만족감을 주죠. 그러니 오늘 당신의 기분에 따라 선택하면 되는 거예요! 도넛은 무조건 당신을 행복하게 해줄 테니까요. 🍩✨",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 안녕",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"안녕하세요! 😊  \n오늘은 어떤 이야기를 나눠보고 싶으신가요? 마음 편히 말씀해 주세요!",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 도넛을 먹고 싶은데 크리스피크림과 던킨중 어느게 좋을까?",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"오, 도넛을 정말 좋아하시나 봐요! 😊  \n\n크리스피크림은 부드럽고 달달한 \"오리지널 글레이즈드\"로 유명해서, 간단하면서도 확실히 단맛을 원하신다면 좋은 선택이에요. 한편, 던킨은 다양한 종류와 색다른 맛 옵션이 많아서, 좀 더 다양한 맛을 즐기고 싶을 때 추천드려요.  \n\n결론적으로 오늘은 부드러움이 땡기면 크리스피, 재미있고 다채로운 선택을 원하면 던킨으로 가보세요! 🍩✨",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 던킨으로 할까?",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"던킨으로 선택하시려고요? 좋은 결정이에요! 😊  \n\n던킨은 정말 다양한 도넛 종류와 토핑이 있어서, 고르는 재미가 쏠쏠하죠. 초콜릿 코팅, 크림 필링, 혹은 베이글 같은 가벼운 옵션도 있으니 기호에 딱 맞는 걸 찾아보세요.  \n\n맛있는 도넛과 함께 즐거운 시간 보내시길 바라요! 🍩✨",
      "type":"AI"
   },
   {
      "contents":[
         {
            "text":"입력한 글 : 아까 다채로운 선택은 뭐였지?",
            "type":"TEXT"
         }
      ],
      "type":"USER"
   },
   {
      "text":"아, 그렇죠! 제가 언급했던 던킨의 다채로운 선택이요. 😊  \n\n던킨은 초코, 딸기, 블루베리 같은 토핑뿐만 아니라 크림이 들어간 도넛, 푹신푹신한 도넛, 혹은 바삭한 음료와 함께 먹기 좋은 종류까지 다양하게 고를 수 있어요. 또한, 시즌 한정 도넛이나 재미있는 디자인 도넛도 많이 나오니까 골라보는 재미가 있답니다.  \n\n배고플 땐 다양하게 먹는 즐거움이 최고니까, 한 번 던킨에서 직접 둘러보세요! 맛있는 시간 되세요! 🍩💛",
      "type":"AI"
   }
]

 

데이터 저장을 보니 직접 Redis 구현을 하던 것을 다~~해주니 역시 Langchain4J를 잘 선택한거 같다..ㅎㅎ

기본적인 사용 유저수를 보면서 설정에 대한 고민을 하면 큰 무리없이 애플리케이션에 잘 적용되지 싶다.