RAG Python Setup uv

[RAG Playground] Quest 1: 프로젝트 환경 세팅

공공데이터포털 API를 활용해 다양한 RAG 기법을 실험해 보고자 시작한 프로젝트, ‘RAG Playground’. 이전 프롤로그 포스트에서 예고했던 대로 드디어 그 첫 번째 퀘스트인 ‘프로젝트 환경 세팅’을 시작해보려고 합니다 🎉

RAG Playground 프로젝트 첫 퀘스트 시작을 알리는 밈 이미지

이 포스트에서는 앞으로 진행될 삽질(?)의 기반이 될 Python 프로젝트 초기 환경 설정에 대한 고민과 그 결과물을 정리해 보려 합니다. 패키지 매니저 선택부터 디렉토리 구조까지, 어떻게 첫 삽을 떴는지 공유해 볼게요~~

어떤 패키지 매니저를 쓸까? uv의 도입

항상 프로젝트를 시작할 때 가장 먼저 하는 고민, 바로 패키지 매니저 선택입니다. 예전 대학교에서 한참 파이썬을 만질 때는 주로 CondaCondaAnaconda의 Python·비Python 패키지 및 가상환경 관리 도구로, 데이터 사이언스와 머신러닝 환경에 특화되어 있습니다.를 사용했었는데요 (실은 교수님께서 conda 사용하라고 했습니다^^)

conda

이후 AI 공부를 본격적으로 시작하면서 다시 파이썬으로 돌아왔더니 그사이 poetry가 대세가 되어 있더라고요? 맞나🫣?? 아무튼 찾아보니까 poetry가 많았어요 그래서 최근까지는 개인 공부나 회사 업무에서도 주로 poetry를 사용해 왔습니다!

하지만 또 최근 동향을 알아보니 uvuvAstral에서 개발한 Rust 기반의 차세대 Python 올인원 패키지 도구로, 압도적인 처리 속도를 자랑합니다.가 성능도 압도적으로 좋고 여러모로 장점이 많다는 이야기가 많더라고요ㅎㅎ 평소 채신 기술 찍어 먹어보는 걸 워낙 좋아하는 성격이라 이번 프로젝트는 시원하게 uv로 가보기로 결정했습니다.

uv 패키지 매니저를 선택하겠다고 결정하는 밈 이미지

uv는 Rust로 작성된 Python 패키지 인스톨러 및 리졸버로, 다른 도구들과 비교가 안 되는 압도적인 속도를 자랑한다고 합니다. 제가 또 성능? 최적화? 이런 거 좋아하는 사람으로서 못 참죠 😎 그리고 Rust 요즘 굉장히 인기 언어 아닙니까? (나중에 기회가 되면 Rust도 공부해 볼 예정!)

프로젝트를 진행하다 보면 LangChain, LlamaIndex, OpenAI 같은 LLM 관련 라이브러리뿐만 아니라 필요에 따라 다양한 패키지들을 수시로 설치하고 지우게 될 것이기 때문에, 이런 상황에서 uv의 빠른 속도는 답답함을 줄이고 쾌적한 실험 환경을 만들어 줄 것이라 기대 중입니다:)

# uv 설치 및 프로젝트 초기화 시작!
# curl -LsSf https://astral.sh/uv/install.sh | sh
# uv init rag-playground

pyproject.tomluv.lock 시스템을 통해 의존성 버전 충돌이나 재현성 문제에서도 꽤 안정적인 관리가 가능할 것 같습니다.

핵심 뼈대가 될 의존성 패키지들

아직 구체적인 파이프라인 코드를 짜기 전이라, 가장 기본이 될 굵직한 라이브러리들만 먼저 세팅해 두려고 합니다 🧪

  • langchain, langchain-openai 등: 핵심 LLM 연동 및 체인 로직 구성
  • chromadb: 벡터 데이터베이스
  • python-dotenv: API 키 등 환경 변수(.env) 직관적 관리
  • pytest: 나중을 위한 최소한의 테스트 환경

디렉토리 구조는 어떻게 잡을까?

앞으로 수많은 실험과 스크립트들이 뒤엉키지 않도록, 시작부터 어느 정도 구획을 나눠두는 게 중요할 것 같아요. 다음과 같이 구조를 잡아봤습니다.

rag-playground/
├── src/
│   └── rag_playground/       # 소스코드
│       ├── __init__.py
│       ├── config.py         # 환경설정
│       ├── data/             # 공공데이터 수집/파싱 스크립트들
│       └── rag/              # RAG 코어 로직 (로더, 임베딩, 체인 등)
├── tests/                    # (언젠가 짜야 할) 테스트 코드들
├── .env                      # 환경변수
└── pyproject.toml            # 프로젝트 설정

다음 퀘스트: 본격적인 데이터 수집! 🏃‍♂️

뼈대 공사는 얼추 마무리가 되었으니, 이제 본격적으로 코드를 짜고 싶어서 손이 근질근질하네요 👊

다음 포스트에서는 드디어 메인 재료인 ‘공공데이터’를 실제로 긁어오고(문서 로딩), 데이터를 이리저리 다루며 쪼개보는(청킹) 작업을 진행해 보겠습니다.

다음 퀘스트인 데이터 수집으로 출발하는 밈 이미지