RAG는 작동한다 — 롱테일에 도달할 때까지
Source: Dev.to
ChatGPT나 유사한 대형 언어 모델을 매일 사용한다면, 아마도 이들에 대한 어느 정도의 신뢰를 갖게 되었을 것입니다. 이들은 표현력이 뛰어나고, 빠르며, 종종 놀라울 정도로 능숙합니다. 많은 엔지니어들이 이미 코딩 지원, 문서 작성, 혹은 아키텍처 브레인스토밍에 이들을 활용하고 있습니다.
그럼에도 불구하고, 조만간 벽에 부딪히게 됩니다.
일상 업무에서 실제로 중요한 질문—내부적인 것이거나, 최신 정보이거나, 매우 구체적인 것—을 물으면 모델이 갑자기 모호하거나, 틀리거나, 자신 있게 잘못된 답을 내놓습니다. 이는 프롬프트 문제 아닙니다. 구조적인 한계입니다.
이 글에서는 왜 이런 현상이 발생하는지, 현재 솔루션이 문제를 부분적으로만 해결하는 이유, 그리고 지식을 모델 가중치에 직접 학습시키는 것이 미래의 핵심 요소가 될 가능성이 높은 이유를 탐구합니다.
실제 문제는 지식 컷오프가 아니다
지식 컷오프는 LLM의 가장 눈에 띄는 제한 사항입니다. 모델은 특정 시점까지의 데이터로 학습되며, 그 이후에 일어나는 일은 모델에게 존재하지 않습니다.
실제로는 이것이 가장 고통스러운 문제인 경우는 드뭅니다. 웹 검색, API, 도구 등을 통해 이를 완화할 수 있습니다.
보다 근본적인 문제는 지식의 롱테일입니다.
실제 운영 환경에서는 가장 가치 있는 질문이 잘 문서화된 공개 사실에 관한 경우는 거의 없습니다. 질문은 내부 시스템, 문서화되지 않은 결정, 독점적인 프로세스, 그리고 공개 인터넷 어디에도 존재하지 않는 도메인‑특화 관행에 관한 것입니다.
예시
- 왜 겉보기에 무관한 변경 이후에 이 서비스가 실패하기 시작했나요?
- 이 아키텍처적 트레이드오프가 이미 내부에서 논의된 적이 있나요?
- 우리 회사는 특정 규제 제약을 어떻게 해석하나요?
이러한 질문들은 롱테일에 속하며, 바로 그곳이 대형 기반 모델이 가장 성능이 떨어지는 영역입니다.
언어 모델에 지식을 제공하는 세 가지 방법
툴링 세부 사항을 제외하면, 언어 모델에게 새로운 것을 “알게” 만드는 근본적인 방법은 오직 세 가지뿐입니다.
- 지식을 직접 프롬프트에 넣는다.
- 추론 시점에 관련 정보를 검색한다.
- 지식을 모델 자체에 학습시킨다.
오늘날 대부분의 시스템은 거의 전적으로 첫 번째와 두 번째 방법에 의존합니다.
전체 맥락: 단순하지만 비용이 많이 들고 취약함
가장 순진한 해결책은 모든 것을 프롬프트에 넣는 것입니다.
prompt = f"""
You are an assistant with access to our internal documentation.
{internal_docs}
Question:
Why does service X fail under load?
"""
작은 문서의 경우, 이것은 작동합니다. 구현이 쉽고 추가 인프라가 필요하지 않습니다.
하지만 컨텍스트가 커짐에 따라 여러 문제가 한 번에 나타납니다:
- 토큰 비용이 선형적으로 증가합니다.
- 지연 시간이 크게 증가합니다.
- 관련성이 낮은 정보가 추가될수록 추론 품질이 저하됩니다.
이는 구현상의 문제가 아니라 트랜스포머 모델이 작동하는 방식의 결과입니다.
트랜스포머 병목 현상과 컨텍스트 악화
트랜스포머는 모든 토큰이 다른 모든 토큰을 바라보는 셀프‑어텐션에 의존합니다. 이는 입력 길이에 대해 이차 복잡도를 초래합니다.
현대 모델들은 기술적으로 매우 큰 컨텍스트 윈도우를 받아들일 수 있지만, 다음 사이에는 중요한 차이가 있습니다:
- 긴 입력에서도 크래시가 나지 않는 것, 그리고
- 긴 입력에 대해 잘 추론하는 것.
경험적으로, 관련 정보가 동일하게 유지되더라도 컨텍스트가 커질수록 성능이 저하됩니다. 모델은 여전히 유창한 텍스트를 생성하지만, 올바른 정보를 연결하는 능력은 점점 약해집니다. 이 현상은 흔히 컨텍스트 로트(context rot) 라고 불립니다.
따라서 단순히 컨텍스트 윈도우를 늘리는 것은 장기적인 해결책이 될 수 없습니다.
RAG: 임베딩을 통한 외부 메모리
프롬프트에 모든 내용을 넣는 것을 피하기 위해, 업계는 Retrieval‑Augmented Generation (RAG) 으로 합의했습니다.
이 방법은 문서를 외부에 저장하고, 임베딩을 사용해 가장 관련성이 높은 문서를 검색한 뒤, 그 문서들만 프롬프트에 삽입하는 것입니다.
간단한 파이썬 예시는 다음과 같습니다:
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vector_store = Chroma.from_documents(
documents=docs,
embedding=embeddings
)
results = vector_store.similarity_search(
query="Why does the CI pipeline fail?",
k=5
)
RAG는 유연하고 비교적 비용이 저렴하며 배포가 쉬워 인기가 많습니다. 오늘날 LLM 기반 시스템에 메모리를 추가하는 기본 솔루션으로 자리 잡고 있습니다.
RAG가 근본적으로 제한되는 이유
- Retrieval ≠ reasoning – 몇 개의 관련 청크를 선택한다고 해서 모델이 이를 올바르게 결합할 수 있다는 보장은 없습니다. 특히 답변이 암시적 관계나 문서 간 다단계 추론에 의존할 때 그렇습니다.
- Static similarity – 임베딩은 하나의 전역적인 유사성 개념만을 인코딩하며, 지역 도메인 의미론에 적응하지 못합니다. 절대로 혼동돼서는 안 되는 문서들이 벡터 공간에서 서로 가깝게 배치되는 경우가 종종 발생합니다.
- Security concerns – 임베딩은 본질적으로 보안이 보장되지 않으며, 충분한 노력만 가하면 원본 텍스트의 큰 부분을 복원할 수 있습니다. 따라서 벡터 데이터베이스는 프라이버시를 보호하는 추상화 수단으로 적합하지 않을 수 있습니다.
이러한 제한점들은 RAG가 강력하지만 완전하지 않다는 점을 시사합니다.
순진한 파인튜닝 함정
이 시점에서 모델을 내부 데이터에 직접 파인튜닝하는 것이 유혹적일 수 있습니다.
실제로 순진한 파인튜닝은 거의 항상 실패합니다. 작은 특수 데이터셋에 직접 학습시키면 모델이 overfit 되고, 일반적인 추론 능력을 잃으며, 이전에 학습한 지식을 잊어버리는 catastrophic forgetting 현상이 발생합니다.
그 결과 모델은 기억은 하지만 이해하지 못하게 됩니다.
누락된 연결 고리로서의 합성 데이터
핵심 통찰은 원시 텍스트를 제공하는 대신 문서에 담긴 지식을 포착하는 합성 작업을 생성하는 것입니다.
합성 지식 생성
원시 문서에 대해 학습하는 대신, 해당 문서에 포함된 지식을 설명하는 크고 다양한 작업 집합을 생성합니다. 여기에는 질문‑답변 쌍, 설명, 패러프레이즈, 반사실 등이 포함될 수 있습니다.
Python의 간단한 예시:
def generate_qa(doc):
return {
"instruction": f"Explain the key idea behind: {doc.title}",
"response": doc.summary
}
synthetic_dataset = [generate_qa(doc) for doc in internal_docs]
이 접근 방식은 표면 텍스트가 아니라 도메인을 가르칩니다. 원본 데이터셋이 작더라도 합성 데이터가 충분히 다양하면 효과가 있다는 점이 놀랍습니다.
모델을 파괴하지 않고 가중치로 훈련하기
현대 시스템은 파라미터 효율적인 파인튜닝을 사용해 재앙적 망각을 방지합니다: 모든 가중치를 업데이트하는 대신, 작은 목표 하위 집합만을 수정합니다.
저랭크 적응 (LoRA)
LoRA는 선택된 레이어에 저랭크 행렬을 삽입하여 모델이 최소한의 변화로 적응하도록 합니다.
from peft import LoraConfig
lora_config = LoraConfig(
r=8, # 저랭크 행렬의 랭크
lora_alpha=16, # 스케일링 팩터
target_modules=["q_proj", "v_proj"] # 적응할 레이어
)
핵심 아이디어: 모델의 기존 지식을 덮어쓰지 않으면서 작은, 국부적인 업데이트로 모델을 조정합니다.
기타 파라미터 효율적 기법
- 프리픽스 튜닝 – 입력 시퀀스 앞에 학습 가능한 토큰을 추가합니다.
- 메모리 레이어 – 작업‑특정 정보를 저장하는 외부 메모리 모듈을 추가합니다.
이 모든 방법은 동일한 원칙을 공유합니다: 대부분의 사전 학습된 가중치는 그대로 유지하고, 가벼운 새로운 파라미터 집합만 학습하여 적응성과 안정성 사이의 균형을 맞춥니다.
하이브리드 미래: 컨텍스트, 검색, 그리고 가중치
이 기술들 중 어느 하나도 다른 것을 완전히 대체하지 않는다. 가장 효과적인 시스템은 세 가지를 모두 결합한다:
- 컨텍스트 – 즉각적인 지시사항에 유용하다.
- 검색 – 최신이거나 자주 변하는 데이터에 필수적이다.
- 가중치에 학습 – 검색만으로는 달성할 수 없는 깊고 일관된 도메인 이해를 제공한다.
앞으로의 핵심 설계 질문은 모델을 개인 지식으로 학습시킬지 여부가 아니라, 어떤 지식이 가중치에 저장되어야 하고 추론 시에 처리되어야 하는가이다.
Conclusion
RAG는 실용적이고 강력한 솔루션이며, LLM 생태계의 일부로 남을 것입니다. 그러나 전문 지식에 대한 깊은 추론이 필요할 때는 근본적으로 제한됩니다.
훈련 기술이 더 효율적으로 발전함에 따라, 지식을 가중치에 학습시키는 것이 더 이상 연구 호기심이 아니라 엔지니어링 결정이 될 것입니다.
장기적으로 가장 가치 있는 LLM 시스템은 사용되는 기본 모델에 의해 정의되는 것이 아니라 그들에게 가르친 내용과 그 가르침이 얼마나 신중하게 이루어졌는가에 의해 정의될 것입니다.