RAG 맛보기

박진·2026년 2월 11일

2026.02.11 (수)
RAG 란?
RAG와 firebase 연동하기


RAG

RAG (Retrieval-Augmented Generation, 검색 증강 생성) 는 LLM(거대 언어 모델)이 학습하지 않은 외부 데이터를 참조하여 답변의 정확성을 높이는 기술입니다. 기존 LLM의 한계인 할루시네이션(거짓 답변)을 줄이고, 최신 정보나 비공개 데이터(기업 내부 문서 등)를 활용하여 답변할 수 있게 해줍니다.

RAG의 핵심 프로세스

RAG는 크게 세 단계로 작동한다.

  • 검색 (Retrieval): 사용자의 질문과 관련된 문서를 외부 데이터베이스(벡터 DB 등)에서 찾아낸다.

  • 증강 (Augmentation): 찾아낸 관련 정보를 사용자의 원래 질문과 합쳐서 모델에게 전달할 '맥락(Context)'을 만든다.

  • 생성 (Generation): 모델이 제공된 맥락을 바탕으로 최종 답변을 작성한다.

왜 RAG가 필요한가?

학습된 데이터에만 의존하는 기존 LLM의 한계를 다음과 같이 보완한다.

  • 환각(Hallucination) 방지: 모델이 모르는 것을 지어내지 않고, 제공된 근거 데이터를 기반으로 답변하게 유도한다

  • 최신 정보 반영: 모델을 매번 새로 학습(Fine-tuning)시키지 않아도, 외부 데이터베이스만 업데이트하면 실시간 정보나 최신 뉴스를 답변에 반영할 수 있다

  • 보안 및 전문성: 기업 내부 문서나 특정 분야의 전문 데이터를 연동하여 보안을 유지하면서도 고도로 전문적인 답변을 생성할 수 있다


Firebase 기반 RAG 아키텍처

RAG의 핵심은 "질문에 맞는 데이터를 찾아(Search), 질문과 함께 AI에게 전달(Prompt)"하는 것

단계별 구현 방법

Step 1: 지식 베이스 구축 (Vector Search 설정)

일반적인 텍스트 검색과 달리, AI는 단어의 의미를 수치화한 '벡터(Vector)'를 비교해 검색합니다.

1) Firebase 확장 프로그램 설치: Firebase Console에서 "Vector Search with Firestore" 확장을 설치합니다.

2) 데이터 임베딩(Embedding): PDF나 텍스트 문서를 작은 조각(Chunk)으로 나눈 뒤, Google의 text-embedding-004 모델 등을 사용해 벡터 데이터로 변환하여 Firestore에 저장합니다.

이 확장을 쓰면 특정 컬렉션에 문서를 넣을 때 자동으로 벡터 값을 생성해 줍니다.

Step 2: Flutter 앱 설정

Flutter 프로젝트에 필요한 패키지들을 추가하기

dependencies:
  firebase_core: ^3.0.0
  cloud_firestore: ^5.0.0
  firebase_vertex_ai: ^1.0.0 # Firebase용 Gemini SDK

Step 3: 질문에 맞는 데이터 찾기 (Retrieval)

사용자가 질문을 던지면, 그 질문 역시 벡터로 변환하여 Firestore에서 가장 유사한 문서를 찾아오기

// 예시: 유사한 문서 3개 가져오기
final querySnapshot = await FirebaseFirestore.instance
    .collection('knowledge_base')
    .findNearest(
      vectorField: 'embedding',
      queryVector: userQueryVector, // 사용자 질문의 벡터값
      distanceMeasure: DistanceMeasure.cosine,
      limit: 3,
    )
    .get();

Step 4: AI에게 맥락과 함께 질문하기

final model = FirebaseVertexAI.instance.generativeModel(model: 'gemini-1.5-flash');

// 검색된 데이터를 맥락(Context)으로 결합
String context = querySnapshot.docs.map((doc) => doc['text']).join('\n');
String fullPrompt = "다음 정보를 바탕으로 답변해줘:\n$context\n\n질문: ${userController.text}";

final response = await model.generateContent([Content.text(fullPrompt)]);
print(response.text); // 증강된 답변 출력

0개의 댓글