RAG : 헛소리를 하는 AI 에게

2026. 2. 19. 10:38개발자 생활

반응형

AI 한테 물어봤더니 헛소리를 한다

요즘 ChatGPT 를 비롯해서 AI 를 안 쓰는 사람이 없는 세상이 되었다. 나 역시도 업무에서나 개인적으로나 정말 많이 활용하고 있는데.. 한가지 좀 거슬리는 점이 있다. 바로 AI 가 가끔씩 아주 자신있는 어조로 헛소리를 한다는 점이다. ㅋㅋ

분명 뭔가 그럴듯하게 대답을 해줬는데 자세히 보면 존재하지 않는 라이브러리를 추천해 준다거나, 없는 API 를 만들어낸다거나.. 심지어 링크까지 친절하게 달아놨는데 눌러보면 404가 나온다. 이게 뭐냐 ㅠㅠ

이런 현상을 환각(Hallucination) 이라고 부르는데, AI 업계에서는 이걸 해결하기 위한 다양한 방법들이 연구되고 있다. 그중에서 요즘 가장 핫한 녀석이 바로 오늘의 주인공 RAG 이다.

RAG 가 뭔데?

RAG 는 Retrieval-Augmented Generation 의 약자인데, 한국어로 풀면 "검색 증강 생성" 정도가 되겠다. 이름만 보면 뭔가 대단한 것 같지만 개념은 의외로 심플하다.

쉽게 비유하자면 이런 거다.

시험을 볼 때 오픈북으로 보는 것과 비슷하다.

일반 LLM = 머리에 외운 것만으로 시험 보기 (가끔 기억이 왜곡됨)

RAG = 교과서 펼쳐놓고 찾아보면서 시험 보기 (정확도 UP)

기존의 LLM(대규모 언어 모델) 은 학습할 때 집어넣은 데이터만 가지고 대답을 한다. 그래서 학습 이후에 나온 새로운 정보는 모르고, 학습 데이터가 부정확하면 거기서 환각이 발생한다.

반면에 RAG 는 대답하기 전에 먼저 관련 자료를 검색한다. 그리고 그 검색 결과를 참고해서 대답을 만들어 낸다. 교과서 보고 답 쓰는 거니까 당연히 헛소리 할 확률이 줄어드는 것이다.

RAG 는 어떻게 동작하는 걸까?

RAG 의 동작 과정은 크게 3단계로 나눌 수 있다.

1단계 : 문서 준비 (Indexing)

먼저 AI 가 참고할 문서들을 준비한다. 회사 내부 문서라던가, 기술 문서라던가, 매뉴얼 같은 것들을 쪼개서 벡터(숫자 형태의 표현) 로 변환한 뒤 벡터 데이터베이스에 저장해 둔다. 일종의 도서관을 만드는 작업이라고 보면 된다.

2단계 : 검색 (Retrieval)

사용자가 질문을 던지면 그 질문과 관련 있는 문서를 벡터 DB 에서 찾아온다. "이 질문이랑 가장 비슷한 내용을 가진 문서가 뭐지?" 하고 유사도를 계산해서 상위 몇 개를 뽑아내는 것이다.

3단계 : 생성 (Generation)

검색된 문서 조각들을 LLM 에게 같이 건네주면서 "이 자료를 참고해서 대답해줘" 라고 요청한다. 그러면 LLM 은 자기 머리에서 쥐어짜는 게 아니라 실제 문서를 근거로 대답을 생성한다.

정리하자면 이런 흐름이다.

사용자 질문
    ↓
[검색] 벡터 DB에서 관련 문서 찾기
    ↓
[결합] 질문 + 검색된 문서를 합쳐서 프롬프트 구성
    ↓
[생성] LLM이 참고 자료 기반으로 답변 생성
    ↓
답변 (+ 출처 표시 가능!)

그래서 뭐가 좋은 건데?

RAG 의 장점은 꽤 명확하다.

환각이 확 줄어든다. 연구에 따르면 RAG 를 적용하면 환각 발생률이 최대 70% 까지 감소한다고 한다. 실제 문서를 기반으로 답변하니까 당연한 결과다.

항상 최신 정보를 반영할 수 있다. 모델을 다시 학습시킬 필요 없이 참고 문서만 업데이트하면 된다. 새 제품이 나왔다? 문서만 추가하면 끝이다. 핵편리..

출처를 알 수 있다. "이 답변은 어떤 문서를 근거로 한 건지" 를 보여줄 수 있다. 그냥 LLM 한테 물어보면 어디서 그런 답을 가져왔는지 알 길이 없는데, RAG 는 참고한 문서를 같이 보여줄 수 있으니 신뢰도가 올라간다.

비용이 저렴하다. Fine-tuning (미세 조정) 이라는 방법도 있는데, 이건 모델 자체를 다시 학습시키는 거라 GPU 도 많이 필요하고 시간도 오래 걸린다. RAG 는 검색 시스템만 붙이면 되니까 훨씬 가볍다.

잠깐, Fine-tuning 이랑 뭐가 다른 거야?

RAG 이야기 하다 보면 빠지지 않고 나오는 비교 대상이 Fine-tuning 이다. 둘 다 LLM 을 더 똑똑하게 만드는 방법인데 접근 방식이 완전 다르다.

항목 RAG Fine-tuning
방식 외부 자료를 검색해서 참고 모델 자체를 재학습
비유 오픈북 시험 벼락치기로 다시 공부
도입 비용 낮음 높음 (GPU, 전문 인력)
도입 기간 수일 ~ 수주 수주 ~ 수개월
최신 정보 문서 업데이트로 즉시 반영 재학습 필요
출처 표시 가능 불가능
응답 속도 검색 과정 때문에 다소 느림 빠름

대부분의 경우에는 RAG 가 훨씬 실용적이다. 특히 회사에서 내부 문서를 기반으로 AI 챗봇을 만들고 싶다거나, 최신 정보를 반영해야 하는 서비스라면 RAG 가 거의 정답이라고 볼 수 있다. 다만 아주 특정한 분야에서 전문적인 어조나 스타일까지 맞춰야 한다면 Fine-tuning 이 더 나을 수 있다.

RAG 를 실제로 쓰려면?

개념은 알겠는데 실제로 구현하려면 뭘 알아야 하는지 궁금할 수 있다. 아주 간단하게 필요한 것들을 정리해 보면 이렇다.

1. 벡터 데이터베이스 — 문서를 벡터로 저장하고 유사도 검색을 수행할 DB 가 필요하다. Pinecone, Chroma, Weaviate, pgvector 같은 선택지가 있다.

2. 임베딩 모델 — 문서와 질문을 벡터로 변환해주는 모델이다. OpenAI 의 text-embedding 모델이라거나 오픈소스로는 sentence-transformers 같은 것들이 있다.

3. LLM — 답변을 생성할 언어 모델이다. GPT, Claude, Gemini 같은 상용 모델이나 Llama 같은 오픈소스 모델을 쓸 수 있다.

4. 오케스트레이션 프레임워크 — 위의 것들을 하나로 엮어주는 프레임워크다. LangChain 이나 LlamaIndex 가 대표적이다.

Python 코드로 아주 간단하게 보여주면 이런 느낌이다.

# LangChain 을 사용한 간단한 RAG 예시
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

# 1. 문서 로드 & 쪼개기
loader = TextLoader("my_document.txt")
docs = loader.load()
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)

# 2. 벡터 DB에 저장
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)

# 3. RAG 체인 구성
llm = ChatOpenAI(model_name="gpt-4")
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever()
)

# 4. 질문하기
answer = qa_chain.run("RAG 의 장점이 뭐야?")
print(answer)

보다시피 코드 자체는 그렇게 어렵지 않다. 물론 실제 프로덕션에서 쓰려면 청크 사이즈 튜닝이라던가, 검색 정확도 개선이라던가 신경 쓸 게 많지만.. 기본 뼈대는 이 정도면 충분하다.

마무리

정리하자면 RAG 는 LLM 한테 커닝 페이퍼를 쥐어주는 기술이다. 머리에서 쥐어짜는 것보다 자료를 보고 답하는 게 정확한 건 사람이나 AI 나 마찬가지인 것 같다. ㅋㅋ

요즘 AI 관련 서비스를 만들거나 도입하려는 곳이라면 RAG 는 거의 필수적으로 알아야 할 개념이 된 것 같고, 개발자 입장에서도 LangChain 같은 프레임워크 덕분에 구현 난이도가 많이 낮아진 편이니 한번 직접 만들어 보는 것도 재밌을 것 같다.

다음에는 실제로 RAG 를 구현해보는 실습 편을 한번 작성해 볼까 싶다. 그때까지 화이팅!

반응형