이 문서를 통해 아래 질문들에 답할 수 있게 됩니다.
- RAG는 어떤 단계로 동작하는가?
- RAG와 fine-tuning은 어떤 문제에서 다르게 쓰이는가?
- 백엔드 서비스에서 RAG 경계는 어디에 두어야 하는가?
개요
RAG는 Retrieval-Augmented Generation의 약자다. 사용자의 질문에 답하기 전에 외부 문서나 데이터를 검색하고, 그 결과를 모델 context에 넣어 답변을 생성한다.
LLM의 사전 지식에 없는 사내 문서, 최신 정책, 고객별 데이터에 답해야 할 때 RAG가 중요하다.
전체 흐름
User Question
query rewrite
retrieval
metadata filter
reranking
context assembly
generation
source citation각 단계가 별도 실패 지점이다.
RAG와 Fine-tuning
RAG:
- 최신 문서와 사내 지식 주입에 좋다.
- source를 추적할 수 있다.
- 데이터 변경에 빠르게 대응할 수 있다.
Fine-tuning:
- 특정 형식, 톤, 작업 패턴에 적응시키는 데 유용하다.
- 지식 업데이트 용도로는 관리가 어려울 수 있다.
- 충분한 품질 데이터가 필요하다.
둘은 경쟁이라기보다 목적이 다르다.
백엔드 설계 경계
RAG는 다음 경계를 가진다.
- indexing service
- retrieval service
- permission service
- context builder
- LLM generation client
- answer validator
- trace recorder
Controller에서 한 번에 처리하면 디버깅이 어렵다. 검색과 생성은 분리해 관측한다.
코드로 이해하기
RAG pipeline을 단계별로 표현한다.
def answer_question(user, question):
rewritten = query_rewriter.rewrite(question)
candidates = retriever.search(
query=rewritten,
tenant_id=user.tenant_id,
)
authorized = permission_filter.apply(user, candidates)
ranked = reranker.rank(question, authorized)
context = context_builder.build(ranked, token_budget=4000)
answer = llm.generate(prompt=prompt.render(context, question))
return answer_validator.validate(answer)각 변수는 trace에 남길 수 있어야 한다.
장애 상황과 대응
RAG 답변이 틀리면 먼저 나눈다.
- retrieval 결과가 틀렸는가?
- retrieval은 맞지만 context 조립이 틀렸는가?
- context는 맞지만 모델이 잘못 답했는가?
- source 표시는 맞는가?
이 분리 없이 prompt만 고치면 회귀가 생기기 쉽다.
인프라 협업 포인트
RAG는 vector DB, embedding worker, document parser, storage, queue가 필요할 수 있다. 인프라팀과 online query와 batch indexing의 리소스를 분리하는 것이 중요하다.
실전 팁
- RAG 답변에는 source를 남긴다.
- 검색 결과가 없으면 모델이 추측하지 않게 한다.
- query rewrite는 유용하지만 원래 질문 의도를 바꿀 수 있으므로 eval한다.
- reranker는 품질을 높일 수 있지만 latency와 비용을 추가한다.
위험 신호!
- RAG pipeline trace가 없다.
- retrieval과 generation을 분리해 평가하지 않는다.
- source 없는 답변을 사용자에게 제공한다.
- 권한 필터가 prompt에만 있다.
확인 질문
확인 질문
- RAG와 fine-tuning의 차이는 무엇인가?
- RAG는 외부 지식을 검색해 context로 넣는 방식이고, fine-tuning은 모델의 행동이나 패턴을 학습시키는 방식이다.
- RAG pipeline을 단계별로 나누는 이유는 무엇인가?
- 장애와 품질 문제의 원인을 검색, context, 생성 중 어디인지 구분하기 위해서다.
Spring AI 적용 연결
- Spring AI에서 RAG를 구현할 때는 ingestion, retrieval, generation을 분리해 실패 지점을 볼 수 있어야 한다. 기본 구현 흐름은 09. Embedding VectorStore RAG ETL 설계에서 이어진다.
- 전체 기능을 고객지원 서비스로 연결하는 예시는 13. 고객지원 RAG Capstone을 함께 본다.