앞서 우리는 RAG 시스템의 인덱싱 파이프라인을 정리해봤습니다. 이번에는 사용자가 질문을 던졌을 때, RAG 시스템이 어떤 과정을 거쳐 답변을 만들어내는지를 정리해보려 합니다.
즉, "질문 → 정보 검색 → LLM 답변 생성"이라는 흐름이 어떻게 작동하는지를 8단계로 나누어 설명드리겠습니다.
1. 사용자 질문 (User Query)
- 설명: 모든 RAG 질의응답은 사용자 질문으로 시작됩니다. 질문은 자연어 그대로 입력됩니다.
- 예시:
- “최근 회사 빅데이터 플랫폼의 주요 개선 사항은?”
- “2024년 데이터 관리 정책 변경 사항에 대해 알려줘”
이 단계는 간단해 보이지만, 이후 과정의 품질을 좌우합니다. 질문이 구체적일수록 더 정확한 답변이 가능하죠.
2. 질문 임베딩 (Query Embedding)
- 설명: 질문을 컴퓨터가 이해할 수 있도록 **임베딩 벡터(숫자 벡터)**로 변환합니다.
- 핵심 포인트:
- 이때 사용하는 임베딩 모델은 인덱싱 단계에서 문서를 벡터화할 때 사용했던 것과 동일해야 합니다.
그래야 질문과 문서 벡터가 같은 의미 공간에서 비교됩니다.
오해 방지: LLM(GPT 등)은 임베딩을 직접 하지 않습니다. 임베딩은 별도의 모델(ex. BGE, MiniLM 등)이 처리합니다.
3. 벡터 DB 유사성 검색 (Vector DB Similarity Search)
- 설명: 벡터 데이터베이스(예: FAISS, Chroma, Qdrant 등)에서 질문과 의미적으로 가장 유사한 문서 청크를 찾습니다.
- 방법:
- 질문 벡터와 코사인 유사도(Cosine Similarity) 등을 기준으로 Top-K 문서(보통 3~5개)를 찾습니다.
- 결과: 사용자 질문과 관련 있는 문서 조각들을 식별합니다.
4. 관련 문서 추출 (Retrieve Relevant Documents)
- 설명: 검색된 문서 ID를 기반으로, 실제 **원문 텍스트와 메타데이터(출처, 날짜 등)**를 불러옵니다.
- 역할: 이후 LLM에게 전달될 핵심 컨텍스트 정보가 이 단계에서 정리됩니다.
5. 프롬프트 구성 (Prompt Construction)
- 설명: 사용자 질문과 관련 문서들을 조합하여, LLM에게 전달할 **하나의 프롬프트(지시문)**를 만드는 단계입니다.
- 목적: LLM이 검색된 정보를 바탕으로 정확하고 근거 있는 답변을 생성할 수 있도록, 필요한 맥락(Context)을 함께 전달하는 것입니다.
▶ 프롬프트 형식 예시
RAG 시스템에서는 보통 아래와 같은 형태로 프롬프트를 구성합니다:
당신은 사용자의 질문에 대해 정확하고 신뢰할 수 있는 정보를 바탕으로 답변하는 도우미입니다.
다음은 참고할 수 있는 정보입니다:
{context} ← 벡터 검색을 통해 찾은 문서 청크들
질문:
{question} ← 사용자가 입력한 질문
이처럼 관련 정보를 LLM에 직접 붙여주는 방식이 RAG 아키텍처의 핵심입니다.
프롬프트가 잘 구성되어야, LLM이 검색된 정보를 바탕으로 답변을 제대로 생성할 수 있습니다.
▶ 다양한 응용 방식
상황에 따라 프롬프트 형식은 조금씩 달라질 수 있습니다. 예를 들어:
🔸 출처 기반 문서가 있을 때
문서:
- (출처: 사내 가이드 문서, 2023) Spark 환경은 3월부터 버전 3.5로 업그레이드되었습니다.
- (출처: 보안 정책 변경 공지, 2024) 로그 수집 시 개인정보 마스킹이 필수로 적용됩니다.
질문:
우리 회사의 최신 데이터 정책에 대해 요약해줘.
🔸 포맷을 명시하고 싶을 때 (예: JSON 형식 요청)
다음 정보를 참고하여 질문에 답변하세요.
응답은 아래 JSON 형식을 따르세요.
정보:
{context}
질문:
{question}
응답 형식:
{
"summary": "",
"source": "",
"keywords": []
}
이런 식으로 프롬프트를 정교하게 구성하면, LLM이 더 정확하고 예측 가능한 형식으로 답변을 생성할 수 있습니다.
6. LLM으로 전송 (Send to LLM)
- 설명: 앞 단계에서 완성된 프롬프트를 **LLM(Large Language Model)**에 전달하는 단계입니다.
- 대표 모델: GPT (OpenAI), Gemini (Google), Claude (Anthropic), Llama (Meta) 등
- 특징: 이 시점부터 LLM의 역할이 시작됩니다. 이전 단계까지는 모두 검색과 준비 작업이었다면, 이제는 본격적으로 텍스트 생성 능력이 작동합니다.
7. 답변 생성 (Answer Generation)
- 설명: LLM이 전달받은 프롬프트를 기반으로 최종 답변을 생성합니다.
- 특징:
- 자신이 사전에 학습한 지식뿐 아니라, 프롬프트에 포함된 최신 정보나 특정 도메인 정보를 활용해 답변을 구성합니다.
- 이 과정을 통해 LLM의 대표적인 한계인 환각(Hallucination) 현상을 완화할 수 있습니다.
- 답변은 요약, 추론, 재구성 과정을 거쳐 사용자에게 자연스럽고 이해하기 쉬운 형태로 제공됩니다.
8. 사용자에게 답변 제공 (Provide Answer to User)
- 설명: 생성된 답변이 사용자에게 전달되는 마지막 단계입니다.
- 보완 포인트:
- 필요 시, 답변의 출처 정보(문서 제목, 작성일 등)를 함께 보여줌으로써 신뢰도를 높일 수 있습니다.
- 사용자 인터페이스(UI)나 챗봇 시스템에 통합될 때는, 답변 이외에도 추가 링크나 요약 카드 등을 함께 표시하는 방식으로 확장할 수 있습니다.
마무리: 함께 이해해보는 RAG 질의/응답 흐름
이번 글은 RAG 시스템이 사용자 질문을 어떻게 처리해서 답변을 만들어내는지를 정리해본 내용입니다.
저도 최근에 생성형 AI와 RAG 구조에 관심이 생겨서 계속 공부하고 있는데, 공부하면서 이해가 되었던 내용을 기록해보고 싶어서 이렇게 글로 정리해보게 되었습니다.
이 내용을 안다고 해서 당장 전문가가 되는 건 아니지만, 전체 흐름을 이해하고 기본 구조를 아는 것만으로도 실무에 적용할 수 있는 기반이 된다고 생각합니다. 앞으로도 제가 배운 내용을 블로그에 계속 정리해볼 예정입니다.
'1. 생성형 AI 입문' 카테고리의 다른 글
파인튜닝 vs RAG, 헷갈릴 때 딱 필요한 정리 가이드 (9) | 2025.06.26 |
---|---|
RAG 인덱싱 파이프라인 : 청킹과 임베딩 핵심 이해 (3) | 2025.06.19 |
생성형 AI가 데이터 엔지니어에게 주는 기회 (0) | 2025.05.21 |