DOCS/troubleshooting/250831_rb8001_postgresql_context_integration.md
happybell80 8c02b80359 Fix incorrect table names in documentation
- gmail_tokens → gmail_token (33 files)
- companies → company (17 files)
- conversation_logs → conversation_log (27 files)
- workspace_members → workspace_member (28 files)

All table names now match the actual PostgreSQL schema
2025-09-26 00:49:47 +09:00

3.4 KiB

rb8001 PostgreSQL 대화 기록 통합 및 Frontend-Slack 연동

작성일: 2025-08-31
작성자: 51123 서버 관리자
상태: 구현 완료
목표: ChromaDB 벡터 검색과 PostgreSQL 최근 대화를 모두 LLM 프롬프트에 포함


1. 문제 상황

  • 현상: rb8001이 ChromaDB 벡터 검색만 참조하여 엉뚱한 답변
  • 원인: PostgreSQL conversation_log의 최근 대화 미참조
  • 영향: 직전 대화 컨텍스트 손실, 일관성 없는 응답
  • 테스트: "내 이름은 김종태" → "내 이름은?" → "모릅니다" 응답

2. 원인 분석

발견된 문제점

  • router.py 라인 115-119: context에 user_id, channel, robeing_id만 포함
  • PostgreSQL 조회 함수 없음 (ConversationLog 모델만 정의)
  • /api/message 엔드포인트가 router._call_internal_llm() 직접 호출
  • route_message()는 존재하지만 아무도 호출하지 않음
  • Frontend는 UUID, Slack은 Slack ID 사용으로 사용자 분리

3. 구현 완료 내역

3.1 대화 컨텍스트 통합

  • database.py: get_recent_conversations() 함수 추가 - PostgreSQL에서 최근 10개 대화 조회
  • gemini_handler.py: context['recent_conversations'] 활용하여 프롬프트에 포함
  • router.py: 최근 대화 조회 및 context 전달 구현

3.2 엔드포인트 통합 (근본 해결)

  • 문제 발견: handle_message() 존재하지 않음, 실제는 route_message()
  • main.py 수정: /api/message 엔드포인트가 route_message() 호출하도록 변경
  • slack_handler.py 수정: 모든 Slack 요청도 route_message() 통합
  • 결과: Frontend/Slack 모두 동일한 로직 사용으로 일관성 확보

3.3 Frontend 응답 형식 수정

  • 문제: results 배열 구조에서 bot_response 추출 실패
  • main.py 수정: results[0].content 추출 로직 및 디버그 로깅 추가

3.4 PostgreSQL 저장 오류 해결

  • 문제: HTTP Response 객체를 DB에 직접 저장 시도
  • _save_conversation() 수정: Response 객체를 문자열로 변환 (response.text 또는 str())

3.5 Slack-Frontend 통합 달성

  • Slack ID → UUID 자동 변환: slack_user_mapping 테이블 활용
  • route_message() 진입점: Slack ID 감지 시 UUID 조회 및 변환
  • 이중 저장: user_id(UUID)와 slack_user_id(원본) 모두 저장
  • 결과: 김종태, 이고은 등 사용자가 어느 채널에서든 대화 연속성 유지

4. 성과

  • 총 5개 커밋: 약 200줄 코드 수정
  • Frontend ↔ Slack 완전 통합: 크로스 채널 대화 공유
  • 대화 기록 영속성: PostgreSQL과 ChromaDB 모두 정상 저장
  • 사용자 경험 개선: "내 이름은?" 질문에 정확한 답변 가능

5. 기술 세부사항

수정된 파일

  • database.py: get_recent_conversations() 함수 추가
  • gemini_handler.py: recent_conversations 컨텍스트 활용
  • router.py: Slack ID → UUID 변환 로직
  • main.py: route_message() 호출로 통합
  • slack_handler.py: route_message() 통합

데이터베이스 스키마

  • conversation_log.user_id: UUID (Frontend 사용자) - 테이블명 주의: conversation_log (s 없음)
  • conversation_log.thread_ts: VARCHAR(128) (스레드 타임스탬프로 Slack 대화 추적)
  • 참고: slack_user_id 컬럼, slack_user_mapping 테이블은 실제 존재하지 않음
  • 실제: user.oauth_id에 Slack ID 저장됨