본문으로 건너뛰기

챗봇 처리

이 문서로 해결할 질문

  • Consumer가 챗봇 메시지를 어떻게 처리하나요?
  • GPT Function Calling·tool handler 구조는 무엇인가요?
  • 크레딧 멱등 차감은 어떻게 보장하나요?

처리 파이프라인

챗봇 처리는 chatbot-requests 토픽과 chatbot-group 컨슈머 그룹으로 구독합니다.

ProcessChatHandler

단계동작
1buildMessagesForGpt()로 메시지 배열 구성 (server/consumer/.../conversation.manager.ts)
2OpenAI Chat Completions 스트리밍 호출
3tool_calls 발생 시 해당 Handler 디스패치
4응답 chunk를 Redis chatbot:stream:{streamChannelId}에 발행
5턴 완료 시 done 이벤트 + 크레딧 차감

핵심 구현은 server/consumer/.../ProcessChatHandler.ts에 있습니다.

Tool Handlers

Handlertool역할
InventoryHandlerget_user_inventory보유/관심 재료·레시피 조회
FoodCategoriesHandlerget_food_categories카테고리 마스터 (Redis 1h)
SearchRecipesHandlersearch_recipessemantic-first ANN·재랭킹 검색
FinalizeRecipeSelectionHandlerfinalize_recipe_selection후보 중 최종 추천 레시피 확정

도구 스키마는 server/consumer/.../chatbot-tools.definition.ts에 정의되어 있습니다.

tool 호출 시 Consumer가 DB/Redis에서 직접 조회합니다.

ChatbotLog 저장

  • MongoDB chatbot_logs 컬렉션에 저장하며, TTL은 30일입니다.
  • SaveChatLogHandler가 user/assistant 턴을 conversationId와 함께 저장합니다.
  • 히스토리 확장 시 conversationId 기준 최근 N턴을 조회해 buildMessagesForGpt에 전달합니다.

크레딧 멱등 차감

항목계약
테이블chatbot_credit_deductions (PK: stream_channel_id)
서비스ChatbotCreditService
멱등createMany + skipDuplicates — 동일 streamChannelId 이중 차감 방지
비용usage.totalTokenscomputeChatbotCreditCost()
done 반영isCreditDepleted in ChatbotStreamDoneEvent

신규 차감이 발생하면 cache-invalidation 토픽에 USER_PROFILE 무효화를 발행합니다.

이벤트·KPI

EventLog시점
chatbot.start대화 시작
chatbot.message메시지 처리 성공

이벤트·KPI 연동은 이벤트/분석 파이프라인을 참고하세요.

신뢰성

  • at-least-once Kafka 전달을 전제로 하며, 크레딧·로그는 멱등 키로 중복 처리에 안전합니다.
  • 처리 실패 시 메시지는 chatbot-requests-dlq로 보냅니다.
  • consumer lag는 server/consumer/.../consumer-lag.monitor.ts로 모니터링합니다.

관련 문서