수학 개념 지도
딥러닝과 언어 모델

검색 증강 생성(Retrieval-augmented generation)

질문과 가까운 글을 외부 문서 모음에서 찾아 문맥에 넣은 뒤 답을 생성하는 방법. 문서와 질문을 벡터⁠(vector)⁠로 바꾸고 코사인 유사도⁠(cosine similarity)⁠가 큰 이웃을 찾는다. 모델이 배우지 못한 최신 정보나 내부 문서를 쓰게 하고 출처를 보여 줄 수 있지만, 환각⁠(hallucination)⁠을 없애지는 못한다.

sim⁡(q,d)=q⋅d∥q∥ ∥d∥,p(y∣x)≈∑z ∈ top⁡-k(x)pη(z∣x)  pθ(y∣x,z)\operatorname{sim}(q, d) = \frac{q\cdot d}{\lVert q\rVert\,\lVert d\rVert}, \qquad p(y \mid x) \approx \sum_{z \,\in\, \operatorname{top}\text{-}k(x)} p_\eta(z \mid x)\; p_\theta(y \mid x, z)

언어 모델⁠(language model)⁠이 아는 것은 학습 자료에 있던 것뿐입니다. 2024년까지의 글로 학습한 모델에게 "2024년도 튜링상⁠(Turing Award)⁠은 누가 받았나요?"라고 물으면(수상자는 2025년 3월에 발표되었습니다) 모델은 알 길이 없습니다. 그런데도 그럴듯한 이름을 지어내 유창하게 답할 수 있습니다. 이렇게 사실이 아닌 내용을 그럴듯하게 생성하는 것을 환각(hallucination)이라 부릅니다. 검색 증강 생성(RAG)은 답하기 전에 먼저 찾아보게 하는 방법입니다. 질문과 관련된 글을 문서 모음에서 찾아 질문과 함께 모델에 넣고, 그 글을 근거로 답하게 합니다. 2020년 페이스북 AI 연구소의 패트릭 루이스 등이 이 이름을 붙인 논문은 이것을 두 종류의 기억으로 설명했습니다. 가중치⁠(weight)⁠에 녹아 있는 '매개변수⁠(parameter)⁠ 기억'과, 언제든 바꿔 끼울 수 있는 문서 색인이라는 '비매개변수 기억'입니다.

보통 세 단계로 이루어집니다. (1) 색인: 문서들을 몇백 낱말 안팎의 조각으로 자르고, 조각마다 인코더 신경망⁠(neural network)⁠으로 벡터(임베딩⁠, embedding⁠) 하나를 만들어 저장합니다. (2) 검색: 질문도 같은 방식으로 벡터로 바꾸고, 그 벡터와 가장 가까운 조각 k개를 찾습니다. (3) 생성: 찾은 조각들을 질문과 함께 프롬프트에 넣어 답을 쓰게 합니다. 핵심은 '가깝다'를 어떻게 재느냐입니다. 임베딩은 뜻이 비슷한 글이 비슷한 방향을 가리키도록 학습된 벡터이고(단어 임베딩⁠(word embedding)⁠과 같은 생각입니다), 방향이 얼마나 비슷한지는 코사인 유사도로 잽니다.

cos⁡(q,d)=q⋅d∥q∥ ∥d∥∈[−1,1]\cos(q, d) = \frac{q\cdot d}{\lVert q\rVert\,\lVert d\rVert} \in [-1, 1]

아래는 설명을 위해 손으로 놓은 2차원 임베딩입니다. 실제 임베딩은 수백에서 수천 차원이고, 이렇게 주제별로 깔끔하게 모이지도 않습니다. 문서 여덟 개가 네 주제(기하⁠(geometry)⁠, 확률⁠(probability)⁠, 요리, 인물)로 놓여 있고, 노란 점이 질문 벡터 q입니다. '빗변⁠(hypotenuse)⁠의 길이를 어떻게 구하나요?' 같은 질문이 이 근처에 놓인다고 생각하면 됩니다. 처음 자리의 q는 문서 1과 문서 2에서 똑같이 10°씩 떨어져 있어 두 문서의 코사인⁠(cosine)⁠ 점수가 같습니다. q를 끌면서 오른쪽 순위표가 어떻게 바뀌는지 보세요. 유사도⁠(similarity)⁠: , 찾을 개수 k = .

세 가지를 확인할 수 있습니다. 첫째, 코사인 유사도는 방향만 봅니다. q를 원점 쪽으로 당기거나 멀리 밀어도 순위가 그대로입니다. 둘째, 내적⁠(dot product)⁠ q⋅d=∥q∥∥d∥cos⁡θq\cdot d = \lVert q\rVert\lVert d\rVert\cos\theta는 길이도 봅니다. 그래서 처음 자리에서 내적으로 바꾸면, 방향은 더 어긋나 있어도 벡터가 긴 문서 3이 1위로 올라오고 짧은 문서 2는 3위로 밀립니다. 셋째, 유클리드 거리⁠(Euclidean distance)⁠는 q의 길이에 따라 순위가 바뀝니다. 그런데 모든 벡터를 길이 1로 맞추면 세 기준이 같은 순위를 줍니다.

∥q−d∥2=∥q∥2+∥d∥2−2 q⋅d=2−2cos⁡(q,d)(∥q∥=∥d∥=1)\lVert q - d\rVert^2 = \lVert q\rVert^2 + \lVert d\rVert^2 - 2\,q\cdot d = 2 - 2\cos(q, d) \qquad (\lVert q\rVert = \lVert d\rVert = 1)

거리는 코사인이 커질수록 작아지는 함수⁠(function)⁠이니 가까운 순서가 같습니다. 많은 검색 시스템이 임베딩을 길이 1로 맞추어 저장하는 까닭입니다. 표의 마지막 열 p(z|x)는 뽑힌 k개의 점수에 온도 0.1의 소프트맥스⁠(softmax)⁠를 씌운 것입니다. 2020년 RAG 논문은 이 확률로 문서마다의 답을 섞었습니다(아래).

인코더는 어떻게 배우나. 2020년 블라디미르 카르푸힌 등의 밀집 구절 검색(DPR)은 질문용과 구절용 BERT 인코더 두 개를 두고, 점수를 내적으로 정했습니다. 학습 자료는 질문과 그 답이 든 구절의 짝입니다. 한 묶음(배치)에 짝이 B개 있으면, 질문마다 자기 짝 구절의 점수를 묶음 안의 다른 B − 1개 구절보다 높이도록 다음 손실을 줄입니다.

L=−log⁡e q⋅p+∑j=1Be q⋅pj\mathcal L = -\log \frac{e^{\,q\cdot p^{+}}}{\sum_{j=1}^{B} e^{\,q\cdot p_j}}

구절 B개를 '보기'로 삼은 소프트맥스 분류의 교차 엔트로피입니다. 다른 질문의 짝 구절이 공짜 오답 역할을 해서, 묶음 안 음성 예시(in-batch negatives)라 부릅니다. 이렇게 학습한 DPR은 자연 질문(Natural Questions) 자료에서 상위 20개 안에 답이 든 구절을 찾는 비율이 78.4%로, 낱말이 겹치는 정도로 점수를 매기는 BM25(59.1%)보다 높았습니다. BM25는 1990년대 런던 시티 대학의 오카피 시스템에서 나온 방법입니다. 질문의 낱말마다 두 값을 곱해 더합니다. 하나는 그 낱말이 문서에 나온 횟수로, 너무 커지지 않게 누르고 문서 길이로 보정한 값입니다. 다른 하나는 그 낱말이 문서 모음 전체에서 얼마나 드문지입니다. 드문 이름이나 번호를 정확히 찾는 데는 여전히 강해서, 실제로는 두 방식을 섞어 쓰는 일이 많습니다.

2020년의 RAG. 루이스 등은 검색된 문서 z를 보이지 않는 변수로 보고, 답의 확률을 문서에 대해 더했습니다. 이 페이지 맨 위의 둘째 식입니다. 문서 z가 뽑힐 확률 pη(z∣x)∝e d(z)⋅q(x)p_\eta(z\mid x) \propto e^{\,d(z)\cdot q(x)}과 그 문서를 보고 답 y를 쓸 확률을 곱해 더하는 것이니, 조건부 확률⁠(conditional probability)⁠로 쓴 전확률 공식입니다. 모든 문서에 대해 더할 수는 없으므로 상위 k개(5개나 10개)로 어림했습니다. 색인은 2018년 12월 위키백과를 100낱말씩 자른 약 2,100만 개의 조각이었고, 질문 인코더와 생성기는 함께 학습시키되 문서 인코더와 색인은 고정했습니다. 오늘날 흔히 'RAG'라 부르는 것은 이보다 단순해서, 이미 학습된 언어 모델의 프롬프트에 찾은 조각들을 이어 붙일 뿐 확률을 더하지는 않습니다.

수억 개 가운데 가까운 것 찾기. 정확한 최근접 이웃⁠(nearest neighbor)⁠ 찾기는 질문 하나마다 모든 벡터와 내적을 계산해야 합니다. 조각이 1억 개이고 차원이 1,000이면 질문 하나에 곱셈 1,000억 번입니다. 그래서 조금 틀릴 수 있는 대신 훨씬 빠른 근사 최근접 이웃⁠(approximate nearest neighbor)⁠ 검색을 씁니다. 역색인(IVF) 방식은 벡터들을 k-평균⁠(mean)⁠으로 묶어 두고, 질문과 가까운 묶음 몇 개 안에서만 찾습니다. 각 묶음이 맡는 영역은 중심점들의 보로노이 다이어그램⁠(Voronoi diagram)⁠입니다. 곱 양자화(2011년 에르베 제구 등)는 벡터를 몇 토막으로 나눠 토막마다 가까운 대표 벡터의 번호로 적어 메모리를 크게 줄입니다. HNSW(2016년 유리 말코프 등)는 가까운 벡터끼리 이은 여러 층의 그래프를 만들고 위층의 긴 간선부터 탐욕적으로 따라 내려갑니다. 좁은 세상⁠(small world)⁠ 그래프의 성질을 이용한 것입니다. 차원이 높으면 거리들이 서로 비슷해져서 공간을 반씩 나누는 k-d 트리⁠(k-d tree)⁠ 같은 정확한 색인이 거의 전수 조사가 되는데(차원의 저주⁠(curse of dimensionality)⁠), 근사 방법이 필요한 까닭입니다. 2017년 공개된 FAISS 같은 라이브러리가 이런 방법들을 담고 있습니다.

환각은 왜 생기고, RAG는 얼마나 막나. 다음 토큰⁠(token)⁠ 예측은 그럴듯한 글을 쓰도록 학습시키지, 모르면 모른다고 말하도록 학습시키지 않습니다. 2025년 9월 애덤 칼라이 등은 두 가지 원인을 들었습니다(발표 당시 동료 심사 전 논문). 첫째, 맞음/틀림으로만 채점하는 평가에서는 '모르겠다'가 틀린 답과 같은 0점이라 추측하는 쪽이 유리합니다. 둘째, 생일처럼 규칙 없이 외워야 하는 사실에 대해서는 사전학습된 모델의 오류율에 하한⁠(lower bound)⁠이 있습니다. 학습 자료에 딱 한 번 나온 사실의 비율이 대략 그 하한이라는 부등식입니다. 한 번 나온 것의 비율은 굿–튜링 추정⁠(Good–Turing estimation)⁠에서 '아직 못 본 것'의 확률을 어림하는 바로 그 값입니다. RAG는 색인에 있는 사실에 대해 이 문제를 크게 줄이고, 답과 함께 출처를 보여 주어 사람이 확인할 수 있게 합니다. 그러나 없애지는 못합니다. 검색이 엉뚱한 조각을 가져올 수 있고, 모델이 가져온 글을 무시하거나 자기가 알던 것과 섞을 수 있으며, 있지도 않은 출처를 댈 수도 있습니다. 2023년 넬슨 리우 등은 정답이 든 문서가 긴 입력의 처음이나 끝에 있을 때보다 가운데 있을 때 성능이 가장 낮은 U자 곡선을 보고했습니다('가운데서 길을 잃다'). 2024년 스탠퍼드의 바룬 마게시 등은 RAG를 쓴다고 홍보된 상용 법률 검색 AI 도구들이 질문의 17~33%에서 환각을 보였다고 보고했습니다. 검색을 붙였다는 사실만으로 답을 믿을 수는 없고, 인용된 출처를 실제로 확인해야 합니다.

이어지는 곳. 가까움을 재는 코사인 유사도는 내적을 길이로 나눈 것이고, 길이 1인 벡터에서는 유클리드 거리와 같은 순위를 줍니다. 가장 가까운 것을 찾는 문제 자체는 최근접 이웃에서, 공간을 영역으로 나누는 색인은 k-평균과 보로노이 다이어그램에서, 그래프 색인이 빠른 이유는 좁은 세상에서, 높은 차원의 어려움은 차원의 저주에서 이어집니다. 벡터가 뜻을 담는 방식은 단어 임베딩과 주성분 분석⁠(principal component analysis)⁠에, 인코더를 학습시키는 손실은 소프트맥스와 교차 엔트로피⁠(cross-entropy)⁠에 있습니다. 문서를 보이지 않는 변수로 두고 더하는 계산은 조건부 확률과 베이즈 정리⁠(Bayes' theorem)⁠의 일이고, 찾은 글이 들어가는 자리는 트랜스포머⁠(transformer)⁠의 문맥 창, 그 창을 길게 늘리는 방법은 위치 인코딩⁠(positional encoding)⁠에 있습니다. 긴 문맥과 도구 사용이 발전해 온 순서는 언어 모델의 발전사에서 볼 수 있습니다.

이 개념이 나오는 긴 글

거리와 유사도 까마귀와 택시 까마귀는 곧장 날고 택시는 블록을 돌아간다. '얼마나 먼가'에는 답이 하나가 아니고, 어떤 거리를 고르느냐가 통계와 기계 학습의 답을 바꾼다. 언어 모델 다음 단어를 맞히는 기계 다음 낱말을 짐작하는 일만으로 어디까지 갈 수 있을까? 마르코프의 글자 세기에서 섀넌의 추측 게임, 트랜스포머와 규모의 법칙, 사람의 선호까지. 밑바닥에는 확률의 곱셈 규칙과 로그 하나가 있고, 그 수학은 모델이 왜 그럴듯하게 틀리는지도 말해 준다.

이 개념을 언급하는 페이지

이 페이지가 가리키는 개념