RAG 입문

RAG 입문

LLM은 방대한 데이터로 학습되지만 여러분의 데이터로 학습되지는 않아요. 검색 증강 생성(Retrieval-Augmented Generation, RAG)은 LLM이 이미 접근할 수 있는 데이터에 여러분의 데이터를 추가해 이 문제를 해결해요. 이 문서 전반에서 RAG를 자주 보게 될 거예요. 쿼리 엔진, 챗 엔진, 에이전트가 작업을 완료하기 위해 RAG를 자주 사용하죠.

RAG에서는 데이터를 로드해 쿼리할 준비를 하거나 '인덱싱'해요. 사용자 쿼리는 인덱스를 대상으로 동작해 데이터를 가장 관련성 높은 컨텍스트로 걸러내요. 이 컨텍스트와 쿼리는 프롬프트와 함께 LLM으로 들어가고, LLM이 응답을 제공해요.

챗봇이나 에이전트를 만들고 있더라도, 데이터를 애플리케이션에 넣기 위한 RAG 기법을 알아두면 좋아요.

RAG 내부의 단계

RAG에는 다섯 가지 핵심 단계가 있고, 이들은 여러분이 만들 대부분의 더 큰 애플리케이션의 일부가 돼요. 그 단계는 다음과 같아요:

  • 로딩 (Loading): 텍스트 파일, PDF, 다른 웹사이트, 데이터베이스, API 등 데이터가 있는 곳에서 워크플로로 데이터를 가져오는 것을 말해요. LlamaHub에 고를 수 있는 수백 개의 커넥터가 있어요.

  • 인덱싱 (Indexing): 데이터를 쿼리할 수 있게 하는 데이터 구조를 만드는 것을 말해요. LLM에서는 거의 항상 데이터의 의미를 수치로 나타낸 vector embeddings(벡터 임베딩)을 만들고, 정확하게 문맥상 관련 데이터를 찾기 쉽게 해주는 수많은 메타데이터 전략을 추가하는 것을 뜻해요.

  • 저장 (Storing): 데이터를 인덱싱했다면 거의 항상 인덱스와 다른 메타데이터를 저장해 재인덱싱하지 않도록 하고 싶어질 거예요.

  • 쿼리 (Querying): 어떤 인덱싱 전략에 대해서도 LLM과 LlamaIndex 데이터 구조를 활용해 쿼리하는 방법은 아주 많아요. 서브쿼리, 다단계 쿼리, 하이브리드 전략을 포함해요.

  • 평가 (Evaluation): 어떤 흐름에서든 다른 전략과 비교해, 또는 변경을 가했을 때 그 효과가 얼마나 좋은지 확인하는 것은 중요한 단계예요. 평가는 쿼리에 대한 응답이 얼마나 정확하고 충실하고 빠른지를 객관적으로 측정해줘요.

RAG 내부의 중요한 개념

각 단계 안의 하위 단계를 가리키는 용어도 여럿 있어요.

로딩 단계

노드와 문서 (Nodes and Documents): Document는 PDF, API 출력, 데이터베이스에서 검색한 데이터 등 어떤 데이터 소스든 둘러싸는 컨테이너예요. Node는 LlamaIndex에서 데이터의 원자 단위이며, 원본 Document의 '청크(chunk)'를 나타내요. 노드는 자신이 속한 문서 및 다른 노드와 연결해 주는 메타데이터를 갖고 있어요.

커넥터 (Connectors): 데이터 커넥터(주로 Reader라고 불러요)는 서로 다른 데이터 소스와 데이터 형식의 데이터를 DocumentNode로 흡수해요.

인덱싱 단계

인덱스 (Indexes): 데이터를 흡수했다면 LlamaIndex가 데이터를 검색하기 쉬운 구조로 인덱싱하는 걸 도와줘요. 보통 vector store라는 특수 데이터베이스에 저장되는 vector embeddings을 생성하는 일이 포함돼요. 인덱스는 데이터에 대한 다양한 메타데이터도 저장할 수 있어요.

임베딩 (Embeddings): LLM은 embeddings라고 하는 데이터의 수치 표현을 생성해요. 관련성별로 데이터를 필터링할 때 LlamaIndex는 쿼리를 임베딩으로 변환하고, 벡터 스토어가 쿼리 임베딩과 수치적으로 유사한 데이터를 찾아줘요.

쿼리 단계

리트리버 (Retrievers): 리트리버는 쿼리가 주어졌을 때 인덱스에서 관련 컨텍스트를 효율적으로 검색하는 방법을 정의해요. 검색 전략은 검색되는 데이터의 관련성과 그 효율성의 핵심이에요.

라우터 (Routers): 라우터는 지식 베이스에서 관련 컨텍스트를 검색하는 데 어떤 리트리버를 쓸지 결정해요. 더 정확히 말하면 RouterRetriever 클래스가 쿼리를 실행할 후보 리트리버 하나 이상을 선택하는 역할을 해요. 각 후보의 메타데이터와 쿼리를 기반으로 최선의 옵션을 고르는 셀렉터를 사용하죠.

노드 포스트프로세서 (Node Postprocessors): 노드 포스트프로세서는 검색된 노드 집합을 받아 변환, 필터링, 재랭킹 로직을 적용해요.

응답 신시사이저 (Response Synthesizers): 응답 신시사이저는 사용자 쿼리와 주어진 검색 텍스트 청크 집합을 사용해 LLM으로부터 응답을 생성해요.

더 알아보기