1. 데이터 준비 4단계
1.1 문서 불러오기
마치 학생이 시험 준비를 위해 교과서, 노트, 참고서 등 필요한 자료들을 내가 보기 편한 형식으로 통일하여 필기하는 것처럼, RAG도 PDF, 웹페이지, 문서 파일 등 다양한 형태의 자료들을 AI가 이해하기 쉽도록 하나의 자료 형태로 변환합니다.
1.2 문서 분할하기
많은 학습 자료를 구분 없이 한 번에 필기하면 읽기가 어렵고, 원하는 정보를 빨리 찾기가 힘듭니다. 그래서 학생들은 주제나 챕터별로 나누어서 필기를 하게 됩니다. RAG도 마찬가지예요! 긴 문서를 적당한 크기로 나누어서 필요할 때 쉽게 찾아볼 수 있게 준비합니다.
1.3 문서 임베딩하기
텍스트를 컴퓨터가 이해할 수 있는 벡터로 변환하는 과정입니다. 친구한테 학습 교재를 설명한다고 가정해 보겠습니다. 우리는 "이 책은 문제는 적지만, 개념 설명이 자세하며 이해하기 쉽게 되어있다"라는 설명을 들으면 바로 이해할 수 있지만, 컴퓨터는 이런 텍스트를 직접 이해할 수 없습니다. 그래서 텍스트의 특징을 숫자로 된 벡터로 변환하여 컴퓨터가 처리할 수 있게 만드는 과정이 필요합니다. 바로 이 과정이 임베딩 과정입니다. 이렇게 변환된 숫자 데이터를 통해 컴퓨터는 텍스트의 의미와 특징을 파악할 수 있게 됩니다.
1.4 벡터 스토어에 저장하기
오픈북 시험을 볼 때 학습 자료들이 한 곳에 주제별로 깔끔하게 정리되어 있으면 필요한 정보를 더 빨리 찾을 수 있습니다. RAG 는 지금까지 준비한 모든 자료를 '벡터 스토어'라는 특별한 저장소에 잘 정리해 둡니다. 이 저장소를 사용하면 관련된 자료가 있는 곳을 빠르게 찾아낼 수 있습니다.
2. 문서 불러오기 - Document Loaders
앞서 배운 데이터 준비 4단계에서 1단계인 문서 불러오기에 대해 알아보겠습니다.
스마트폰을 생각해 보면 사진을 찍으면 갤러리에서 볼 수 있고, 음성메모를 녹음하면 플레이어로 들을 수 있습니다. 하지만 다른 앱에서는 이 파일들을 바로 사용하기 어려울 수 있습니다.
RAG 시스템도 비슷합니다. PDF에는 표, 이미지, 글자 크기, 폰트 등 복잡한 정보가 있고, 웹페이지에는 HTML 태그가 워드 파일에는 서식이 있기 때문에 바로 사용하기가 힘듭니다. 따라서, 이런 다양한 형식의 문서들을 RAG가 이해할 수 있는 형식으로 변환해 주는 단계가 필요합니다. LangChain의 Document Loaders는 이 작업을 도와주는 역할을 합니다.
2.1 Document Loaders의 개념
Document Loaders는 다양한 형식의 문서를 AI 모델이 처리 가능한 형태로 변환하는 LangChain의 핵심 구성 요소 입니다.
PDF, 워드 문서, 웹페이지, 엑셀 파일 등 우리가 일상적으로 사용하는 다양한 형식의 파일들이 있는데, AI는 이런 파일 들을 바로 읽을 수 없습니다. Document Loaders는 이 파일들을 AI가 읽을 수 있도록 변환 해주는 도구입니다. PDF 속 글 자들, 워드 문서의 내용, 웹페이지의 기사들을 AI가 이해할 수 있는 문서 형태로 변환해 줍니다. 게다가 LangChain은 80가지가 넘는 다양한 종류의 Document Loaders를 제공하고 있어서, 거의 모든 종류의 파일을 처리할 수 있습니다. 정보 검색, 데이터 준비, 전처리와 같은 작업에서 중요한 역할을 하며, AI 모델이 다양한 형식의 데이터를 효율적으로 처리할 수 있도록 돕는 강력한 도구입니다.
2.2 LangChain의 주요 Document Loaders
1) 텍스트 파일 Loader
- TextLoader
- DirectoryLoader
2) PDF Loader
- PyPDFLoader
- PDFPlumberLoader
3) 웹 페이지 Loader
- WebBaseLoader
- SeleniumURLLoader
3. 문서 분할하기 - Text Splitters
이번엔 문서를 효율적으로 관리하기 위해 문서를 분할하는 단계에 대해 알아보겠습니다.
책 한 권을 챕터나 문단으로 나누는 것처럼, 문서도 적당한 크기로 나누면 효율적으로 접근할 수 있습니다.
예를 들어, 여러 페이지로 작성된 논문이 있다면 이걸 한 번에 처리하기보다는 각 섹션이나 단락 단위로 나누면 읽기도 편하고 필요한 부분을 찾기가 편리할 것입니다. 따라서, 이런 문서들을 AI가 이해하기 쉽도록 나눠주는 단계가 필요한데, LangChain의 Text Splitters가 이 작업을 도와줍니다.
3.1. Text Splitters의 개념
Text Splitters는 긴 문서를 더 작은 단위의 청크(chunk)로 분할하는 컴포넌트입니다. 마치 긴 소설을 챕터로 나누는 것처럼, 긴 문서를 AI가 이해하기 좋은 크기로 잘라주는 도구입니다.
예를 들어, 500페이지 분량의 PDF 문서가 있다고 할 때, 이 전체 문서를 한 번에 AI 모델에게 입력하기는 어렵습니다. AI 모델은 한 번에 처리할 수 있는 텍스트의 길이에 제한이 있기 때문입니다.
이러한 제약을 해결하기 위해 Text Splitters는 긴 문서를 더 작은 단위로 나눕니다. 마치 두꺼운 책을 챕터나 문단으로 나누는 것처럼, AI도 더 효과적으로 정보를 처리할 수 있도록 텍스트를 적절한 크기로 분할하는 것입니다.
여기서 중요한 점은 단순히 기계적으로 텍스트를 자르는 것이 아니라는 것입니다. 한 문장의 중간을 임의로 잘라버 리면 그 의미가 훼손될 수 있기 때문에 문장이나 문단의 경계를 고려하여 의미가 자연스럽게 이어지도록 분할해야 합니다.
또한 각 청크는 독립적으로도 의미가 있어야 하면서, 동시에 전체 문맥을 유지할 수 있어야 합니다. 예를 들어, 어떤 개념에 대한 설명이 있다면, 그 설명이 하나의 청크 안에 완결되게 들어가는 것이 좋습니다. 이렇게 해야 나중에 AI가 질문에 답변할 때 정확한 정보를 제공할 수 있습니다.
RAG 시스템에서 이러한 Text Splitting 작업의 품질은 전체 시스템의 성능에 큰 영향을 미칩니다. 너무 작게 자르면 문맥이 손실될 수 있고, 너무 크게 자르면 AI가 처리하기 어려울 수 있으므로, AI 모델이 처리하기 적합한 크기이면서 원본 문서의 주요 정보가 유지될 수 있는 단위로 분할하는 것이 중요합니다.
3.2 Text Splitters의 필요성
1) LLM의 컨텍스트 길이 제한
LLM 모델들은 처리할 수 있는 최대 토큰 수가 제한되어 있습니다. 예를 들어 GPT-4는 약 32K 토큰을, GPT-3.5는 약 4K 토큰을 처리할 수 있는데, 만약 500페이지 분량의 법률 문서나 기술 매뉴얼이 있다면 이를 한 번에 처리하기는 힘듭니다. 따라서 모델이 처리할 수 있 는 적절한 크기로 문서를 나누는 것이 필수적입니다.
2) 검색 효율성
Text Splitters를 통해 문서를 작은 청크로 나누면 사용자의 질문과 가장 관련성 높은 부분을 효율적으로 찾아낼 수 있습니다.
도서관에서 책을 찾을 때를 생각해보겠습니다. 책의 목차나 색인을 보면 원하는 내용이 있는 페이지를 쉽게 찾을 수 있습니다. Text Splitters로 문서를 나누면 AI도 이렇게 원하는 정보를 더 쉽게 찾을 수 있습니다. 예를 들어, "제품의 보증기간은 얼마인가요?"라는 질문이 있을 때, 전체 매뉴얼에서 검색하는 것보다 작은 청크로 나누어진 문서에서 검색하는 것이 더 정확한 답을 찾을 수 있습니다.
3) 비용 최적화
LLM 사용 시 일반적으로 입력 토큰당 비용이 발생하는데, Text Splitters를 통해 꼭 필요한 부분만 모델에 전달함으로써 비용을 크게 절감할 수 있습니다. 사용자의 질문과 관련된 청크만 모델에 전달하면 되므로, 전체 문서를 처리할 때보다 훨씬 적은 비용으로 정확한 답변을 얻을 수 있습니다.
3.3 LangChain Text Splitters
1) 문자 기반 Splitter
- CharacterTextSplitter
- RecursiveCharacter TextSplitter
2) 토큰 기반 Splitter
- TokenTextSplitter
- Sentence Transformers TokenTextSplitter
4. 임베딩과 벡터 스토어 - Embeddings & Vector Stores
마지막으로, 문서의 내용을 컴퓨터의 언어로 번역하고 저장하는 단계를 알아보겠습니다.
먼저, 컴퓨터가 이해하기 쉽도록 각 문서의 의미를 숫자로 변환하는 임베딩 작업을 수행합니다.
예를 들어 "미 강아지 너무 귀여워요"와 "너무 귀여운 강아지네요 "처럼 비슷한 의미를 가진 문장들은 비슷한 숫자들로 변환됩니다.
이렇게 변환된 문서들은 벡터 스토어라는 특별한 저장소에 보관됩니다. 벡터 스토어는 마치 도서관의 서가처럼 문서들을 잘 정리해 두어서, 나중에 질문이 들어왔을 때 관련된 내용을 빠르게 찾아낼 수 있습니다.
이제 RAG의 핵심 역할을 하는 임베딩과 벡터 스토어에 대해 자세하게 살펴보겠습니다.
4.1. 텍스트 임베딩(Text Embeddings)의 개념
텍스트 임베딩의 기본 개념은 텍스트를 컴퓨터가 이해하고 처리할 수 있는 숫자 벡터로 변환하는 과정입니다.
우리가 색깔을 설명할 때 RGB 값을 사용하는 것처럼, AI는 텍스트를 이해하기 위해 문장을 숫자들로 바꿉니다. 예를 들어 "나는 강아지를 좋아해"라는 문장을 [0.2, -0.5, 0.8, ...] 같은 숫자들의 모음으로 바꾸는 것 입니다.
재미있는 점은 "나는 멍멍이를 사랑해"처럼 비슷한 뜻을 가진 문장은 비슷한 숫자 패턴을 갖게 된다는 것입니다. 그래서 AI는 다르게 표현된 문장이라도 의미가 비슷하다면 금방 찾아낼 수 있습니다.
또한, 이렇게 변환된 숫자 벡터들은 원래 텍스트의 의미적 특성을 보존합니다. 단순히 단어를 숫자로 치환하는 것이 아니라, 문맥과 의미를 고려한 변환이 이루어져 여러 의미를 가진 "사과"라는 단어가 어떤 의미로 쓰였는지에 따라 다른 벡터 값을 가질 수 있습니다.
임베딩의 가장 큰 장점은 텍스트 간의 유사도를 수학적으로 계산할 수 있다는 것입니다. 두 텍스트의 임베딩 벡터 간 유사도를 계산하면, 그 텍스트들이 얼마나 의미적으로 비슷한지를 수치화할 수 있습니다. 이는 RAG 시스템에서 사용자의 질문 과 가장 관련성 높은 문서를 찾을 때 핵심적인 역할을 합니다.
4.2. 텍스트 임베딩이 필요한 이유
1) 비슷한 의미 찾기
텍스트를 임베딩 벡터로 변환하면 의미적 유사성을 쉽게 찾아낼 수 있습니다. 예를 들어, "강아지가 좋아요"와 "멍멍이를
좋아해요"라는 문장은 단어 구성은 다르지만 의미가 비슷하므로 유사한 벡터값을 가지게 됩니다. 이는 단순한 키워드 매칭으로는 불가능한 수준의 의미적 검색을 가능하게 합니다.
2) 컴퓨터의 이해
컴퓨터는 기본적으로 숫자를 처리하는 기계이므로, 텍스트를 직접 처리하는 것보다 숫자로 변환된 데이터를 처리하는 것
이 훨씬 효율적입니다.
4.3. 벡터 스토어(Vector Stores)의 역할
벡터 스토어는 일반적인 데이터베이스와는 조금 다른 특별한 창고입니다. 일반 데이터베이스가 텍스트를 있는 그대로 저장한다면, 벡터 스토어는 텍스트의 의미를 수치화한 벡터값을 저장해요.
벡터 스토어의 가장 큰 특징은 의미 기반 검색이 가능하다는 점입니다. 예를 들어, "강아지"와 "puppy" 는 서로 다른 언어 로 쓰여진 단어지만, 벡터 스토어에서는 비슷한 의미를 가진 벡터로 저장되어 있어 하나를 검색하면 다른 하나도 쉽게 찾을 수 있습니다. 또한 "댕댕이", "멍멍이"와 같은 유사어들이 비슷한 벡터 공간에 저장되어 효율적인 검색이 가능합니다.
실제 RAG 시스템에서 벡터 스토어는 검색 엔진의 심장부 역할을 합니다. 사용자가 질문을 하면, 그 질문을 벡터로 변환(임베딩)한 후 벡터 스토어에서 가장 유사한 벡터를 가진 문서들을 찾아냅니다. 이때 단순한 키워드 매칭이 아닌, 문맥과 의미를 고려한 지능적인 검색이 이루어집니다.
벡터 스토어는 또한 대규모 데이터를 효율적으로 처리할 수 있도록 최적화되어 있습니다. 수백만 개의 벡터들 중에서도 밀 리초 단위로 유사한 벡터를 찾아낼 수 있는 특별한 인덱싱 기술을 사용합니다. 이는 마치 거대한 도서관에서 원하는 책을 순식간에 찾아내는 것과 같습니다.
4.4 벡터 스토어의 주요 기능
1) 벡터 인덱싱
도서관에 책이 수백만 권 있어도 우리가 원하는 책을 빨리 찾을 수 있는 이유는 체계적으로 분류가 되어있기 때문입니다. 벡터 스토어도 마찬가지예요. 수많은 벡터들을 빠르게 찾을 수 있도록 특별한 방식으로 정리해둡니다.
벡터 스토어는 수많은 고차원 벡터들을 효율적으로 검색하기 위한 특별한 인덱스 구조를 제공하고 있습니다. 예를 들어, 1536차원의 벡터가 수백만 개 있을 때, 이를 일일이 비교하는 것은 매우 비효율적입니다. 따라서 특수한 인덱싱 알고리즘을 사용하여, 마치 도서관의 분류 체계처럼 비슷한 벡터들을 그룹화하고 빠르게 찾을 수 있도록 구조화합니다.
2) 유사도 검색
벡터 스토어의 핵심 기능은 주어진 질문과 가장 유사한 자료들을 찾아내는 것입니다. 예를 들어, 사용자가 "강아지 훈련 방법에 대해 질문하면, 이 질문을 벡터로 변환한 후 저장된 벡터들 중에서 가장 유사한 것들을 찾을 수 있습니다.
코사인 유사도나 유클리디안 거리와 같은 수학적 계산을 통해 벡터 간의 유사도를 측정하며, 상위 k개의 가장 유사한 결과 를 반환합니다.
3) 메타데이터 관리
벡터값뿐만 아니라 원본 텍스트와 추가적인 메타데이터도 함께 저장 가능합니다. 어떤 문서의 벡터를 저장할 때 문서의 제목, 작성일, 출처, 카테고리 등의 정보를 함께 저장할 수 있습니다. 이를 통해 검색 결과를 필터링하거나 정렬하는 등 더 세밀 한 검색 기능을 제공할 수 있습니다.
4) CRUD 연산
일반적인 데이터베이스처럼 기본적인 CRUD(Create, Read, Update, Delete) 연산을 지원합니다.
새로운 문서가 추가되면 이를 벡터로 변환하여 저장(Create) 하고, 필요할 때 검색(Read) 하며, 문서가 수정되면 해당 벡터를 업데이트(Update) 하고, 불필요한 문서는 삭제(Delete) 할 수 있어요. 이러한 기능들을 통해 문서 저장소를 동적으로 관리할 수 있습니다.
4.5. 벡터 스토어가 필요한 이유
1) 의미 기반 검색
벡터 스토어의 가장 큰 장점은 의미 기반의 검색이 가능하다는 점입니다. 일반 검색은 단어가 일치해야 찾을 수 있지만, 벡
터 스토어는 의미가 비슷하면 찾을 수 있다는 것입니다. 예를 들어, "마기 강아지 교육 방법"이라는 검색어를 입력하면, "반려견 훈련 가이드", "퍼피 트레이닝 팁 등과 같이 직접적으로 같은 단어를 사용하지 않더라도 의미적으로 관련된 문서 들을 찾아낼 수 있습니다.
2) 빠른 검색
벡터 스토어는 특별한 인덱싱 기술을 사용하여 매우 빠른 검색 속도를 제공합니다. 이를 통해, 수백만 개의 문서 중에서도 사용자의 질문과 관련된 문서를 밀리초 단위로 찾아낼 수 있습니다.
3) 효율적인 저장
대량의 텍스트 데이터를 효율적으로 저장하고 관리할 수 있습니다. 텍스트를 의미 있는 벡터로 변환하여 저장하기 때문에, 비슷한 의미를 가진 텍스트들은 비슷한 벡터 공간에 저장되고, 이를 통해 저장 공간을 효율적으로 사용할 수 있을 뿐만 아니라, 데이터의 업데이트와 관리도 용이해집니다. 또한, 메타데이터와 함께 저장함으로써, 필요할 때 원본 텍스트나 추가 정보를 쉽게 찾아볼 수 있습니다.
'딥러닝 > 딥러닝: 자연어' 카테고리의 다른 글
RAG 시스템 실습 : 데이터 준비 단계, 운영 단계 (1) | 2025.06.08 |
---|---|
RAG 시스템 파이프라인 2 : 운영 단계 (3) | 2025.06.08 |
Langchain Expression Language(LCEL) (0) | 2025.06.07 |
Prompt Templates (0) | 2025.06.04 |
Langchain 소개 (0) | 2025.06.03 |