LLM이 답하기 전에 외부 문서나 DB에서 관련 내용을 찾아 프롬프트에 넣어 주는 기술로, 모델에게 오픈북 시험을 보게 하는 방식이다. 바뀐 사내 규정이나 회사 DB에만 있는 정보처럼 모델이 배우지 못한 내용을 근거와 함께 답하게 하고, 지어내는 답(환각)을 줄이고 싶을 때 쓴다.
| 항목 | RAG | 파인튜닝 |
|---|---|---|
| 정보가 바뀌면 | 문서만 갈아 끼움 | 다시 학습 |
| 답의 출처 | 링크로 보여 줌 | 남지 않음 |
| 지식을 넣을 때 | 보통 먼저 고름 | 나중에 검토 |
만드는 과정은 두 단계다. 미리 문서를 작은 조각으로 쪼개(청킹) 의미를 담은 숫자 벡터로 바꾼 뒤(임베딩) 벡터 DB에 저장해 둔다. 질문이 오면 질문도 벡터로 바꾸고, 의미가 가까운 조각을 찾아 LLM에 넘긴다.
LangChain, LlamaIndex 같은 프레임워크를 쓰면 시제품은 하루면 만든다. 벡터 DB를 새로 들이기 어렵다면 쓰고 있는 PostgreSQL에 pgvector 확장을 얹는 방법도 있다. 진짜 일은 그다음, 검색이 엉뚱한 조각을 가져오는 문제를 줄이는 데서 시작한다.
벡터 검색은 "환불 정책"과 "반품 규정"이 비슷한 말이라는 건 알지만, 에러 코드나 제품명을 정확히 찾는 데는 약하다. 그래서 실제로는 아래 장치를 겹쳐 쓴다.
| 장치 | 하는 일 | 이럴 때 쓴다 |
|---|---|---|
| 하이브리드 검색 | 키워드 검색(BM25)과 벡터 검색 결과를 합침 | 기본으로 켠다 |
| 리랭커 | 찾은 후보를 관련도 순으로 다시 줄 세움 | 상위 결과가 자꾸 빗나갈 때 |
| 쿼리 재작성 | LLM이 검색어를 먼저 고쳐 씀 | 질문이 검색하기 나쁜 모양일 때 |
고치기 전에 먼저 재야 한다. 대표 질문 수십 개마다 정답 문서를 짝지어 두고, 검색이 그 문서를 찾아오는지와 답이 찾은 근거를 잘 따르는지를 따로 잰다. 이렇게 나눠 봐야 검색과 생성 중 어디를 고칠지 보인다. RAGAS 같은 도구가 이 측정을 도와준다.
컨텍스트가 100만 토큰까지 늘었지만 RAG가 필요 없어진 건 아니다. 규모와 조건에 따라 고르면 된다.
| 상황 | 추천 | 이유 |
|---|---|---|
| 문서 몇 개 | 통째로 넣기 | 그쪽이 더 낫다 |
| 수십만 건의 문서 | RAG | 다 넣을 수 없고 토큰 비용이 든다 |
| 문서마다 볼 수 있는 사람이 다름 | RAG | 검색할 때 권한별로 걸러야 한다 |
컨텍스트가 길수록 중간 내용을 놓치기도 한다. 그래서 검색으로 후보를 추린 뒤 넉넉해진 컨텍스트에 여유 있게 담는 조합이 실무 방식이다.
요즘은 한 번 검색하고 끝나는 고정된 흐름 대신, 에이전트가 검색을 도구로 쥐고 필요할 때마다 부르는 Agentic RAG로 가고 있다. 결과가 부실하면 검색어를 바꿔 다시 찾고, 두 제품을 비교하는 질문이면 각각 따로 찾아 합친다. 개체 사이 관계를 따라 찾는 Graph RAG도 같은 흐름이다.
Claude Code가 grep과 파일 읽기를 반복하며 필요한 코드를 스스로 모으는 것도 같은 원리다. 미리 만들어 둔 색인 없이 검색을 반복하는 것만으로 RAG가 하던 일을 해낸다.
가장 많이 쓰는 방식은 사내 문서에 묻고 답하는 챗봇이다. 규정·매뉴얼·위키를 색인해 두고, 답마다 근거 문서 링크를 달아 직접 확인할 수 있게 한다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| 사내 문서 검색 | 규정·매뉴얼·위키를 색인해 두고, 권한에 맞는 문서만 찾아 출처 링크와 함께 답한다 |
| 고객 지원 챗봇 | 도움말 문서와 FAQ에서 관련 내용을 찾아 답변 초안을 만들고, 문서가 바뀌면 색인만 갱신한다 |
| 웹 검색이 붙은 AI 답변 | 질문마다 웹을 검색해 최신 결과를 근거로 답하고 출처를 함께 보여 준다 |
| 코딩 에이전트 | 코드베이스를 검색·읽기 도구로 반복해서 뒤져 필요한 파일만 모아 작업한다 |