파이썬 프로젝트에서 requirements.txt 파일은 프로젝트가 의존하는 모든 외부 라이브러리(패키지)의 목록을 관리하는 데 사용되는 표준 방식입니다. 이 파일을 사용하면 개발 환경을 일관되게 유지하고, 다른 개발자나 배포 환경에서도 동일한 의존성을 쉽게 설치할 수 있습니다.
requirements.txt의 역할과 중요성
requirements.txt는 주로 다음과 같은 목적으로 사용됩니다:
의존성 관리: 프로젝트에 필요한 모든 라이브러리와 그 버전을 명확하게 기록합니다.
재현성 확보: 특정 시점의 개발 환경을 다른 컴퓨터나 환경에서도 정확하게 재현할 수 있게 합니다.
협업 용이: 팀원들이 동일한 라이브러리 버전을 사용하여 개발할 수 있도록 도와 충돌을 방지합니다.
배포 환경 설정: 애플리케이션을 서버나 컨테이너(Docker 등)에 배포할 때 필요한 의존성을 자동으로 설치할 수 있게 합니다.
requirements.txt 파일 생성 및 관리
1. 수동으로 파일 작성하기
가장 기본적인 방법은 필요한 라이브러리 이름을 직접 requirements.txt 파일에 한 줄에 하나씩 작성하는 것입니다. 특정 버전이나 최소 버전을 명시할 수도 있습니다.
# requirements.txt 예시
requests==2.31.0 # requests 라이브러리 버전 2.31.0 지정
beautifulsoup4>=4.9.3 # beautifulsoup4 라이브러리 버전 4.9.3 이상
pandas # pandas 라이브러리 최신 버전 설치
numpy~=1.23.0 # numpy 라이브러리 1.23.x 버전 중 최신 설치 (1.23.0 <= version < 1.24.0)
==: 정확한 버전 지정 (가장 안전하지만 유연성이 떨어짐)
>=: 최소 버전 지정
~=: 호환 가능한 릴리스(Compatible release) 지정. ~=1.23.0은 1.23.0 이상 1.24.0 미만 버전을 의미합니다. 마이너 버전 업데이트는 허용하지만 메이저 버전 업데이트는 방지합니다.
버전 지정이 없으면 pip는 항상 최신 버전을 설치합니다.
2. 현재 환경의 라이브러리 목록 내보내기
현재 파이썬 환경(가상 환경)에 설치된 모든 라이브러리 목록을 requirements.txt 파일로 자동 생성할 수 있습니다.
pip freeze > requirements.txt
이 명령은 현재 환경에 설치된 모든 패키지와 그 정확한 버전을 requirements.txt 파일에 기록합니다.
주의할 점은 프로젝트에 직접적으로 필요한 라이브러리뿐만 아니라, 그 라이브러리들이 의존하는 다른 라이브러리(하위 의존성)까지 모두 포함된다는 것입니다. 따라서 파일이 상당히 길어질 수 있습니다.
팁: 새로운 프로젝트를 시작할 때는 깨끗한 가상 환경에서 필요한 라이브러리만 pip install로 설치하고, 개발이 완료될 시점에 pip freeze > requirements.txt를 실행하여 해당 프로젝트에 정확히 필요한 의존성만 기록하는 것이 좋습니다.
requirements.txt 파일 처리 (라이브러리 설치)
requirements.txt 파일에 명시된 모든 라이브러리를 설치하려면 다음 명령어를 사용합니다.
pip install -r requirements.txt
이 명령은 requirements.txt 파일을 읽어 거기에 명시된 모든 라이브러리를 한 번에 다운로드하고 설치합니다.
권장 사항: 항상 가상 환경(Virtual Environment) 내에서 이 작업을 수행하세요. 가상 환경을 사용하면 프로젝트별로 독립적인 의존성 관리가 가능하여 시스템 전체의 파이썬 환경과 충돌하는 것을 방지할 수 있습니다.
# 1. 가상 환경 생성 (처음 한 번만)
python -m venv my_project_env # 또는 conda create -n my_project_env python=3.9
# 2. 가상 환경 활성화
# Windows: .\my_project_env\Scripts\activate
# macOS/Linux: source my_project_env/bin/activate
# Conda: conda activate my_project_env
# 3. requirements.txt 파일이 있는 디렉토리로 이동
# cd /path/to/your/project
# 4. 라이브러리 설치
pip install -r requirements.txt
requirements.txt 관리 팁
가상 환경 사용: 위에서 강조했듯이, 모든 파이썬 프로젝트는 전용 가상 환경 내에서 관리하는 것이 표준이자 가장 좋은 방법입니다.
개발/배포 의존성 분리: 프로젝트 규모가 커지면 개발(테스트 프레임워크, 린터 등)에만 필요한 라이브러리와 실제 배포에 필요한 라이브러리를 분리하여 여러 개의 requirements 파일을 만들기도 합니다.
requirements.txt (배포용 필수 라이브러리)
requirements-dev.txt (개발용 라이브러리)
설치할 때는 pip install -r requirements.txt -r requirements-dev.txt 와 같이 여러 파일을 지정할 수 있습니다.
버전 고정의 장단점:
장점: requests==2.31.0처럼 정확히 버전을 고정하면 다른 환경에서 설치할 때 버전에 따른 호환성 문제가 발생할 확률이 매우 낮아집니다.
단점: 새롭게 발견된 버그 수정이나 보안 패치가 적용된 최신 버전의 이점을 누리기 어렵습니다.
업데이트: 시간이 지나면서 라이브러리를 업데이트해야 할 경우, requirements.txt 파일의 버전을 직접 수정하거나, pip install --upgrade <package_name>으로 개별 패키지를 업데이트한 후 pip freeze > requirements.txt를 다시 실행하여 반영할 수 있습니다.
requirements.txt 파일은 파이썬 프로젝트의 건강한 생태계를 유지하는 데 필수적인 도구입니다.
벡터 데이터베이스는 데이터 객체의 수치적 표현인 벡터(벡터 임베딩이라고도 함) 형태로 정보를 저장하는 데이터베이스입니다. 이러한 벡터 임베딩의 성능을 활용하여 이미지, 텍스트, 센서 데이터 등의 비정형 데이터 및 반정형 데이터로 구성된 대규모 데이터 세트를 색인하고 검색합니다. 벡터 데이터베이스는 벡터 임베딩을 관리하기 위해 구축되었으므로 비정형 및 반정형 데이터 관리를 위한 완벽한 솔루션을 제공합니다.
벡터 데이터베이스는 벡터 검색 라이브러리 또는 벡터 인덱스와 다릅니다. 이는 메타데이터 저장 및 필터링을 가능하게 하고, 확장 가능하며, 동적 데이터 변경을 허용하고, 백업을 수행하고, 보안 기능을 제공하는 데이터 관리 솔루션입니다.
벡터 데이터베이스는 고차원 벡터를 통해 데이터를 구성합니다. 고차원 벡터에는 수백 개의 차원이 포함되어 있으며 각 차원은 그것이 나타내는 데이터 객체의 특정 기능이나 속성에 해당합니다.
벡터 임베딩이란 무엇인가요?
벡터 임베딩은 주제, 단어, 이미지 또는 기타 데이터를 숫자로 표현한 것입니다. 임베딩이라고도 하는 벡터 임베딩은 대규모 언어 모델 및 기타 AI 모델에 의해 생성됩니다.
각 벡터 임베딩 사이의 거리는 벡터 데이터베이스 또는 벡터 검색 엔진이 벡터 간의 유사성을 결정할 수 있게 해줍니다. 거리는 데이터 객체의 여러 차원을 나타낼 수 있으므로,머신 러닝 및 AI가 패턴, 관계 및 기본 구조를 이해할 수 있습니다.
통상 벡터 DB에 데이터를 저장하고 이를 읽어오기까지는 9단계 과정이 필요하다. 기업이 자체적으로 작성한 신입사원 백서 파일을 벡터 DB에 저장하고 신입사원이 기업 전용 생성형 AI 챗봇에 질의하고 받기까지 과정을 예로 들어 보자. 먼저 구축된 벡터 DB에 덩어리(청크, Chunk) 형태로 백서 파일을 변환해야 한다. 청크는 의미 있는 단위로 나누는 것을 의미한다. 이후 청크 형태로 바뀐 신입사원 백서 데이터를 임베딩 모델에 넣어 벡터화한다. 이렇게 벡터화된 신입사원 백서 데이터를 벡터 DB에 넣기 전 인덱싱(Indexing)을 통해 정렬하고 벡터 DB에 저장한다. 여기까지가 신입사원 백서 파일을 벡터화하고 벡터 DB에 저장하는 과정으로 볼 수 있다. 이때 사내 규정 및 거버넌스가 바뀌면서 백서가 수정될 경우 벡터 DB에 실시간으로 반영할 수 있어야 한다.
벡터 DB와 지식그래프 비교 (출처: medium.aiplanet.com) 이후 신입사원이 기업용 생성형 AI 챗봇에 입사 첫해 여름휴가를 최대 며칠까지 사용할 수 있는지 질의한다면, LLM과 연동된 랭체인을 통해 쿼리를 임베딩 모델에 넣어 벡터화한다. 이후 벡터화된 질의문을 벡터 DB 내 인덱스에서 유사 벡터 군집(휴가에 대한 정보들) 및 벡터 데이터(입사 첫해 여름휴가 정보)를 찾고 이를 다시 LLM에 보내 사용자가 이해할 수 있는 답변으로 치환해 보여주는 방식이다. 이러한 과정은 타 DB와 별다른 차이점이 없다.
다음은 벡터 DB를 생성하는 코드입니다.
# build_vector_db.py
from langchain_community.document_loaders.csv_loader import CSVLoader
from langchain_community.vectorstores import Chroma
from langchain_upstage import UpstageEmbeddings
loader = CSVLoader(
file_path="./csv/한국산업은행_금융 관련 용어_20151231.csv", encoding="cp949"
)
pages = loader.load()
print(pages[:2])
us_model = UpstageEmbeddings(
api_key="up_ULzGbJVs57bcnNHm8D0KdI51Nzl4F",
model="solar-embedding-1-large"
)
Chroma.from_documents(pages, us_model, persist_directory="./database")
코드 블록별로 설명하면 아래과 같습니다.
CSV 파일 로드
실습에 사용되는 파일을 로드합니다. CSVLoader 객체를 사용하여 CSV 파일을 로드하고, 반환된 Document 정보를 pages 변수에 저장합니다. 다음 코드는 CSV 파일을 출력하고 샘플 데이터를 출력하는 내용입니다.
loader = CSVLoader(file_path="./csv/한국산업은행_금융 관련 용어_20151231.csv", encoding='cp949')
pages = loader.load()
print(pages[:2])
[Document(metadata={'source': './csv/한국산업은행_금융 관련 용어_20151231.csv', 'row': 0}, page_content='구분: 리스크\n분류: 리스크 개요\n용어: 리스크(Risk)\n설명: 미래수익 또는 자산가치 변동
의 불확실성(Uncertainty)으로 인하여 보유자산에서 손실이 발생할 가능성(신용 시장 금리 유동성리스크 등) 또한 부적절하거나 잘못된 내부절차 시스템 오류 직원의 실수·고의 또는 자연재해 등의 사 건에 의해 손실이 발생할 가능성 (운영리스크 등)'), Document(metadata={'source': './csv/한국산업은행_금융 관련 용어_20151231.csv', 'row': 1}, page_content='구분: 리스크\n분류: 리스크 개요\n용어: 불확실성\n설명: 설사 손실이 발생한다 해도 발생될 것이 확실하고 크기(금액)도 확실히 알 수 있어서 회피 또는 수용하기로 의사결정하고 나면 그것은 더 이상 리스크가 아님')]
임베딩 모델 로딩
업스테이지 랭체인 인터페이스를 사용해서 solar-embedding-1-large 모델을 로딩합니다.