학습 차원에서 틈틈이 해외 전문가들이 블로그나 미디어 그리고 책에서 쓴 글을 번역 또는 요약 정리하고 있습니다. 이번 포스팅도 그중 하나고요. 거칠고 오역된 부분이 있을 수 있습니다. 제대로 번역되지 않은 부분은 확인 주시면 반영토록 하겠습니다. 의미 전달이 애매한 문장은 삭제했습니다. 이번에는 Michael Wood가 미디엄에 올린 글을 정리한 것입니다.
RAG(Retrieval-augmented generation)는 쿼리에 대해 저장돼 있는 정보 중 동일성 비율이 가장 높은 것을 찾는 것이다. 벡터 유사성 검색(Vector similarity search)은 이 작업을 수행하지 않는다. 그래서 RAG가 실패하는 것이다.
벡터 임베딩은 동일성 비율을 결정하는 데 적합하지 않기 때문에 RAG는 실전 단계에서 실패한다. 이 사실은 쉽게 증명할 수 있다. 아래 3개 단어를 생각해 보라.
왕(King)
여왕(Queen)
통치자(Ruler)
왕과 통치자는 같은 사람을 가리킬 수 있기 때문에(따라서 동의어로 간주됨) 둘 다 같은 유사성 비율이다. 그러나 왕과 여왕은 분명 다른 사람들이다. 동일성 비율 관점에서 왕/통치자는 높은 점수를 받아야 하고, 왕/여왕은 말 그대로 0점이어야 한다.
다시 말해, 쿼리가 “왕”에 관한 것을 묻는다면, “여왕”에 관한 것들은 관련이 없을 것이고, “통치자”에 관한 것들은 관련이 있을 수 있다. 그러나 벡터 임베딩은 “여왕”이 “통치자”보다 “왕”에 대한 검색과 더 관련이 있다고 간주한다. 다음은 OpenAI ADA-002 임베딩을 사용해 “왕”과 비교했을 때 “여왕”과 “통치자” 벡터 유사성 점수다.
왕
여왕: 92%
통치자: 83%
왕에 관한 정보를 요청할 때, 여왕에 관한 정보가 있는 구절이 통치자에 관한 구절보다 우선시된다. 여왕에 관한 구절은 전혀 관련이 없더라도 말이다.
벡터 임베딩은 다음 질문에 적합하지 않다
벡터 임베딩 문제는 사람 뿐만 아니라 사물을 가리키는 단어에서도 발생한다. 고양이 특징에 대해 질문하는 것을 생각해 보라. 개에 관한 구절은 동일성 비율에 대한 점수가 0이어야 하고, 고양이에 관한 구절은 매우 높은 점수를 가져야 한다. 그러나 다시 한 번, 벡터 임베딩은 이것을 잘못 이해한다.
고양이
개: 86%
고양이: 85%
점수가 1% 차이지만 이것은 개에 관한 구절이 고양이에 관한 구절보다 우선한다는 것을 의미한다. 개에 관한 구절은 관련성이 전혀 없고, 고양이에 관한 구절은 매우 관련성이 높는데도 말이다.
벡터 임베딩 문제는 사람과 사물에만 국한되지 않고, 시간에 관한 검색에도 영향을 미친다. 1900년대에 관한 질문을 생각해 보라. 동일성 비율 관점에서, 1700년대에 관한 구절은 0%여야 하고, 20세기에 관한 구절은 말 그대로 100%여야 한다('1900년대'와 '20세기'는 서로 바꿔서 사용할 수 있기 때문이다). 그러나 다시 한 번, 벡터 임베딩은 동일성 정도를 잘못 나타낸다.
1900년대
1700년대: 91%
20세기: 89%
1700년대는 20세기에 비해 (문자 그대로 0% 관련성에도 불구하고) 훨씬 더 유사하다고 간주된다는 점에 유의하라(1900년대와 문자 그대로 정확히 동일함에도 불구하고).
정확히 같은 의미를 가진 단어를 절대적 동의어(absolute synonyms) 또는 완벽한 동의어(perfect synonyms)라고 한다. 그러나 절대적 동의어의 경우에도 벡터 임베딩은 전혀 동의어가 아닌 것들에 우선순위를 부여한다. 다음 예에서 더 자세히 확인할 수 있다.
“빅 애플"(The Big Apple)은 뉴욕시를 직접적으로 지칭하는 말이다. 이제 뉴저지 거주자인 수잔이 고향에서 방문한 식당, 박물관, 기타 장소에 관한 블로그 게시물을 많이 작성했다고 가정해 보자. 그러나 수잔 게시물 중 하나에는 그녀가 ‘빅 애플’에서 결혼했다고 적혀 있다. 수잔 웹사이트 방문자가 챗봇에게 ‘수잔이 뉴욕에 가 본 적이 있나?’라고 묻는다.
불행히도, 뉴저지에 관한 수많은 항목이 수잔의 결혼 게시물보다 우선한다. 왜 그럴까? 벡터 임베딩 관점에서 보면 “뉴저지”는 빅애플보다 “뉴욕”과 의미적으로 더 유사하다.
뉴욕
뉴저지: 90%
빅 애플: 89%
“뉴저지"와 관련된 게시물 수에 따라, ‘빅 애플’에 대한 언급이 포함되지 않을 수 있다. 따라서 벡터 임베딩은 장소(예: 뉴욕), 사람(예: 킹스), 사물(예: 고양이), 시간(예: 1900년대)과 마찬가지로 위치와 관련해서도 실패할 수 있다.
사실, 벡터 임베딩은 설명(instructions)에서도 실패할 수 있다.
케이크 굽기
파이 굽기: 93%
초콜릿 케이크 만들기: 92%
“케이크를 굽는 방법"을 묻는 질문을 생각해 보라. ‘파이 굽기’에 관한 구절(93% 점수)이 ‘초콜릿 케이크 만들기’에 관한 구절(92% 점수)보다 우선한다. 전자는 전혀 관련이 없고 후자는 직접 관련이 있음에도 불구하고 말이다.
위의 예는 벡터 유사성이 동일성 비율을 신뢰할 수 있는 척도로 사용할 수 없다는 것을 보여준다. 사실, 사람(왕), 사물(고양이), 시대(1900년대), 장소(뉴욕), 심지어 설명(케이크 굽기)에 대해서도 신뢰할 수 없다. 다시 말해, 벡터 임베딩은 사람(사람), 사물(사물), 시기(시대), 장소(장소), 그리고 “방법”에 관한 질문에서 신뢰할 수 있는 유사성 비율을 측정하지 못한다. 다시 말해, 벡터 임베딩은 사람이 할 수 있는 거의 모든 유형의 질문에 근본적인 결함이 있다.
쿼리 컨텍스트는 문제를 해결할 수 없다
이와 관련해 이전에 쓴 글에 대해 비판적인 이들은 “컨텍스트가 중요하다”고 주장한다. 그들은 개별 단어 유사성은 중요하지 않다는 입장이다. 쿼리 컨텍스트가 모든 것을 해결할 수 있어서다.
첫째, 이들은 아래 자세히 설명된 모든 연구를 완전히 무시했다. OP-RAG, KG-RAG, RankRAG, LongRAG 등에 대한 연구는 쿼리 컨텍스트가 수학을 마법처럼 해결하지 못한다는 것을 보여준다.
둘째, 이들은 위의 계산(Math)을 여러 단어에 적용하는 데 시간을 할애해야 한다. 이것은 내가 개인적으로 수행한 연구다. 더 많은 단어를 추가하면 계산은 더 나빠지지 좋아지지 않는다는 것을 알 수 있다. 특히 쿼리 키워드가 의미적으로 유사한 잘못된 단어와 쌍을 이루는 경우에는 더욱 그렇다.
예를 들어, ChatGPT-4는 Afonso II의 어머니를 잘못 알려줬다. 대신, ChatGPT-4는 Alfonso VII(완전히 다른 사람)의 어머니를 알려주었다. 이유는 Afonso와 Alfonso가 의미적으로 유사하기 때문이다(비록 0% 동일하더라도). 더 중요한 것은, ChatGPT-4가 잘못된 답변을 제공한 이유는 질문의 맥락 때문이다. 다음 질문을 생각해 보라: “포르투갈의 세 번째 왕인 아폰소 2세의 어머니는 누구였나?”
학습 데이터에 ‘어머니’라는 단어는 Alfonso라는 단어 근처에 있다.
학습 데이터에 Afonso라는 단어 근처에는 ‘어머니’라는 단어가 없다
따라서 “어머니”라는 단어 맥락 때문에 ChatGPT는 Afonso II와 Alfonso VII가 완전히 다른 사람이라는 사실을 간과했다. 쿼리 맥락은 문제를 악화시켰을 뿐 개선하지 못했다. OpenAI는 이후 다른 환각과 마찬가지로 Afonso 답변을 미세 조정했지만, 그 결과 ChatGPT는 더욱 악화되었다.
벡터 임베딩도 마찬가지다. RAG에 청크(chunk, 텍스트 블록)를 제공하기 위해 동일한 훈련 데이터가 사용되었다면, RAG 기반 챗봇은 동일한 결과를 제공할 것이다. “mother” + “Alfonso”는 “Afonso” 단독보다 쿼리와 벡터 유사성이 더 크다.
Afonso의 어머니
Alfonso의 어머니: 93%
Afonso: 90%
따라서, 쿼리 컨텍스트는 상황을 더 악화시킬 뿐, 개선시키지는 못한다.
RAG 전통주의자들이 말하지 않는 것
위의 예가 선별된 것일 수도 있다는 생각이 들 수도 있다. 또는 백분율 점수가 실제로 중요하지 않을 수도 있다는 생각이 들 수도 있다.그러니 RAG 옹호자들이 말하지 않는 것을 살펴보자. RAG에 대한 가스라이팅 프레젠테이션과 RAG 실제 작동 방식을 비교해 보자.
RAG 가스라이팅 프레젠테이션: 수백만 개 청크(Chunk)에 대한 벡터 임베딩 정보를 벡터 데이터베이스에 저장한다. 사용자 쿼리에 대한 벡터 임베딩 정보를 가져온다. 코사인 유사성을 사용해 일치하는 상위 3개 청크를 찾아 쿼리와 함께 LLM으로 보낸다. 이것은 “빠르고, 정확하며, 확장 가능한” 솔루션이다.(40만명 이상의 사람들에게 교육을 제공한 AI 분야 저명한 저자의 인용문 — 아래 참조).
최첨단 RAG 실제 작동 방식: 수천 개 문서에 대한 벡터를 벡터 데이터베이스에 로드한다. 쿼리와 함께 LLM으로 전송할 약 50,000자 분량 청크를 검색한다. 그 결과 신뢰할 수 없는 챗봇이 만들어진다(예: F1 점수 50점 미만).
고급 RAG가 해결책이 아니다
데이터 과학자와 프로그래머들이 자신이 뭔가 잘못하고 있다고 생각하는 수많은 포럼 게시글을 보고 이 글을 쓰고 있다. 선의를 가진 일부가 많은 시도들을 제안한다..: 순위 재조정, 쿼리 재작성, BM25, 지식 그래프 등. 뭔가 효과가 있기를 바라며 모든 것을 제안한다.
순위 재조정
순위재조정(Reranking)은 아마 가장 권장되는 고급 RAG 전략일 것이다. 그러나 RankRAG 연구에 따르면, Reranking을 위해 미세 조정된 모델을 사용하더라도 EN.QA에서 54.2점밖에 되지 않는다. 일반적인 Reranking 모델을 사용하면 점수가 더 낮아진다.
GraphRAG와 지식 그래프
최근 KG-RAG(지식 그래프를 통해 강화된 RAG)에 대한 연구에 따르면, CWQ 데이터셋에 대해 F1 점수 25%와 정확도 32%를 기록했다. 흥미롭게도, 지식 그래프 RAG 정확도는 일반 임베딩 RAG(정확도 46%)보다 낮았다.
마이크로소프트 GraphRAG에 관해서는 마이크로소프트가 LangChain’s Q&A, 이른바 나이브(naive) RAG와 같은 수준에 불과하다고 인정하고 있다! 마이크로소프트 설명에 따르면: “결과는 GraphRAG가 기준 RAG와 비슷한 수준 충실도를 달성한다는 것을 보여준다.” 이 비교에서 기준 RAG로 LangChain Q&A를 사용한다.
키워드 하이브리드 검색
BM-25 키워드 검색 및/또는 하이드 및/또는 요약 기능을 추가하더라도 벤치마크 전반에 걸쳐 평균 점수가 0.50점 미만으로 나타난다. 다양한 고급 RAG 검색 방법 조합으로 평균 최고 점수인 0.446을 얻었다. 그러나 이 정도 “정확도”는 실제 챗봇에서는 실용적이지 않다. 이 연구에서 BM-25 + Hyde 조합만으로도 쿼리당 11.71초가 걸렸다.
실제 환경과 과열의 차이
벡터 임베딩과 수십여개 고급 RAG 기법을 결합하면 수많은 문서가 포함된 생산 환경에서 신뢰할 수 있는 챗봇을 만들 수 있다는 것을 보여주는 연구는 없다. 게다가, 많은 고급 RAG 기법 추가적인 지연 시간 때문에 실제 환경 챗봇에 적용하기가 어렵다. 정확성 문제는 차치하고서라도 미말이다.
빅 LLM이 해결책이 될 수는 없다
2024년 10월 발표된 데이터브릭스 연구를 생각해 보라. 정확도 80%를 넘기 위해 RAG는 6만4000자 분량 덩어리를 OpenAI o1에 보내야 했다. GPT-4o, GPT-4 Turbo, Claude-3.5 Sonnet을 포함한 다른 모델은 80%에 도달하지 못했다. 그러나 o1 결과에는 많은 문제가 있다.
첫째, 환각률이 여전히 너무 높다.
둘째, o1은 짧은 문맥을 처리할 때조차도 매우 느리다. 64,000개의 문맥을 처리하는 것은 매우 느리다.
셋째, o1은 실행 비용이 많이 든다.
무엇보다도, 최근 출시된 모델들은 이미 출시된 모델들보다 크게 개선되지 않았다는 소문이 돌고 있다. 그러나 더 큰 모델이 이 문제를 극복할 수 있다고 하더라도, 더 느리고 더 비쌀 것이다. 다시 말해서, 실제적인 목적에 비추어 볼 때 너무 느리고 너무 비쌀 것이다. 챗봇이 신뢰할 수 없는 답변을 할 때마다 최대 1분까지 걸린다면, 기업들이 사람보다 챗봇에 더 많은 비용을 지불할까?
이것이 바로 RAG의 실제 상태다. 벡터 임베딩에 의존한 실제 결과다. 당신이 아니라 RAG들이 문제다. 문제는 수십만 명에 가르치고 있는 내용이 명백히 사실이 아니라는 것이다. 다음은 40만 명 이상 사람들에게 가르친 회사 공동 설립자가 2024년 10월에 업데이트한 책에서 발췌한 내용이다.
RAG는 단일 LLM 컨텍스트 창에 들어가지 않는 대규모 데이터셋을 처리해야 하고, 빠른 응답 시간과 짧은 지연 시간이 필요한 시나리오에 가장 적합하다. …
요즘에는 RAG 시스템 표준 아키텍처가 이미 널리 사용되는 프레임워크에 구현되어 있으므로 개발자가 처음부터 다시 만들 필요가 없다. … 일단 데이터가 임베딩으로 변환되면, 벡터 데이터베이스는 유사한 항목을 빠르게 찾을 수 있다. 유사한 항목은 벡터 공간에서 서로 가까운 벡터로 표현되기 때문이다. 이를 벡터 저장소(벡터 저장)라고 한다. 시맨틱 검색은 벡터 저장소 내에서 검색하는 것으로, 임베딩을 저장된 데이터 임베딩과 비교해 쿼리 의미를 이해한다. 이를 통해 검색 결과 관련성과 의도된 의미와 일치 여부를 보장한다. 쿼리에 사용된 특정 단어 또는 검색되는 데이터 유형에 관계없이 말이다.
계산으로 설명한 것처럼, 벡터 임베딩은 동일성 비율에 근거해 항목을 찾지 않는다. 벡터 임베딩은 쿼리의 의미를 이해할 수 없다. 벡터 임베딩은 “쿼리에 사용된 단어 또는 검색되는 데이터 유형에 관계없이”라는 조건을 충족시키지 못한다. 벡터 임베딩은 가장 단순한 쿼리에서도 검색 결과가 “관련성”을 갖도록 “보장”하지 않는다.
OP-RAG에 대한 연구 논문에서 알 수 있듯이, 벡터 검색을 통해 400개 청크를 검색하더라도, LLM은 가장 단순한 벤치마크에서 50% 이상 시간 동안 관련 정보를 찾지 못할 수 있다 그럼에도 불구하고, 데이터 과학자들은 교과서에서 다음과 같은 내용을 배운다. “실제 프로젝트에서, 전체 웹사이트나 강의를 딥 레이크(벡터 데이터베이스)에 업로드해 수천 또는 수백만 개 문서를 검색할 수 있다. … 응답을 생성하기 위해, 우리는 사용자 질문과 가장 유사한 상위 k개(예: 상위 3개) 청크를 검색하고, 프롬프트를 포맷한 다음, 온도 0에서 모델로 보낸다”
현재 교과서에서는 벡터 임베딩이 매우 강력해서 “수백만 개의 문서”를 저장할 수 있고, “상위 3개” 덩어리에서 쿼리에 대한 관련 답변을 찾을 수 있다고 학생들에게 가르치고 있다. 다시 말하지만, 수학 및 인용된 연구 결과에 따르면 이것은 명백히 사실이 아니다.
100% 정확한 답변을 얻는 길
문제에 대한 해답은 벡터 임베딩에 의존하는 것을 중단하는 것이다.
그렇다면 벡터 임베딩이 쓸모가 없다는 뜻일까? 전혀 그렇지 않다! 벡터 임베딩은 자연어 처리(NLP)에서 매우 중요한 역할을 한다.
예를 들어, 벡터 임베딩은 여러 의미를 가진 단어에 사용할 수 있는 강력한 도구다. 'glasses'라는 단어를 예로 들어 보자. 이 단어는 술잔과 안경(그 밖의 것들)을 가리킬 수 있다.
이제 다음 질문을 생각해 보자: 줄리아 로버츠가 어떤 종류 안경을 쓰는가? 벡터 임베딩은 안경에 관한 청크가 술잔을 가리키는 청크보다 위에 위치하도록 해 준다. 이것이 바로 벡터 임베딩의 의미론적인 힘이 발휘하는 곳이다.
ChatGPT 출시는 데이터 과학 커뮤니티에 다소 안타까운 변화를 가져왔다. 동의어, 하위어, 상위어, 전체어 등을 사용하는 것과 같은 중요한 NLP 도구는 챗봇 쿼리에 밀려났다. LLM이 NLP 일부를 대체했다는 것은 의심의 여지가 없다. 하지만 LLM과 벡터 임베딩은 NLP 퍼즐의 빠진 조각들이다. LLM과 벡터 임베딩은 그 자체로 전체 그림이 아니다.
예를 들어, 기업들은 챗봇이 방문자들이 찾고 있는 제품 목록을 제공하지 않을 때 방문자들이 사이트를 떠난다는 사실을 오랫동안 알고 있었다. 따라서 기업들은 키워드 기반 검색을 동의어 기반 검색으로 대체하려고 시도했다. 동의어 기반 검색은 키워드 기반 검색으로는 찾을 수 없는 제품을 찾아내기도 했다. 그러나 그 대가는 컸다. 여러 가지 의미를 가진 단어들은 종종 방문자가 원하는 정보를 가려버리는 관련 없는 정보를 불러왔다. 예를 들어, 음료수 잔을 찾는 방문자가 안경 목록을 많이 보게 되는 경우가 그렇다. 여기에서 벡터 임베딩을 문제를 개선하는데 사용할 수 있다. 동의어 기반 검색에 활용하고, 벡터 임베딩을 사용해 관련 목록을 맨 위로 가져올 수 있다.