💻데브노트소개
🤖

RAG 파이프라인 직접 이해하기: 검색증강생성의 모든 것

데브노트 편집팀·2026.07.12·8분 읽기
X(트위터)
ADVERTISEMENT

LLM은 학습 시점 이후의 지식을 모르고, 가끔 그럴듯한 거짓말(환각)을 합니다. **RAG(Retrieval-Augmented Generation)**는 답변 직전에 관련 문서를 찾아 프롬프트에 넣어줌으로써 이 한계를 보완합니다.

RAG의 4단계 흐름

  1. 분할(Chunking): 문서를 적당한 크기로 자른다
  2. 임베딩(Embedding): 각 조각을 벡터로 변환해 저장
  3. 검색(Retrieval): 질문도 벡터로 바꿔 가장 유사한 조각을 찾는다
  4. 생성(Generation): 찾은 조각을 프롬프트에 넣어 LLM이 답한다
질문 → [임베딩] → 벡터DB 유사도 검색 → 관련 문서 K개
     → "다음 문맥을 참고해 답하라: {문서}
질문: {질문}" → LLM 답변

1) 분할: 너무 크지도 작지도 않게

조각이 너무 크면 불필요한 내용이 섞이고, 너무 작으면 문맥이 끊깁니다. 보통 300~800 토큰에 약간의 오버랩을 둡니다.

2) 임베딩과 벡터 DB

텍스트를 의미 기반 숫자 배열(벡터)로 바꾸면, 의미가 비슷한 문장은 벡터 거리도 가깝습니다. 이 벡터들을 Pinecone·pgvector·Chroma 같은 벡터 DB에 저장합니다.

# 의사코드
chunks = split(document, size=500, overlap=50)
for c in chunks:
    vec = embed(c)          # 텍스트 -> 벡터
    db.upsert(vec, text=c)  # 저장

3) 검색: 코사인 유사도

질문을 같은 방식으로 임베딩한 뒤, 가장 가까운 상위 K개를 가져옵니다.

q_vec = embed(question)
top_k = db.search(q_vec, k=4)   # 유사도 상위 4개
context = "
".join(top_k)

4) 생성: 문맥을 넣어 답하기

시스템: 아래 문맥만 근거로 답하라. 모르면 모른다고 답하라.
문맥: {context}
질문: {question}

"문맥에 없으면 모른다고 하라"는 지시가 환각을 크게 줄입니다.

품질을 높이는 포인트

문제해결
엉뚱한 문서 검색청크 크기·오버랩 조정, 리랭킹 추가
답이 장황함출력 형식·길이 명시
근거 불명확출처(문서 ID) 함께 반환

마무리 체크리스트

  • 흐름은 분할 → 임베딩 → 검색 → 생성
  • 청크는 적당히, 오버랩으로 문맥 보존
  • "문맥에 없으면 모른다"로 환각 방어
  • 출처 표기로 신뢰성 확보

RAG는 LLM에 '최신 + 내 데이터'라는 기억을 붙여주는 가장 실용적인 방법입니다.

#RAG#LLM#임베딩#벡터DB
X(트위터)
ADVERTISEMENT