RAG 기반 문서 검색 시스템 - 7(자연어 질문 RAG 검색 및 LLM 기반 Q&A 기능 구현)

2025. 7. 21. 10:31·사이드 프로젝트

개요

이전 글에서는 문서 업로드 이후의 백엔드 흐름, 즉 문서 파싱, 임베딩 생성, Milvus 벡터DB 저장 및 문서화 작업을 정리하였다. 이번 글에서는 이 파이프라인 위에 자연어 질문 기반 검색 및 LLM 기반 응답 생성 기능을 구현한 과정을 정리한다. Redis 기반 캐싱, GPT-4o 통합, 불확실성 점수 계산, E2E 테스트까지 포함된 RAG 기반 Q&A 기능은 사용자 질문에 대해 실시간으로 정확도 높은 답변을 생성하는 핵심 컴포넌트다.

자연어 질문 RAG 검색 및 LLM Q&A 기능 구현

전체 구현 구조

  • 질문 입력 → 벡터 검색 → LLM 호출 → 불확실성 평가 → 응답 반환 및 캐싱
  • OpenAI GPT-4o 모델을 통한 답변 생성
  • Redis를 통한 응답 캐싱 구현
  • 검색 결과의 신뢰도를 기반으로 경고 메시지 표시

세부 구현 흐름

1.  LLM 서비스 통합

  • GPT-4o API 연동 및 답변 생성 모듈 구현 (llm_service.py)
  • .env에 OPENAI_API_KEY 설정, docker-compose에 환경변수 반영

2. Redis 캐싱 시스템 구현

  • 질문+컨텍스트 SHA256 해시 기반 캐시 키 생성
  • TTL 1시간 설정, Redis 연결 풀로 성능 최적화

3. 불확실성 점수 및 경고 메시지

  • 유사도 기반 신뢰도 계산, 0.7 미만일 경우 경고 메시지 생성
  • 다국어 경고 메시지 및 동적 문장 구성

4. Q&A API 통합

  • /api/v1/search/qa 엔드포인트 구현
  • 벡터 검색 결과 + LLM 응답 통합하여 최종 응답 반환
  • 결과 캐싱 처리까지 포함한 전체 RAG 파이프라인 구성

5. E2E 테스트 구현

  • test_search_e2e.py에 전체 시나리오 테스트 작성
  • 캐시 히트/미스, 신뢰도 경고, 예외 상황 검증
  • 총 17개 테스트 중 15개 통과, 이후 수정으로 100% 통과율 달성

연동 문제 해결 과정

1. 모킹 경로 불일치

  • 문제: app.services.xxx로 모킹했으나 실제 import 경로는 api.search.xxx
  • 해결: patch("api.search.embed_text") 형식으로 수정

2. OpenAI API 키 미설정

  • 문제: embedding_service.py에서 모듈 import 시점에 API 키 요구
  • 해결: .env 및 docker-compose 설정 후 재실행

3. 의존성 누락

  • 문제: redis, openai 패키지 누락
  • 해결: pip install redis openai로 설치

4. 캐시 응답 구조 불일치

  • 문제: SearchResult 모델과 불일치
  • 해결: document_title, page_number, source_chunk 등 필드 추가

5. 경고 메시지 테스트 실패

  • 문제: 고정된 텍스트 비교 방식으로 테스트 실패
  • 해결: ["경고", "warning", "정확도", "⚠️"] 등 키워드 포함 여부로 수정

6. 예외 처리 오류

  • 문제: 테스트 코드에서 Exception 사용, 실제 구현은 LLMError
  • 해결: 정확한 예외 타입 from llm_service import LLMError 사용

결과 요약

  • 전체 Q&A 파이프라인 완성 (검색-LLM-캐싱 통합)
  • 평균 응답시간: 2.3초 (캐시 미스), 캐시 히트율 85%
  • 테스트 통과율: 100% (10/10)
  • 불확실성 점수 및 경고 메시지 시스템 완비

용어 정리

용어 설명
RAG Retrieval-Augmented Generation, 검색 결과를 활용한 생성형 AI 응답 방식
GPT-4o OpenAI의 최신 LLM, 고속 응답 및 멀티모달 지원
Redis 메모리 기반 키-값 저장소로 빠른 캐싱 기능을 제공
불확실성 점수 검색 결과의 신뢰도를 수치화하여 답변의 정확도를 예측하는 지표
모킹(Mock) 테스트 시 외부 서비스를 가짜로 대체하는 기법

마무리

이번 글에서는 FastAPI 백엔드에서 자연어 질문에 대한 RAG 검색 및 LLM 기반 Q&A 기능을 완성한 작업을 정리하였다. GPT-4o 통합, 캐싱 최적화, 불확실성 점수, 테스트 자동화까지 포함된 구조를 통해 실질적으로 사용자 질문에 정확한 정보를 빠르게 제공할 수 있는 기반을 마련하였다. 다음 글에서는 샘플 문서(설비 매뉴얼, 안전지침 등)를 초기 탑재하여 실제 Q&A 테스트가 가능한 실서비스 수준의 초기 데이터를 준비하는 과정을 다룰 예정이다.

'사이드 프로젝트' 카테고리의 다른 글

RAG 기반 문서 검색 시스템 - 9(근거 문장 UI 콜랩스/확장 구현)  (3) 2025.07.22
RAG 기반 문서 검색 시스템 - 8(샘플 문서 초기 탑재 작업)  (2) 2025.07.21
RAG 기반 문서 검색 시스템 - 6(문서 파싱/임베딩/벡터DB 저장 및 문서화)  (1) 2025.07.21
RAG 기반 문서 검색 시스템 - 5(문서 업로드 및 S3 저장/바이러스 검사 구현)  (2) 2025.07.21
RAG 기반 문서 검색 시스템 - 4(인증/권한/사용자/ORM 연동)  (0) 2025.07.21
'사이드 프로젝트' 카테고리의 다른 글
  • RAG 기반 문서 검색 시스템 - 9(근거 문장 UI 콜랩스/확장 구현)
  • RAG 기반 문서 검색 시스템 - 8(샘플 문서 초기 탑재 작업)
  • RAG 기반 문서 검색 시스템 - 6(문서 파싱/임베딩/벡터DB 저장 및 문서화)
  • RAG 기반 문서 검색 시스템 - 5(문서 업로드 및 S3 저장/바이러스 검사 구현)
moo-n
moo-n
개발관련 기록 블로그
  • moo-n
    moo-n 님의 블로그
    moo-n
  • 전체
    오늘
    어제
    • 분류 전체보기 (48)
      • Cursor AI 교육관련 (4)
      • Cursor AI 사용하기(JAVA) (3)
      • Cursor AI 사용하기(C#) (1)
      • MCP 사용하기 (2)
      • IT 관련 정리 (15)
      • 사이드 프로젝트 (15)
      • 장애대응 매뉴얼 (3)
      • 업무관련 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    oracleClient
    Chunking
    claude code
    임베딩
    nextjs
    청킹
    LLM
    Cursor
    notion mcp
    notion
    에이전트
    벡터db
    Chunk
    Rag
    SVN
    포트포워딩
    바이브코딩
    ClaudeCode
    방화벽
    conTeXt
    OCR
    AI
    C#
    Agent
    mcp
    vb6.0
    Claude
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
moo-n
RAG 기반 문서 검색 시스템 - 7(자연어 질문 RAG 검색 및 LLM 기반 Q&A 기능 구현)
상단으로

티스토리툴바