AI VIDEO BRIEFING

RAG 작동 원리 심층 해설: 임베딩·코사인 유사도·문장BERT·벡터DB·HNSW까지 완전 해부

검색 증강 생성(RAG)의 전체 파이프라인을 단계별로 해부한다. 임베딩과 코사인 유사도, 문장 BERT의 샴 네트워크, 벡터 DB의 HNSW 탐색까지 각 구성 요소의 작동 원리를 깊이 있게 다룬다.

RAG 완전 해부: 임베딩, 문장 BERT, 벡터 데이터베이스(HNSW)까지 영상 대표 이미지

핵심 메시지

  • 언어 모델은 학습 데이터에 갇혀 있어 최신 지식을 모르며, 이를 보완하는 길은 파인튜닝과 검색 증강 생성(RAG) 두 가지다.
  • RAG는 문서를 문장 단위로 쪼개 임베딩으로 만들어 벡터 DB에 저장하고, 질문 임베딩과 가장 유사한 문맥을 찾아 프롬프트에 넣어 LLM이 답하게 한다.
  • 임베딩은 의미가 비슷한 단어·문장이 공간에서 같은 방향을 향하게 만든 벡터이며, 유사도는 주로 코사인 유사도(벡터 사이 각도)로 측정한다.
  • 문장 BERT는 샴(쌍둥이) 네트워크로 학습해, 코사인 유사도로 비교 가능한 문장 임베딩을 생성한다(평균 풀링이 최선으로 권장됨).
  • 벡터 DB는 느린 완전탐색(KNN) 대신 HNSW(계층적 탐색 가능 소규모 세계) 알고리즘으로 정밀도를 약간 희생하고 속도를 크게 높인다.

쉽게 이해하기

영상은 RAG가 왜 필요한지부터 짚는다. 언어 모델은 학습 데이터에 기반해서만 답할 수 있어, 2018년에 학습한 모델은 코로나를 모른다. 지식을 보강하는 한 방법은 최신 데이터로 파인튜닝하는 것이지만, 계산 비용이 크고 파라미터 수가 지식 양을 제한하며 '가산적'이지 않다는 단점이 있다. 영어 모델을 일본어로 강하게 파인튜닝하면 기존 영어 능력 일부를 잊을 수 있다. 또 다른 방법이 RAG로, 질의응답에 특히 유용하며 트위터의 Grok이 실시간 트윗을 참조해 최신 트렌드에 답하는 데도 쓰였다.

프롬프트 엔지니어링으로도 지식 부족을 일부 보완할 수 있다. 지시와 컨텍스트(답을 찾을 텍스트), 질문을 하나의 큰 프롬프트로 묶으면, 모델이 학습하지 않은 정보(예: 최근 공개된 Grok-0의 파라미터 수)도 컨텍스트에서 찾아 답할 수 있다. 다만 컨텍스트가 클수록 토큰이 많아져 계산 비용이 커진다. 파인튜닝은 컨텍스트를 매번 제공할 필요를 줄여주지만 품질과 비용의 트레이드오프가 있다. RAG는 파인튜닝 없이 프롬프트 방식을 쓰되, 질문에 맞는 컨텍스트를 자동으로 찾아주는 벡터 DB를 도입하는 접근이다.

RAG 파이프라인은 이렇게 흐른다. 문서(PDF·웹페이지)를 문장 같은 작은 청크로 쪼개고, 각 문장을 고정 크기 벡터인 임베딩으로 변환해 벡터 DB에 저장한다. 질문도 같은 모델로 임베딩해 DB에서 가장 잘 맞는 임베딩들을 검색하고, 각 임베딩에 연결된 원문 텍스트를 되찾아 컨텍스트로 삼는다. 이 컨텍스트와 질문을 프롬프트 템플릿에 넣어 LLM에 주면 답이 생성된다. 임베딩을 벡터로 쓰는 이유는, 의미가 비슷한 단어들이 공간에서 같은 방향을 향하게 해(예: digital과 information의 각도는 작고 cherry와는 큼) 코사인 유사도로 의미적 거리를 잴 수 있기 때문이다.

임베딩의 토대는 '비슷한 단어는 비슷한 맥락에 나타난다'는 분포 가설이며, 이것이 트랜스포머가 셀프 어텐션으로 문맥을 포착하는 이유다. BERT는 빈칸 채우기에 해당하는 마스크드 언어 모델 과제로 학습해, 역전파로 단어 임베딩이 문맥 정보를 담도록 갱신한다. 문장 임베딩은 BERT가 출력한 토큰 임베딩들을 평균(평균 풀링)해 만들 수 있다. 그러나 BERT에게 '이 임베딩을 코사인 유사도로 비교 가능하게 만들라'고 알려준 적이 없다는 문제가 있다. 여기서 문장 BERT가 등장한다.

문장 BERT는 구조와 가중치가 동일한 두 분기로 그려지는 샴(쌍둥이) 네트워크로 학습한다. 두 문장을 각각 통과시켜 문장 임베딩을 얻고, 둘의 코사인 유사도를 목표값과 비교해 손실을 계산하고 역전파한다(실제로는 분기가 하나뿐이며 순차로 통과시킨다). 이렇게 하면 비슷한 문장이 높은 코사인 유사도를 갖는 임베딩이 나온다. 논문은 평균·최대 풀링과 CLS 토큰을 비교했고 평균 풀링을 권장한다. 마지막으로 벡터 DB의 탐색을 다룬다. 단순 KNN은 질의를 모든 벡터와 비교해 정확하지만 느리다(복잡도 n×D). 대신 HNSW를 쓰는데, 이는 '6단계 분리'에서 영감받은 탐색 가능 소규모 세계(NSW) 그래프에 스킵 리스트의 계층 개념을 결합한 것이다. 위쪽 희소 층에서 시작해 더 유사한 이웃으로 이동하다 아래 조밀한 층으로 내려가며, 정밀도(재현율)를 약간 희생하는 대신 속도를 크게 높인다. 실제로 Grok이 쓰는 오픈소스 벡터 DB Qdrant도 HNSW를 인덱스로 사용한다.

주요 인사이트

  • 파인튜닝과 RAG는 대립이 아니라 보완 관계다. 몇 에폭 파인튜닝한 뒤 벡터 DB로 웹에서 검색한 지식을 더하는 식의 결합도 가능하다.
  • 임베딩의 직관은 '의미=방향'이다. 단어를 벡터로 두면 비슷한 의미는 작은 각도를, 다른 의미는 큰 각도를 이루어 코사인 유사도로 의미적 유사성을 수치화할 수 있다.
  • BERT의 원본 임베딩이 곧바로 비교 가능한 게 아니라는 점이 문장 BERT의 존재 이유다. 샴 네트워크 학습으로 비로소 코사인 유사도로 의미를 비교할 수 있게 된다.
  • 벡터 검색의 핵심 지표는 재현율이며, HNSW는 '정밀도를 약간 내주고 속도를 크게 얻는' 근사 최근접 이웃 탐색의 대표적 절충이다.
  • 수백만 개 벡터는 텍스트 데이터 세계에선 큰 수가 아니다. 실시간 트윗을 색인하는 Grok처럼 수십억 규모를 다룰 때 완전탐색 KNN은 비현실적이라 HNSW 같은 근사 알고리즘이 필수가 된다.

자주 묻는 질문

RAG와 파인튜닝은 무엇이 다른가요?

파인튜닝은 새 데이터로 모델 가중치를 직접 갱신해 지식을 심지만, 계산 비용이 크고 새 지식이 기존 지식을 일부 잊게 할 수 있습니다. RAG는 모델을 바꾸지 않고, 질문에 맞는 문맥을 벡터 DB에서 검색해 프롬프트에 넣어 답하게 하는 방식입니다. 둘은 결합해서 쓸 수도 있습니다.

문장 BERT(Sentence BERT)는 왜 필요한가요?

일반 BERT가 출력하는 임베딩은 코사인 유사도로 곧바로 비교하도록 학습된 것이 아닙니다. 문장 BERT는 구조·가중치가 같은 샴(쌍둥이) 네트워크로 두 문장의 유사도를 목표값에 맞춰 학습시켜, 비슷한 문장이 비슷한 임베딩을 갖도록 만들어 유사도 비교가 가능하게 합니다.

벡터 데이터베이스는 왜 HNSW 같은 알고리즘을 쓰나요?

질의를 모든 벡터와 비교하는 단순 KNN은 정확하지만 벡터 수와 차원에 비례해 매우 느립니다. HNSW(계층적 탐색 가능 소규모 세계)는 그래프 탐색으로 비교 횟수를 크게 줄여, 재현율(정밀도)을 약간 희생하는 대신 속도를 크게 높입니다. Grok이 쓰는 Qdrant도 이 알고리즘을 사용합니다.

원문과 출처

이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.

YouTube 원본 영상 보기 ↗

관련 AI 소식