Dense Passage Retrieval(DPR)은 '단어가 겹치는 문서'가 아니라 '의미가 가까운 문서'를 찾는 검색 방식이고, 바로 이 전환이 오늘날 ChatGPT·Perplexity·구글 AI가 당신의 글을 인용하는지 마는지를 결정한다. 2020년 Karpukhin 등이 발표한 DPR 논문(arXiv:2004.04906)은 질문과 문서를 각각 벡터로 변환해 '의미 공간'에서 가장 가까운 것을 꺼내는 방법이, 수십 년 검색의 표준이던 키워드 매칭(BM25)을 정확도에서 앞선다는 것을 실험으로 보여줬다. 이 글은 그 메커니즘을 한 겹씩 뜯어보고, '왜 그렇게 동작하는가'를 거쳐 '그래서 내 콘텐츠를 어떻게 써야 AI에 인용되는가'까지 내려간다. 근거 없는 단정은 피하고, 검증된 수치만 인용한다.
먼저 그림부터: 검색은 RAG의 '첫 단추'다
AI가 답을 만드는 과정을 한 문장으로 줄이면 retrieval(검색) → reranking(재정렬) → generation(생성)이다. 사용자가 질문을 던지면, 시스템은 먼저 방대한 문서 더미에서 관련 있어 보이는 후보를 꺼내고(retrieval), 그중 진짜 관련 있는 것을 위로 올린 뒤(reranking), 그것만 읽고 답을 쓴다(generation). 이 골격을 처음 정식화한 것이 Lewis 등의 RAG 논문(2020, arXiv:2005.11401)이다. RAG는 모델이 외운 지식(파라메트릭 메모리)과 그때그때 검색해 온 외부 문서(비파라메트릭 메모리)를 결합한다.
여기서 결정적인 통찰 하나. 검색에서 떨어진 문서는 생성 단계에 아예 들어가지 못한다. 모델이 아무리 똑똑해도 1단계에서 후보로 뽑히지 못한 문서는 답변에 인용될 수 없다. 그러니 'AI에 인용되고 싶다'는 목표는 사실상 '검색 단계에서 후보로 뽑히고 싶다'와 같은 말이다. 그리고 그 검색 단계의 핵심 엔진이 바로 DPR이 대표하는 의미(임베딩) 검색이다.
BM25: 도서관의 단어 색인
DPR을 이해하려면 그 전 시대의 챔피언인 BM25부터 알아야 한다. BM25는 단어가 얼마나 겹치는가로 문서를 채점한다. 질문에 '환불 정책'이 들어 있으면, '환불'과 '정책'이라는 단어가 자주 나오는 문서를 높게 친다(희귀한 단어일수록 가중치가 크다).
비유하자면 BM25는 도서관 뒤편의 단어 색인(index)이다. '환불'이라는 표제어를 찾아 그 단어가 적힌 페이지를 모두 모아 온다. 빠르고, 투명하고, 정확한 단어에는 강하다. 정확한 제품명·코드·고유명사처럼 '철자가 정확히 일치해야 하는' 질의에서는 지금도 BM25가 강력하다.
문제는 사람은 같은 뜻을 수십 가지 단어로 말한다는 데 있다. 이것을 어휘 불일치(vocabulary mismatch)라 부른다.
- 사용자가 검색한 말: "돈 돌려받는 법"
- 문서에 적힌 말: "환불 절차 안내"
둘은 같은 뜻이지만 겹치는 단어가 하나도 없다. BM25는 이 문서를 못 찾는다. 색인은 '돈 돌려받는'이라는 표제어 아래에 '환불 절차' 문서를 넣어두지 않았기 때문이다. 이게 키워드 검색의 천장이다.
DPR: 단어가 아니라 '의미의 좌표'로 찾는다
DPR의 발상은 단순하면서 급진적이다. 질문과 문서를 각각 하나의 벡터(숫자 배열, 보통 수백 차원)로 압축한 다음, 그 벡터들이 얼마나 가까운지로 관련성을 잰다. 단어가 겹치든 말든 상관없다. '돈 돌려받는 법'과 '환불 절차 안내'는 다른 단어로 쓰였지만 의미가 비슷하므로 벡터 공간에서 가까운 위치에 놓인다. 그래서 찾아진다.
비유를 바꿔보자. BM25가 단어 색인이라면, DPR은 주제를 꿰고 있는 사서다. 당신이 "돈 돌려받고 싶은데요"라고 어눌하게 물어도, 사서는 "아, 환불 정책 말씀이시군요" 하고 정확한 책장을 안내한다. 단어가 아니라 의도를 듣기 때문이다.
이중 인코더(dual-encoder): 질문과 문서를 같은 공간에 던지다
DPR은 인코더를 두 개 쓴다. 하나는 질문을 벡터로 바꾸고(질문 인코더), 다른 하나는 문서를 벡터로 바꾼다(문서 인코더). 핵심은 둘이 같은 의미 공간(shared embedding space)을 공유한다는 것이다. 같은 자(尺)로 잰 좌표여야 거리를 비교할 수 있으니까.
질문 q = "돈 돌려받는 법" → [질문 인코더] → q_vec = [0.21, -0.05, 0.88, ...]
문서 p = "환불 절차 안내" → [문서 인코더] → p_vec = [0.19, -0.02, 0.91, ...]
관련성 점수 = q_vec · p_vec (내적, dot product)
↑ 두 벡터가 같은 방향을 가리킬수록 큰 값
점수를 매기는 연산은 내적(dot product)이라는 아주 단순한 곱셈-덧셈이다. 두 벡터가 같은 방향을 가리키면 큰 값, 엉뚱한 방향이면 작은 값이 나온다. 이 단순함이 결정적인데, 이유는 검색 속도에 있다(아래에서 다시 다룬다).
그럼 '의미가 가깝다'는 좌표는 누가 정하나 — 대조 학습
벡터 공간이 처음부터 의미를 알 리 없다. DPR은 대조 학습(contrastive learning)으로 이 공간을 빚는다. 원리는 이렇다. (질문, 정답 문서) 쌍은 벡터를 서로 끌어당기고, (질문, 오답 문서) 쌍은 서로 밀어낸다. 수천만 쌍을 반복하면, '의미가 통하는 것끼리 가까이 모이는' 좌표계가 만들어진다.
DPR 논문의 영리한 기여 하나는 in-batch negatives였다. 한 배치 안의 다른 질문들의 정답 문서를, 지금 질문 입장에선 '오답'으로 재활용해 학습 신호를 공짜로 늘린 것이다. 어려운 오답(헷갈리게 비슷하지만 틀린 문서, hard negative)을 섞을수록 공간이 더 날카롭게 다듬어진다. 마케터에게 주는 함의가 여기 숨어 있다 — AI는 '비슷해 보이지만 질문에 정확히 답하지 않는 글'을 적극적으로 밀어내도록 학습돼 있다. 주제 근처만 맴도는 글은 '하드 네거티브' 취급을 받는다.
그래서 누가 이겼나 — 숫자로 보는 DPR vs BM25
DPR 논문의 핵심 결과는 명확하다. 의미 검색(DPR)이 상위 문서 정확도(top-k retrieval accuracy)에서 BM25를 큰 폭으로 앞섰다. 여러 오픈도메인 질의응답 벤치마크에서 정답 문서를 상위에 끌어오는 비율이 전통적 키워드 검색보다 일관되게 높았고, 이 검색 품질 향상이 최종 답변 정확도 상승으로 그대로 이어졌다. '검색이 좋아지면 답이 좋아진다'는 RAG의 골격을 실증한 셈이다.
다만 david의 입장에서 한 줄 덧붙인다. 이것은 'BM25가 죽었다'는 뜻이 아니다. 정확한 고유명사·코드·드문 표현에서는 키워드 매칭이 여전히 강하고, 의미 검색은 그런 '정확한 한 단어'에서 의외로 헛짚는다. 그래서 현장의 정답은 둘을 합치는 하이브리드 검색으로 수렴했다.
하이브리드 검색: 색인과 사서를 같이 쓴다
공개 벤치마크들을 종합하면 recall@10(상위 10개 안에 정답이 들어올 확률)이 대략 이렇게 갈린다.
| 검색 방식 | recall@10(대략) | 강점 | 약점 |
|---|---|---|---|
| BM25 단독(키워드) | ~65% | 정확한 단어·고유명사 | 어휘 불일치에 취약 |
| 의미 검색 단독(DPR류) | ~78% | 같은 뜻 다른 표현 | 드문 정확 표현에서 헛짚음 |
| 하이브리드(RRF 결합) | ~91% | 둘의 장점 합산 | 구현·튜닝 복잡 |
하이브리드는 도서관 단어 색인 + 주제를 아는 사서를 같이 쓰는 셈이다. 키워드로도 걸리고 의미로도 걸리니, 한쪽이 놓친 걸 다른 쪽이 줍는다. Anthropic이 2024년 공개한 Contextual Retrieval 실험도 같은 결을 보여준다 — 의미 검색에 BM25를 더해 하이브리드로 가자 검색 실패율이 더 떨어졌다(아래에서 자세히).
DPR의 구조적 약점, 그리고 그것을 메우는 reranking
이중 인코더에는 태생적 한계가 있다. 질문과 문서를 각자 따로 벡터로 만든 뒤 마지막에 내적 한 번으로만 만난다. 비유하면, 면접관(질문)과 지원자(문서)가 서로 얼굴도 안 보고 각자 자기소개서만 써서 제출한 뒤, 종이 두 장의 유사도만 기계가 비교하는 격이다. 빠르지만 거칠다. '이 질문의 이 단어와 저 문서의 저 문장이 정확히 호응하는가' 같은 섬세한 상호작용은 못 본다.
이 거친 1차 검색을 보정하는 게 reranking(재정렬)이다. 보통 cross-encoder를 쓰는데, 이건 질문과 문서를 한 묶음으로 같이 읽는다. 면접관과 지원자가 한 방에 마주 앉아 대화하는 것과 같다. 느리지만 정밀하다. 그래서 실무 표준은 '이중 인코더로 후보를 빠르게 수십 개 추리고(retrieval) → cross-encoder로 그중 진짜를 위로 올린다(reranking)'는 2단 구성이다.
재정렬의 효과는 측정돼 있다. cross-encoder reranking은 순위 품질 지표 NDCG를 대략 +5~15 끌어올리고, 1차 검색이 어지러운 어려운 질의에서는 ~20까지도 올린다. 마케터가 새겨야 할 점 — 최종 인용 자리는 1차 검색이 아니라 재정렬이 정한다. 그리고 재정렬기는 질문과 문서를 같이 읽으므로, 질문에 직접 답하는 문장이 본문에 또렷이 있을수록 위로 올라간다.
현대 RAG의 결정판: Anthropic Contextual Retrieval이 알려주는 것
DPR이 연 의미 검색의 흐름이 2024년 어디까지 왔는지를 가장 깔끔하게 보여주는 게 Anthropic의 Contextual Retrieval 실험이다. 여기엔 마케터가 통째로 외워야 할 메커니즘과 수치가 들어 있다.
핵심 문제의식은 '청크(chunk)의 고립'이다. RAG는 긴 문서를 수백 단어짜리 조각(청크)으로 잘라 인덱싱한다. 그런데 잘린 조각은 맥락을 잃는다. 예컨대 "이 수치는 전 분기 대비 3% 올랐다"라는 청크만 떼어 놓으면, '어느 회사 무슨 매출'인지가 사라져 검색이 빗나간다. Contextual Retrieval은 각 청크 앞에 그 청크가 무엇에 관한 것인지 한두 문장 맥락을 덧붙여 인덱싱한다. 결과는 다음과 같다.
| 기법 | 검색 실패율(top-20 기준) | 의미 |
|---|---|---|
| 기본(맥락 없는 청크) | 5.7% | 출발점 |
| + 청크에 맥락 추가 | 3.7% (실패율 35%↓) | 조각에 '무엇에 관한 글인지'를 박음 |
| + BM25 하이브리드 | 실패 49%↓ | 의미+키워드 결합 |
| + reranking | 실패 67%↓ | 재정렬로 최종 보정 |
이 표 하나가 이 글의 모든 메커니즘을 압축한다. 맥락 → 하이브리드 → 재정렬로 갈수록 검색이 좋아진다. 그리고 권장 후보 수는 top-20이었다. 즉 시스템은 질문당 약 20개 청크만 추려 답을 쓴다. 당신의 글이 그 20칸 안에 못 들면 존재하지 않는 것과 같다.
여기서부터가 마케팅이다 — 의미 검색이 콘텐츠를 바꾸는 법
지금까지의 메커니즘에서 실무 규칙을 거꾸로 끌어낼 수 있다. AI는 '단어가 겹치는 글'이 아니라 '질문의 의미에 정확히 답하는 자기완결적 조각'을 좋아한다. 그러니 SEO 시대의 키워드 욱여넣기는 의미 검색 앞에서 효력이 약하다. 핵심은 세 가지다.
1) 키워드 반복 대신 '의미의 명료함'
의미 벡터는 같은 단어를 백 번 쓴다고 더 가까워지지 않는다. 오히려 질문의 의도에 또렷이 대응하는 문장 하나가 벡터를 끌어당긴다.
- ❌ 약한 예: "환불 환불정책 환불방법 환불규정 — 저희는 다양한 환불 옵션을 제공하며 고객 만족을 최우선으로 합니다." (키워드는 많지만 '어떻게 돌려받는지'에 답이 없음)
- ✅ 강한 예: "제품을 받은 날부터 14일 안에 마이페이지 → 주문내역 → '환불 요청'을 누르면, 영업일 기준 3일 안에 결제 수단으로 환불됩니다. 개봉한 식품은 환불이 불가합니다." (질문 '돈 돌려받는 법'의 의미와 정확히 호응 → 다른 표현으로 물어도 검색됨)
2) 자기완결적 청크 — 잘려도 말이 되게
Contextual Retrieval이 증명했듯, 조각은 잘려 나간다. 대명사·생략에 기대면 잘린 순간 맥락이 증발한다. 각 문단이 혼자 떼어 놔도 무엇에 관한 글인지 알 수 있게 써야 한다.
- ❌ 약한 예: "이 경우 3% 더 부과됩니다." (이 경우가 어떤 경우? 무엇에 3%?)
- ✅ 강한 예: "해외 발급 카드로 결제하면 결제액의 3%가 해외 결제 수수료로 추가 부과됩니다." (조각만 떼어 와도 완결)
3) 질문을 그대로 받아 답하는 구조
재정렬기는 질문과 문서를 같이 읽는다. 그러니 사람들이 실제로 던지는 질문을 소제목으로 박고, 그 바로 아래 첫 문장에서 직답하라. 답을 먼저, 부연을 나중에. 이건 우연이 아니라 Lost in the Middle(Liu 등 2023, arXiv:2307.03172)이 보여준 현상과도 맞물린다 — 모델은 긴 맥락의 중간에 묻힌 정보를 잘 놓치고(U자형 성능), 앞과 끝의 정보를 잘 쓴다. 핵심 답을 문단 한가운데 묻지 말고 맨 앞에 둬야 하는 기계적 이유다.
의미 검색만 믿으면 안 되는 이유 — '인용 권위'의 층
검색에 뽑히는 것은 필요조건이지 충분조건이 아니다. 생성 단계의 모델은 '믿을 만한가'도 따진다. GEO를 처음 학술적으로 정의한 Aggarwal 등(2023, arXiv:2311.09735, KDD 2024)은 통계 인용·출처 표기·직접 인용문을 본문에 더하면 생성엔진에서의 가시성이 특정 조건에서 최대 약 40%까지 올랐다고 보고했다. 의미적으로 가까운 데다 '근거까지 갖춘' 글이 인용 자리를 가져간다는 뜻이다.
엔진마다 성향도 다르다. 대규모 인용 분석에 따르면 ChatGPT와 Perplexity가 같은 도메인을 인용하는 비율은 약 11%에 불과하고, 인용의 약 90%가 엔진마다 다르다. ChatGPT는 위키백과(~47.9%)를, Perplexity는 Reddit(~46.7%) 같은 커뮤니티를 즐겨 인용하는 경향이 보고됐다. Claude는 근거가 약한 콘텐츠를 보수적으로 걸러내는 편이고, Gemini는 구글 색인과 E-E-A-T 신호에 민감하다. 한 엔진에서 인용된다고 모두에서 인용되는 게 아니다. 그래서 '어느 엔진이 나를 인용하는가'를 엔진별로 따로 측정해야 한다.
덧붙여, AI 검색의 후보가 되려면 애초에 크롤러가 글을 읽어 갈 수 있어야 한다. GPTBot·OAI-SearchBot(OpenAI), PerplexityBot, ClaudeBot·anthropic-ai(Anthropic), Google-Extended(구글)를 robots.txt에서 막아 두면 의미 검색이 아무리 좋아도 후보에 못 든다. 가장 흔하고 가장 치명적인 자책골이다.
측정의 함정: 한 번 본 숫자는 노이즈다
david로서 반드시 박아두는 경고. AI 가시성은 비결정적이다. temperature를 0으로 둬도 GPU 연산·배치 처리 차이로 같은 질문에 다른 답이 나온다. 한 분석에서는 2,350억 파라미터급 모델을 1,000회 돌렸더니 80가지 출력이 관측됐다. AI 인용은 멱법칙(power law)처럼 출렁이므로, 단일 측정은 사실상 노이즈다. 다중 실행 후 부트스트랩 신뢰구간으로 봐야 신호가 보인다. "어제 ChatGPT가 우리를 인용했다"는 한 번의 캡처로 전략을 세우면 안 되는 이유다.
Citeon은 이 원리를 제품에 담았다
지금까지의 메커니즘 — 의미 검색에 뽑히고(retrieval), 재정렬에서 살아남고(reranking), 근거로 인용되며(generation), 그걸 엔진별로·여러 번 측정해야 한다는 것 — 을 Citeon은 그대로 제품으로 옮겼다.
- 4엔진 인용 측정(SOV): ChatGPT·Gemini·Perplexity·Claude 네 엔진에서 당신 브랜드가 카테고리 답변에 얼마나 언급되는지를 따로 측정한다. 위에서 봤듯 인용의 90%가 엔진마다 다르므로, 합산이 아니라 엔진별로 봐야 메커니즘이 보인다.
- 사이트 진단 엔진: 당신의 페이지가 자기완결적 청크인지, 질문에 직답하는 구조인지, 크롤러를 허용했는지, 근거(통계·출처)를 갖췄는지를 점수로 진단하고 한국어 처방을 준다.
- 경쟁사 역추적: 같은 카테고리에서 인용되는 경쟁사가 '무엇을 어떻게 써서' 의미 검색·재정렬을 통과했는지를 거꾸로 분석한다.
- 주간 모니터 추이: 단일 측정은 노이즈라는 원칙대로, 시간에 걸친 추이로 신호와 잡음을 가른다.
시작은 비용 없이 가능하다. citeon.cloud에서 무료 AI 가시성 진단(₩0)을 받으면, 당신의 페이지가 의미 검색·재정렬·인용의 어느 단계에서 떨어지고 있는지 리포트로 받아볼 수 있다.
자주 묻는 질문
DPR(의미 검색)이 나왔으니 이제 키워드(SEO)는 의미가 없나요?
아니요. DPR 논문도, 그 뒤의 하이브리드 검색 연구도 키워드 검색의 '폐기'가 아니라 '결합'으로 갔습니다. 정확한 제품명·코드·고유명사처럼 철자가 정확히 일치해야 하는 질의에서는 BM25 같은 키워드 검색이 여전히 강합니다. 공개 벤치마크에서 의미 단독 ~78%, 키워드 단독 ~65%, 둘을 합친 하이브리드가 ~91% recall@10로 가장 높았습니다. SEO 기본기 위에 의미적 명료함을 얹는 게 정답입니다.
임베딩 검색에 잘 걸리려면 키워드를 더 많이 넣으면 되나요?
오히려 역효과일 수 있습니다. 의미 벡터는 같은 단어 반복으로 가까워지지 않습니다. 질문의 의도에 정확히 대응하는 문장 하나가 더 강하게 끌어당깁니다. DPR은 학습 과정에서 '비슷해 보이지만 정확히 답하지 않는 글(하드 네거티브)'을 적극적으로 밀어내도록 훈련됩니다. 키워드 나열형 글이 바로 그 하드 네거티브 취급을 받기 쉽습니다.
왜 핵심 답을 문단 맨 앞에 두라고 하나요?
두 가지 메커니즘 때문입니다. 첫째, 재정렬(reranking) 단계의 cross-encoder는 질문과 문서를 함께 읽으므로 질문에 직접 답하는 문장이 또렷할수록 위로 올라갑니다. 둘째, Lost in the Middle(Liu 등 2023) 연구에 따르면 모델은 긴 맥락의 중간에 묻힌 정보를 잘 놓치고 앞과 끝의 정보를 잘 활용합니다(U자형 성능). 그래서 핵심 답은 문단 한가운데가 아니라 맨 앞에 둬야 합니다.
한 번 측정해서 'ChatGPT가 우리를 인용했다'면 성공한 건가요?
단정하기 이릅니다. AI 답변은 temperature를 0으로 둬도 비결정적입니다. 한 분석에서는 대형 모델을 1,000회 돌렸을 때 80가지 출력이 나왔습니다. 인용은 멱법칙처럼 출렁이므로 단일 측정은 노이즈에 가깝습니다. 여러 번 측정한 추이와 신뢰구간으로 봐야 진짜 신호를 가릴 수 있습니다. Citeon의 주간 모니터가 이 원칙을 따릅니다.
크롤러를 막아 두면 어떻게 되나요?
의미 검색이 아무리 좋아도 후보에 들지 못합니다. GPTBot·OAI-SearchBot(OpenAI), PerplexityBot, ClaudeBot·anthropic-ai(Anthropic), Google-Extended(구글) 같은 AI 크롤러가 robots.txt에서 허용돼 있어야 글이 인덱싱되고, 그래야 retrieval 단계의 후보가 됩니다. 인용 전략의 가장 기본적인 전제 조건입니다.
참고자료
- Karpukhin et al. 2020, Dense Passage Retrieval for Open-Domain Question Answering (arXiv:2004.04906)
- Lewis et al. 2020, Retrieval-Augmented Generation (arXiv:2005.11401)
- Liu et al. 2023, Lost in the Middle (arXiv:2307.03172)
- Aggarwal et al. 2023, GEO: Generative Engine Optimization (arXiv:2311.09735, KDD 2024)
- Anthropic 2024, Introducing Contextual Retrieval
