mrdbourke/simple-local-rag
요약
NVIDIA GPU를 활용하여 로컬 환경에서 실행 가능한 오픈 소스 RAG 파이프라인 구축 가이드를 제공합니다. PDF 문서 인제스션부터 LLM을 이용한 질의응답까지의 전 과정을 다루며, Google Colab에서도 실행 가능합니다.
핵심 포인트
- NVIDIA GPU 기반의 완전한 로컬 RAG 워크플로우 구축
- 오픈 소스 도구와 Gemma 모델을 활용한 PDF 채팅 기능 구현
- PyTorch 및 CUDA 환경 설정과 Flash Attention 2 활용 팁 제공
- 로컬 환경 및 Google Colab 환경 모두 지원
우리가 구축할 로컬 RAG 파이프라인:
모두 NVIDIA GPU에서 로컬로 실행되도록 설계되었습니다.
PDF 인제스션 (PDF ingestion)부터 "PDF와 채팅" 스타일의 기능까지 모든 과정을 다룹니다.
모두 오픈 소스 (open-source) 도구를 사용합니다.
우리의 구체적인 예시에서는, 사용자가 1,200페이지 분량의 영양학 교과서 PDF 버전에 대해 질문하면, LLM (Large Language Model)이 교과서의 텍스트 구절을 바탕으로 질문에 대한 응답을 생성할 수 있게 해주는 RAG 워크플로우인 NutriChat을 구축할 것입니다.
PDF 소스: https://pressbooks.oer.hawaii.edu/humannutrition2/
또한 노트북 00-simple-local-rag.ipynb를 Google Colab에서 직접 실행할 수도 있습니다.
TODO:
- 설정 지침 완료
- 워크플로우 헤더 이미지 제작
- README에 RAG 정보 소개 추가 여부?
- README에 확장 기능 추가
- 코드 작성/워크스루 영상 녹화 - 완료, YouTube에서 각 코드 라인을 따라오세요: https://youtu.be/qN_2fnOPY-M
두 가지 주요 옵션:
-
5GB 이상의 VRAM을 갖춘 로컬 NVIDIA GPU가 있는 경우, 아래 단계를 따라 이 파이프라인을 귀하의 기기에서 로컬로 실행하십시오.
-
로컬 NVIDIA GPU가 없는 경우, Google Colab을 따라 하며 그곳의 NVIDIA GPU에서 실행할 수 있습니다.
-
Python 코드를 작성하는 데 익숙함.
-
1~2개의 초급 머신러닝 (machine learning)/딥러닝 (deep learning) 코스 수강.
-
PyTorch에 익숙함, 더 자세한 내용은 나의 초급 PyTorch 영상을 참조하십시오.
참고: Python 3.11에서 테스트되었으며, CUDA 12.1이 설치된 NVIDIA RTX 4090을 탑재한 Windows 11에서 실행되었습니다.
git clone https://github.com/mrdbourke/simple-local-rag.git
cd simple-local-rag
python -m venv venv
Linux/macOS:
source venv/bin/activate
Windows:
.\venv\Scripts\activate
pip install -r requirements.txt
참고: torch를 CUDA와 함께 수동으로 설치해야 함을 확인했습니다 (더 빠른 추론을 위해 최신 버전의 어텐션 (attention)을 사용하려면 torch 2.1.1+ 버전이 필요합니다), 다음을 참조하십시오: https://pytorch.org/get-started/locally/
Windows에서는 다음을 사용했습니다:
pip3 install -U torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
VS Code:
code .
Jupyter Notebook
jupyter notebook
설치 참고 사항 (Setup notes):
- 설치 또는 설정 과정에서 문제가 발생하면 이슈(issue)를 남겨주세요.
- Gemma LLM 모델에 접근하려면 Hugging Face의 Gemma 모델 페이지에서 이용 약관에 동의해야 합니다. 그 후 Hugging Face CLI/Hugging Face Hub의
login()함수를 통해 로컬 머신을 인증해야 합니다. 이 과정을 완료하면 모델을 다운로드할 수 있습니다. Google Colab을 사용하는 경우, "Secrets" 탭에 Hugging Face 토큰을 추가할 수 있습니다. - 속도 향상을 위해 Flash Attention 2 (더 빠른 어텐션 구현)를 설치 및 컴파일하는 작업은 시스템 설정에 따라 약 5분에서 3시간 정도 소요될 수 있습니다. 자세한 내용은 Flash Attention 2 GitHub를 참조하세요. 특히 Windows에서 실행하는 경우, 이 GitHub 이슈 스레드를 확인하세요. 컴파일 시간 문제로 인해requirements.txt에서flash-attn을 주석 처리해 두었으니, 사용을 원하시면 주석을 해제하거나pip install flash-attn을 실행하세요.
RAG는 검색 증강 생성 (Retrieval Augmented Generation)의 약자입니다.
이 개념은 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 논문에서 소개되었습니다.
각 단계는 대략 다음과 같이 나눌 수 있습니다:
Retrieval (검색) - 쿼리(query)가 주어졌을 때 소스에서 관련 정보를 찾는 과정입니다. 예를 들어, 질문이 주어졌을 때 데이터베이스에서 관련 있는 Wikipedia 텍스트 구절을 가져오는 것입니다.
Augmented (증강) - 검색된 관련 정보를 사용하여 생성 모델 (예: LLM)의 입력을 수정하는 과정입니다.
Generation (생성) - 입력이 주어졌을 때 출력을 생성하는 과정입니다. 예를 들어, LLM의 경우 입력 프롬프트(prompt)가 주어졌을 때 텍스트 구절을 생성하는 것입니다.
RAG의 주요 목표는 LLM의 생성 결과물(generation outputs)을 개선하는 것입니다.
두 가지 주요 개선 사항은 다음과 같습니다:
환각 현상 방지(Preventing hallucinations) - LLM은 놀랍지만, 실제로는 아닌 것을 처럼 생성하는 환각(hallucination)에 취약합니다. RAG 파이프라인은 사실적인 입력(retrieved inputs)을 제공함으로써 LLM이 더 사실적인 결과물을 생성하도록 도울 수 있습니다. 그리고 RAG 파이프라인에서 생성된 답변이 정확하지 않은 것처럼 보이더라도, 검색(retrieval) 덕분에 그 정보가 어디서 왔는지 출처(sources)에 접근할 수 있습니다.맞춤형 데이터로 작업하기(Work with custom data) - 많은 기본 LLM은 인터넷 규모의 텍스트 데이터로 학습되었습니다. 이는 언어를 모델링하는 뛰어난 능력을 갖추고 있음을 의미하지만, 종종 특정 지식이 부족합니다. RAG 시스템은 LLM에 의료 정보나 회사 문서와 같은 도메인별(domain-specific) 데이터를 제공하여, 특정 사용 사례에 맞게 출력물을 사용자 정의할 수 있도록 할 수 있습니다.**원래 RAG 논문의 저자들은 위에서 언급된 두 가지 포인트를 그들의 토론에서 설명했습니다. 이 작업은 이전 작업들보다 몇 가지 긍정적인 사회적 이점을 제공합니다. 실제 사실 지식(이 경우 Wikipedia)에 더 강하게 기반하고 있다는 사실 자체가, 더 사실적인 생성물에서는
고객 지원 Q&A 채팅 - 기존 고객 지원 문서를 리소스로 활용하여, 고객이 질문을 하면 시스템이 관련 문서 스니펫(snippets)을 검색하고 LLM이 이 스니펫들을 바탕으로 답변을 작성하게 할 수 있습니다. 이를
성능 측면에서, LLM API는 일반적인 작업에서 로컬에서 실행되는 오픈 소스 모델보다 여전히 더 나은 성능을 보일 수 있지만, 더 작고 집중된 모델이 더 큰 모델보다 뛰어난 성능을 보이는 사례가 점점 더 많이 나타나고 있습니다.
| 용어 | 설명 |
|---|---|
| 토큰 (Token) | 텍스트의 하위 단어 단위입니다. 예를 들어, "hello, world!"는 ["hello", ",", "world", "!"]로 나뉠 수 있습니다. 토큰은 전체 단어, 단어의 일부 또는 문장 부호 그룹이 될 수 있습니다. 영어 기준으로 1 토큰은 약 4글자와 같으며, 100 토큰은 약 75단어와 같습니다. 텍스트는 LLM에 전달되기 전에 토큰으로 분할됩니다. |
| 임베딩 (Embedding) | 데이터 조각의 학습된 수치적 표현입니다. 예를 들어, 텍스트 문장은 768개의 값을 가진 벡터(vector)로 표현될 수 있습니다. (의미상) 유사한 텍스트 조각들은 이상적으로 유사한 값을 갖게 됩니다. |
| 임베딩 모델 (Embedding model) | 입력 데이터를 받아 수치적 표현을 출력하도록 설계된 모델입니다. 예를 들어, 텍스트 임베딩 모델은 384 토큰의 텍스트를 입력받아 크기가 768인 벡터로 변환할 수 있습니다. 임베딩 모델은 LLM 모델과 다를 수 있으며, 실제로도 다른 경우가 많습니다. |
| 유사도 검색/벡터 검색 (Similarity search/vector search) | 유사도 검색/벡터 검색은 고차원 공간(high-dimensional space)에서 서로 가까이 있는 두 벡터를 찾는 것을 목표로 합니다. 예를 들어, 임베딩 모델을 통과한 두 개의 유사한 텍스트 조각은 높은 유사도 점수(similarity score)를 가져야 하는 반면, 서로 다른 주제에 관한 두 텍스트 조각은 더 낮은 유사도 점수를 갖게 됩니다. 일반적인 유사도 점수 측정 방식으로는 내적(dot product)과 코사인 유사도(cosine similarity)가 있습니다. |
| 거대 언어 모델 (Large Language Model, LLM) | 텍스트의 패턴을 수치적으로 표현하도록 훈련된 모델입니다. 생성형 LLM은 시퀀스(sequence)가 주어지면 그 시퀀스를 이어 나갑니다. 예를 들어, "hello, world!"라는 텍스트 시퀀스가 주어지면, 생성형 LLM은 "we're going to build a RAG pipeline today!"를 생성할 수 있습니다. 이러한 생성은 학습 데이터와 프롬프트(prompt)에 크게 의존합니다. |
| LLM 컨텍스트 창 (LLM context window) | LLM이 입력으로 받아들일 수 있는 토큰의 수입니다. |
예를 들어, 2024년 3월 기준으로 GPT-4는 기본적으로 32k 토큰(약 96페이지 분량의 텍스트)의 컨텍스트 창 (context window)을 가지며, 필요에 따라 최대 128k까지 확장될 수 있습니다. Google의 최신 오픈 소스 LLM인 Gemma (2024년 3월)는 8,192 토큰(약 24페이지 분량의 텍스트)의 컨텍스트 창을 가집니다. 컨텍스트 창이 더 크다는 것은 LLM이 질의 (query)를 돕기 위해 더 많은 관련 정보를 받아들일 수 있음을 의미합니다. 예를 들어, RAG 파이프라인 (RAG pipeline)에서 모델의 컨텍스트 창이 더 크다면, 생성 (generation)을 돕기 위해 검색 시스템 (retrieval system)으로부터 더 많은 참조 항목 (reference items)을 받아들일 수 있습니다. |
| 프롬프트 (Prompt) |
생성형 LLM에 입력되는 값을 설명하는 일반적인 용어입니다. "프롬프트 엔지니어링 (prompt engineering)"의 개념은 생성형 LLM에 텍스트 기반(또는 잠재적으로 이미지 기반) 입력을 특정 방식으로 구조화하여 생성된 출력이 이상적이도록 만드는 것입니다. 이 기술은 LLM의 인컨텍스트 학습 (in-context learning) 능력 덕분에 가능합니다. 즉, LLM이 언어에 대한 표현을 사용하여 프롬프트를 분석하고 적절한 출력이 무엇인지 인식할 수 있는 능력을 갖추고 있기 때문입니다 (참고: LLM의 출력은 확률적(probable)이므로, "출력할 수 있다(may output)"와 같은 표현이 사용됩니다). |
곧 공개 예정입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기