이 문서를 통해 아래 질문들에 답할 수 있게 됩니다.

  • 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 적용 연결

참고 문서