본문으로 건너뛰기

RAGless 결정적 검색 전용 질의응답 시스템

RAGless는 답변을 미리 생성해 런타임 환각과 API 비용을 없애는 검색 전용 Q&A 시스템이다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

RAGless는 원천 문서에서 Gemini로 Q&A 블록을 미리 만들고, 이를 Gemini 임베딩과 로컬 Qdrant에 색인한 뒤 런타임에는 LLM 없이 유사 질문에 연결된 답변을 그대로 반환한다. 검색 과정에서는 한 답변에 속한 여러 질문 변형의 점수를 answer_id별로 합산해 단일 top-1 검색보다 안정적인 후보를 만든다. 이 구조는 질의당 생성 비용과 런타임 환각을 없애고 source_quote와 결정적 ID를 통한 검증성을 높이지만, 사전에 수집하지 않은 질문에 대한 추론과 실시간 답변 갱신은 지원하지 않는다. README는 100,000토큰 기준 초기 ingestion 비용을 약 $1.50, 1,000회 일일 질의의 월간 런타임 API 비용을 $0.00으로 제시한다.

섹션별 상세

01
RAGless는 런타임 LLM 호출을 제거한 검색 전용 질의응답 시스템으로, 원천 문서를 미리 답변 블록으로 바꾼 뒤 사용자의 질문에 가장 가까운 기존 답변을 그대로 돌려준다. prepare_data.py가 Gemini의 JSON 모드로 answer, questions, category, source_quote를 포함한 블록을 만들고, 이후 단계가 이를 임베딩과 검색 데이터로 변환한다. 답변을 새로 생성하지 않는 구조 덕분에 동일한 질문에는 동일한 텍스트가 반환되며 런타임 환각과 질의별 생성 비용이 사라진다.
02
문서 처리 단계는 짧은 문서를 통째로 보내고 긴 문서는 실제 tokenizer로 측정한 토큰 수에 따라 나누는 방식으로 구성된다. 10,000토큰 이하 문서는 전체 입력으로 처리하고 그보다 긴 문서는 8,000토큰 크기와 500토큰 overlap을 사용하는 청크로 분할한 뒤 JSON Q&A 블록을 추출한다. --judge 옵션을 켜면 두 번째 LLM 검증이 원문 인용과 맞지 않는 블록을 걸러내므로, 생성 오류를 운영 전에 확인할 수 있다.
bash
python prepare_data.py

원천 문서에서 Q&A 블록을 추출해 data.json으로 저장한다.

bash
python prepare_data.py --judge

Q&A 블록이 원문에 근거하는지 추가 LLM 검증 단계를 활성화한다.

03
색인 단계에서는 하나의 답변에 연결된 질문 변형을 각각 별도 행으로 펼쳐 Gemini 임베딩을 생성하고, RETRIEVAL_DOCUMENT와 RETRIEVAL_QUERY를 구분하는 비대칭 임베딩 설정을 적용한다. Qdrant는 서버 없이 ./qdrant_data에 벡터를 저장하며, 컬렉션은 매번 처음부터 재생성되고 UUID5 기반 결정적 ID가 사용돼 재실행에 따른 논리적 중복을 막는다. 임베딩 배치 크기는 100개, Qdrant upsert 배치 크기는 256개로 설정돼 대량 색인 흐름을 제어한다.
bash
python ingest_to_qdrant.py

data.json의 질문 변형을 임베딩하고 로컬 Qdrant 컬렉션을 다시 만든다.

python
uuid5(NAMESPACE_DNS, answer_id:question_text)

답변 식별자와 질문 텍스트를 바탕으로 재실행에도 변하지 않는 Qdrant 포인트 ID를 만든다.

04
검색 단계는 질문 벡터와 가장 유사한 질문 후보 10개를 가져온 뒤 같은 answer_id를 가리키는 점수를 합산하는 방식으로 작동한다. 후보는 집계 점수가 1.35를 넘거나, 단일 최고 적중 점수가 0.75를 넘으면서 동시에 0.68보다 큰 경우에만 반환되며, --debug 옵션으로 내부 점수와 집계 표를 확인할 수 있다. 여러 질문 변형의 약한 일치가 한 답변으로 모이기 때문에 단순 top-1 질문 검색보다 표현이 다른 사용자 질의에 안정적으로 대응한다.
bash
python chatbot.py --threshold 0.75

검색된 답변을 반환할 최소 집계 점수 임계값을 0.75로 설정해 CLI 챗봇을 실행한다.

05
Classic Generative RAG가 검색 문맥을 런타임 LLM에 넣어 답변을 합성하는 반면, RAGless는 ingestion 단계에서 답변을 만들고 질의 시 그 텍스트를 변경 없이 반환한다. 이 선택으로 검색과 질의 임베딩만 남아 응답 지연이 밀리초 수준으로 줄고, 색인 이후 API 호출이 없어지며, source_quote와 source_file을 이용한 감사 경로도 유지된다. README의 비교표는 100,000토큰 기준 초기 비용을 약 $1.50으로 제시하고, 1,000회 일일 질의의 월간 런타임 비용을 $0.00으로 제시한다.
06
고정 답변 방식은 런타임 환각을 제거하지만 새로운 답변을 합성하거나 여러 블록의 정보를 조합하거나 실시간 변경을 반영하지 못한다. 문서에 포함되지 않은 주제는 답할 수 없고 답변 갱신에는 전체 재수집과 재색인이 필요하며, 원천 문서에서 Q&A를 생성하는 오프라인 단계에는 여전히 환각 위험이 남는다. 따라서 이 시스템의 핵심 교환은 실시간 유연성을 포기하는 대신 검토 가능한 ingestion 결과와 재현 가능한 런타임 동작을 얻는 데 있다.

용어 해설

검색 전용 질의응답(Retrieval-Only Q&A)
검색 전용 질의응답은 사용자의 질문에 맞는 기존 답변을 검색해 그대로 반환하는 구조다. 런타임에 LLM이 문장을 새로 생성하지 않으므로 출력이 고정되고 환각 위험을 줄인다. 대신 사전에 준비한 답변 범위를 넘어선 추론이나 조합은 처리하지 못한다.
비대칭 임베딩(Asymmetric Embeddings)
비대칭 임베딩은 문서와 검색 질의에 서로 다른 임베딩 작업 유형을 적용하는 방식이다. RAGless는 색인 시 RETRIEVAL_DOCUMENT, 검색 시 RETRIEVAL_QUERY를 사용해 문서용 표현과 질의용 표현을 구분한다. 이 설정은 질문과 답변 후보의 의미 유사도 검색을 위한 핵심 구성이다.
answer_id 점수 집계(answer_id Aggregation)
answer_id 점수 집계는 하나의 답변에 연결된 여러 질문 변형의 검색 점수를 합산하는 방식이다. 단일 질문이 완벽하게 일치하지 않아도 같은 답변을 가리키는 약한 일치가 누적되면 후보로 부상한다. RAGless는 이 결과를 임계값과 비교해 답변 노출 여부를 결정한다.
임베디드 Qdrant(Embedded Qdrant)
임베디드 Qdrant는 별도의 서버나 클라우드 서비스 없이 로컬 경로에 벡터 데이터를 저장하는 Qdrant 사용 방식이다. RAGless는 ./qdrant_data에 컬렉션과 벡터를 파일로 보관하고 CPU 환경에서도 검색하도록 구성한다. 운영 구성과 네트워크 의존성을 줄이는 대신 로컬 저장소를 직접 관리해야 한다.
Matryoshka 표현 학습(Matryoshka Representation Learning)
Matryoshka 표현 학습은 임베딩 벡터의 차원을 줄여도 정보 활용이 가능하도록 표현을 구성하는 기법이다. RAGless의 설정에는 Gemini 임베딩의 벡터 차원으로 3072가 지정되어 있으며, 이 차원은 검색 저장 공간과 계산량에 영향을 준다. README는 이를 VECTOR_SIZE 설정과 연결한다.

기술

  • Python
  • Gemini
  • gemini/gemini-2.5-flash
  • gemini/gemini-embedding-001
  • LiteLLM
  • Qdrant
  • qdrant-client
  • pypdf
  • python-dotenv
  • tqdm

활용 사례

  • 문서 기반 FAQ 챗봇
  • 규정과 운영 문서 검색
  • 로컬 환경의 사내 지식베이스
  • 답변 검증과 감사 추적이 필요한 고위험 질의응답
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 14.수집 2026. 08. 14.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.