Post

AInfo 챗봇 구조 #2 - REST 기반 ChatRoom/ChatLog 흐름 이해하기

AInfo 프로젝트의 챗봇 기능 중 REST 기반으로 구현된 채팅방과 채팅 로그 관리 API 구조를 정리합니다.

AInfo 챗봇 구조 #2 - REST 기반 ChatRoom/ChatLog 흐름 이해하기

AInfo의 ChatRoom/ChatLog API 구조

AInfo의 챗봇은 실시간 대화는 WebSocket으로 처리하지만, 대화 기록은 Django REST API로 관리합니다. 사용자가 채팅방을 생성하거나 목록을 조회하고, 특정 채팅방의 대화를 불러오는 등의 기능은 다음과 같은 REST API 흐름을 따릅니다.

모델 구조

ChatRoom

1
2
3
4
class ChatRoom(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100, default="새 채팅")
    created_at = models.DateTimeField(auto_now_add=True)
  • 사용자별 대화방을 생성해 대화 흐름을 구분
  • 제목 변경 가능

ChatLog

1
2
3
4
5
class ChatLog(models.Model):
    chatroom = models.ForeignKey(ChatRoom, on_delete=models.CASCADE, related_name="chatlogs")
    role = models.CharField(max_length=5, choices=[("user", "User"), ("bot", "Bot")])
    message = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
  • 채팅방에 속한 메시지를 저장
  • user/bot 역할 구분
  • 시간 순 정렬을 위한 timestamp 인덱스 지정

시리얼라이저 구조

  • ChatRoomSerializer: 사용자 인증 기반으로 자신의 채팅방만 조회/생성 가능
  • ChatLogSerializer: 채팅 로그를 목록 형태로 조회 가능 (읽기 전용)
1
2
3
class ChatRoomSerializer(serializers.ModelSerializer):
    chatlogs = ChatLogSerializer(many=True, read_only=True)
    user = serializers.PrimaryKeyRelatedField(read_only=True)

API 뷰 구조

채팅방 목록/생성

  • GET /chatbot/room/: 로그인한 사용자의 채팅방 목록 반환
  • POST /chatbot/room/: 새로운 채팅방 생성
1
2
3
class ChatRoomListCreateView(ListCreateAPIView):
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

채팅방 상세/수정/삭제

  • GET /chatbot/room/{pk}/: 특정 채팅방 상세
  • PATCH /chatbot/room/{pk}/: 제목 수정
  • DELETE /chatbot/room/{pk}/: 삭제 + Redis 내 메모리 기록도 제거
1
2
3
4
5
class ChatRoomDetailDeleteUpdateView(RetrieveUpdateDestroyAPIView):
    def perform_destroy(self, instance):
        chat_history_manager = ChatHistoryManager(...)
        chat_history_manager.clear_history()
        instance.delete()

채팅 로그 목록

  • GET /chatbot/room/{pk}/logs/: 해당 채팅방의 전체 로그 반환
  • timestamp 오름차순 정렬

Redis와의 연동: 멀티턴 대비

채팅방 삭제 시, Redis 기반 ChatHistoryManager에서 대화 히스토리도 함께 삭제합니다. 이는 LangChain 멀티턴 대화 구조와 연계되며, 추후 챗봇 응답의 맥락 유지에 활용됩니다.

This post is licensed under CC BY 4.0 by the author.