Ollama와 Docker로 RAG 어플리케이션 구축하기
Ollama와 Docker로 RAG 어플리케이션 구축하기
이 가이드는 Docker를 사용해 Retrieval-Augmented Generation(RAG) 모델을 Ollama와 함께 배포하는 방법을 보여줘요.
출처: 문서
본문
RAG(Retrieval Augmented Generation) 가이드는 Docker를 사용해 기존 RAG 어플리케이션을 컨테이너화하는 방법을 알려줘요. 예제 어플리케이션은 와인과 음식의 최고의 페어링을 알려주는 소믈리에처럼 동작하는 RAG예요. 이 가이드에서 배울 내용:
- RAG 어플리케이션 컨테이너화 및 실행하기
- 개발용으로 전체 RAG 스택을 로컬에서 실행할 로컬 환경 설정하기
먼저 기존 RAG 어플리케이션을 컨테이너화하는 것부터 시작해볼게요.
RAG 어플리케이션 컨테이너화하기
개요
이 섹션은 Docker로 RAG 어플리케이션을 컨테이너화하는 과정을 안내해요.
참고: 컨테이너화된 GenAI 어플리케이션의 더 많은 샘플은 GenAI Stack 데모 어플리케이션 에서 볼 수 있어요.
샘플 어플리케이션 가져오기
이 가이드에서 사용하는 샘플 어플리케이션은 RAG 어플리케이션의 예다. 모든 RAG 어플리케이션의 구성 요소인 세 가지 핵심 컴포넌트로 이루어져 있어요. 어딘가 호스팅된 대규모 언어 모델(LLM), 이 경우에는 컨테이너에 호스팅되고 Ollama 를 통해 제공돼요. 로컬 데이터의 임베딩을 저장하는 벡터 데이터베이스 Qdrant, 그리고 사용자에게 최상의 사용자 경험을 제공하는 Streamlit 을 사용하는 웹 어플리케이션이에요.
샘플 어플리케이션을 클론해주세요. 터미널을 열고 작업할 디렉터리로 이동한 뒤, 다음 명령으로 리포지토리를 클론해주세요:
$ git clone https://github.com/mfranzon/winy.git
이제 winy 디렉터리에 다음 파일이 있어야 해요.
├── winy/
│ ├── .gitignore
│ ├── app/
│ │ ├── main.py
│ │ ├── Dockerfile
│ │ └── requirements.txt
│ ├── tools/
│ │ ├── create_db.py
│ │ ├── create_embeddings.py
│ │ ├── requirements.txt
│ │ ├── test.py
│ │ └── download_model.sh
│ ├── docker-compose.yaml
│ ├── wine_database.db
│ ├── LICENSE
│ └── README.md
어플리케이션 컨테이너화: 핵심 요소
어플리케이션을 컨테이너화한다는 것은 어플리케이션을 의존성과 함께 컨테이너로 패키징해 여러 환경에서 일관성을 보장하는 것을 의미해요. Winy 같은 앱을 컨테이너화하는 데 필요한 것:
- Dockerfile: 어플리케이션용 Docker 이미지 빌드 방법에 대한 지침이 담긴 Dockerfile. 베이스 이미지, 의존성, 구성 파일, 어플리케이션 실행 명령을 지정해요.
- Docker Compose 파일: Docker Compose는 멀티 컨테이너 Docker 어플리케이션을 정의하고 실행하는 도구예요. Compose 파일로 어플리케이션의 서비스, 네트워크, 볼륨을 단일 파일에서 구성할 수 있어요.
어플리케이션 실행하기
winy 디렉터리 안에서 터미널에 다음 명령을 실행해주세요.
$ docker compose up --build
Docker가 어플리케이션을 빌드하고 실행해요. 네트워크 연결에 따라 모든 의존성을 다운로드하는 데 몇 분이 걸릴 수 있어요. 어플리케이션이 실행 중일 때 터미널에서 다음처럼 생긴 메시지를 보게 돼요.
server-1 | You can now view your Streamlit app in your browser.
server-1 |
server-1 | URL: http://0.0.0.0:8501
server-1 |
브라우저를 열고 http://localhost:8501 에서 어플리케이션을 확인해주세요. 간단한 Streamlit 어플리케이션이 보여야 해요.
어플리케이션이 올바르게 동작하려면 Qdrant 데이터베이스 서비스와 LLM 서비스가 필요해요. Docker 밖에서 실행한 서비스에 접근할 수 있다면 docker-compose.yaml 에서 연결 정보를 지정해주세요.
winy:
build:
context: ./app
dockerfile: Dockerfile
environment:
- QDRANT_CLIENT=http://qdrant:6333 # Specifies the url for the qdrant database
- OLLAMA=http://ollama:11434 # Specifies the url for the ollama service
container_name: winy
ports:
- "8501:8501"
depends_on:
- qdrant
- ollama
서비스가 실행되고 있지 않다면 이 가이드를 계속 진행해 Docker로 이 서비스들의 일부 또는 전부를 실행하는 방법을 배워보세요.
ollama 서비스는 비어 있다는 점을 기억하세요. 모델이 없어요. 따라서 RAG 어플리케이션을 사용하기 전에 모델을 내려받아야 해요. 모든 지침은 다음 페이지에 있어요.
터미널에서 ctrl + c 를 눌러 어플리케이션을 중지해주세요.
요약
이 섹션에서 Docker로 RAG 어플리케이션을 컨테이너화하고 실행하는 방법을 배웠어요.
다음 단계
다음 섹션에서는 Docker를 사용해 완전히 로컬에서, 선호하는 LLM 모델로 어플리케이션을 올바르게 구성하는 방법을 배워요.
RAG 개발에 컨테이너 사용하기
사전 요구사항
RAG 어플리케이션 컨테이너화하기 를 완료하세요.
개요
이 섹션에서는 생성형 RAG 어플리케이션이 필요로 하는 모든 서비스에 접근할 개발 환경을 설정하는 방법을 배워요. 여기에는 다음이 포함돼요:
- 로컬 데이터베이스 추가
- 로컬 또는 원격 LLM 서비스 추가
참고: 컨테이너화된 GenAI 어플리케이션의 더 많은 샘플은 GenAI Stack 데모 어플리케이션 에서 볼 수 있어요.
로컬 데이터베이스 추가
컨테이너로 데이터베이스 같은 로컬 서비스를 설정할 수 있어요. 이 섹션에서는 docker-compose.yaml 파일에서 데이터베이스 서비스를 살펴볼게요.
데이터베이스 서비스를 실행하려면:
클론된 리포지토리의 디렉터리에서 IDE 또는 텍스트 편집기로 docker-compose.yaml 파일을 열어주세요.
docker-compose.yaml 파일에서 다음을 볼 수 있어요:
services:
qdrant:
image: qdrant/qdrant
container_name: qdrant
ports:
- "6333:6333"
volumes:
- qdrant_data:/qdrant/storage
참고: Qdrant에 대해 더 알려면 Qdrant 공식 Docker 이미지 를 참고하세요.
어플리케이션을 시작해주세요. winy 디렉터리 안에서 터미널에 다음 명령을 실행해주세요.
$ docker compose up --build
어플리케이션에 접근하세요. 브라우저를 열고 http://localhost:8501 에서 어플리케이션을 확인해주세요. 간단한 Streamlit 어플리케이션이 보여야 해요.
어플리케이션을 중지하세요. 터미널에서 ctrl + c 를 눌러 어플리케이션을 중지해주세요.
로컬 또는 원격 LLM 서비스 추가
샘플 어플리케이션은 Ollama 를 지원해요. 이 가이드는 다음 시나리오에 대한 지침을 제공해요:
- 컨테이너에서 Ollama 실행
- 컨테이너 밖에서 Ollama 실행
모든 플랫폼이 이전 시나리오 중 아무거나 사용할 수 있지만, 성능과 GPU 지원은 다를 수 있어요. 적절한 옵션을 선택하는 데 도움이 되는 지침을 사용할 수 있어요:
- Linux에서 네이티브 Docker Engine 설치를 사용하거나 Windows 10/11에서 Docker Desktop을 사용하고, CUDA 지원 GPU가 있으며, 시스템에 최소 8GB RAM이 있다면 컨테이너에서 Ollama를 실행하세요.
- Linux 머신에서 Docker Desktop을 실행한다면 컨테이너 밖에서 Ollama를 실행하세요.
LLM 서비스에 대해 다음 옵션 중 하나를 선택하세요.
컨테이너에서 Ollama 실행
컨테이너에서 Ollama를 실행할 때는 CUDA 지원 GPU가 있어야 해요. 지원 GPU 없이도 컨테이너에서 Ollama를 실행할 수는 있지만 성능이 만족스럽지 않을 수 있어요. GPU 접근을 지원하는 것은 Linux와 Windows 11뿐이에요.
컨테이너에서 Ollama를 실행하고 GPU 접근을 제공하려면:
사전 요구사항을 설치하세요.
- Linux의 Docker Engine에서는 NVIDIA Container Toolkit 을 설치하세요.
- Windows 10/11의 Docker Desktop에서는 최신 NVIDIA 드라이버 를 설치하고 WSL2 백엔드 를 사용하고 있는지 확인하세요.
docker-compose.yaml 파일에는 이미 필요한 지침이 들어 있어요. 내 앱에서는 docker-compose.yaml 에 Ollama 서비스를 추가해야 해요. 다음은 업데이트된 docker-compose.yaml 이에요:
ollama:
image: ollama/ollama
container_name: ollama
ports:
- "8000:8000"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
참고: Compose 지침에 대한 자세한 내용은 Docker Compose로 GPU 접근 켜기 를 참고하세요.
Ollama 컨테이너가 실행되면 tools 폴더 안의 download_model.sh 를 이 명령으로 사용할 수 있어요:
. ./download_model.sh <model-name>
Ollama 모델을 내려받는 데는 몇 분이 걸릴 수 있어요.
컨테이너 밖에서 Ollama 실행
호스트 머신에 Ollama 를 설치 하고 실행해주세요.
다음 명령으로 모델을 Ollama에 내려받아주세요.
$ ollama pull llama2
docker-compose.yaml 에서 ollama 서비스를 제거하고 winy 서비스의 연결 변수를 적절히 업데이트해주세요:
- OLLAMA=http://ollama:11434
+ OLLAMA=<your-url>
RAG 어플리케이션 실행하기
이 시점에서 Compose 파일에 다음과 같은 서비스가 있어요:
- 메인 RAG 어플리케이션용 서버 서비스
- Qdrant 데이터베이스에 벡터를 저장하는 데이터베이스 서비스
- (선택) LLM 서비스를 실행하는 Ollama 서비스
어플리케이션이 실행되면 브라우저를 열고 http://localhost:8501 에서 어플리케이션에 접근해주세요.
시스템과 선택한 LLM 서비스에 따라 응답하는 데 몇 분이 걸릴 수 있어요.
요약
이 섹션에서 GenAI 어플리케이션이 필요로 하는 모든 서비스에 접근할 개발 환경을 설정하는 방법을 배웠어요.
관련 정보:
- Dockerfile 참조
- Compose 파일 참조
- Ollama Docker 이미지
- GenAI Stack 데모 어플리케이션
다음 단계
GenAI Stack 데모 어플리케이션 에서 더 많은 GenAI 어플리케이션 샘플을 확인해보세요.
더 알아보기 (Learn more)
- Ollama
- RAG(검색 증강 생성)
- Qdrant