벡터 DB (1) - 개발 환경 설정

이영진·2025년 5월 7일
1

LLM

목록 보기
11/25

벡터 DB 개발 환경 설정


Python 설치 및 확인

  1. Python 버전 확인 명령어

    python --version
    또는
    python3 --version
    
  2. Python 다운로드 링크

    https://www.python.org/downloads/release/python-31010/

  3. 설치 시 주의 사항

    설치 시 "Add Python to PATH" 옵션 체크 필수

  4. 설치 완료 후 확인 방법

    VSCode에서 다음 명령어로 설치 확인

    python --version
    

벡터 DB 실행을 위한 필수 라이브러리 설치

  • 설치 명령어
    pip install faiss-cpu weaviate-client pymilvus pinecone-client
    
  • 설치된 라이브러리 예제 코드
    
    import faiss
    import weaviate
    import pymilvus
    import pinecone
    
    print("벡터 DB 라이브러리 설치 완료!")
  • 참고: faiss, milvus, weaviate, pinecone 등은 일반적으로 벡터 데이터베이스를 실행할 때 사용하는 대표적인 라이브러리들입니다.

ChromaDB 환경설정

Windows 환경에서 ChromaDB 설치 절차

필수 요구 사항 : Python 3.10.x 권장 + pip 최신 버전 + 가상환경(Virtual Environment) 사용

  1. Python 버전 확인

    python --version
  2. pip 최신 버전으로 업데이트

    python -m pip install --upgrade pip
  3. 가상환경 생성 및 활성화 (venv 사용)

    python -m venv chromadb_env
    .\chromadb_env\Scripts\Activate
  4. ChromaDB 설치

    pip install chromadb

【 Chroma DB 인덱싱 & 검색 예제 】

import chromadb

# Chroma DB 인스턴스 생성
chroma_client = chromadb.PersistentClient(path="./chroma_db")

# 컬렉션 생성 (벡터를 저장할 공간)
collection = chroma_client.get_or_create_collection(name="test_collection")

# 데이터 추가 (텍스트와 벡터)
collection.add(
    documents=["Hello World", "Artificial Intelligence", "벡터 Databases are cool!"],
    metadatas=[{"source": "A"}, {"source": "B"}, {"source": "C"}],
    ids=["doc1", "doc2", "doc3"]
)

# 검색 테스트 (유사한 문서 찾기)
results = collection.query(
    query_texts=["AI"],
    n_results=2
)

print("검색 결과:", results)
  • 벡터 삽입 및 검색이 정상적으로 동작하는지 확인


ChromaDB Collection

벡터 DB Collection = RDB 테이블 = 엑셀 시트…

  • Collection은 RDB의 테이블과 같은 역할로 데이터를 저장할 수 있는 저장소

  • 벡터 데이터와 그와 관련된 메타데이터를 논리적으로 그룹화한 데이터 집합


구성요소

벡터, 메타데이터, ID = RDB 테이블 컬럼…

  • 벡터(Vector): 컬렉션에 저장되는 고차원 벡터 값, 각 데이터의 임베딩(embedding) 정보

  • ID: 각 벡터의 고유한 식별자, 이름 등을 통해 특정 벡터를 조회하거나 업데이트 가능

  • 메타데이터(Metadata): 벡터에 추가로 연결된 정보로, JSON 형식의 데이터

    (예: 한국어 위키의 각 제목, 작성자 등)

  • 문서(Document): 컬렉션에서 추가적으로 저장되는 문서 형식의 데이터

  • URI: 컬렉션에 추가적으로 저장하기 어려운 이미지나 음성 등의 데이터 경로


list_collections

  • client.count_collections() → Collection 개수 조회
  • client.list_collections() → Collection 목록 조회

delete_collection

  • client.delete_collection(name="height_weight") → Collection 삭제 → 해당 Collection이 존재하지 않으면 오류 발생

【 get_or_create_collection 】

client.get_or_create_collection(
    name="chroma_tutorial",
    metadata={
        "hnsw:space": "cosine"
    }
)
  • Collection 생성 또는 조회 해당 이름의 Collection이 없으면 생성, 있으면 그대로 조회
  • 검색 방식 설정 "hnsw:space" 옵션을 통해 l2, ip, cosine 등 검색 방법 지정 가능

metadata={"hnsw:space": "cosine"} 설명

이 설정은 HNSW(탐색 알고리즘)를 사용할 때 어떤 거리 측정 방식(search metric)을 사용할지를 지정합니다.

의미설명
"l2"L2 거리 (유클리드 거리)두 벡터 간의 직선 거리로, 물리적 거리 기반 비교
"ip"Inner Product (내적)값이 클수록 유사하다고 판단. 보통 정규화된 벡터에 사용
"cosine"코사인 유사도각도 기반의 유사도, 값이 클수록 방향이 유사 (0도 → 완전 유사)

【 Add 】

collection.add(
    ids=id_list,
    embeddings=embedding_list,
    metadatas=metadata_list,
    documents=doc_list,
    uris=uri_list
)

각 인자의 의미:

  • ids=id_list → 유일한 구분자. 중복 입력 불가
  • embeddings=embedding_list특정 벡터 목록. 고차원 임베딩 벡터들을 직접 지정
  • metadatas=metadata_list원본 데이터의 메타데이터. Dict 형식으로 입력 (예: 출처, 카테고리 등)
  • documents=doc_list특정 벡터를 생성하기 위한 문서 텍스트
  • uris=uri_list → 이미지, 음성 등과 같이 컬렉션에 직접 저장하기 어려운 데이터의 경로

이 중 최소한 idsdocuments 또는 embeddings는 필수입니다. 둘 다 없으면 벡터 추가가 불가능합니다.


【 GET 】

collection.count()

→ 데이터 개수 조회

collection.get(
    offset=0,              # 데이터 시작 위치
    limit=3,               # 조회할 데이터 개수
    where={"키": {"$gte": 170}},           # Metadata 검색 조건
    where_document={"$contains": "name"}  # Document 검색 조건
)

Where Document 조건

  • $contains : 문자열 포함
  • $not_contains : 문자열 포함하지 않음
  • $and : and 조건
  • $or : or 조건

Where 조건

  • $eq : 동일 (문자열, 정수, 부동 소수점)
  • $ne : 동일하지 않음
  • $gt : 큼 (정수, 부동 소수점)
  • $gte : 크거나 같음
  • $lt : 작음
  • $lte : 작거나 같음

【 Query 】

collection.query(
    [183, 78],                          # 유사도를 검색할 특정 벡터
    where={"키": {"$gte": 170}},       # Metadata 검색 조건
    where_document=None,               # Document 검색 조건
    n_results=11,                      # 조회할 데이터 개수
    include=['metadatas', 'embeddings']  # 검색 결과에 포함시킬 필드
)

【 DELETE 】

collection.delete(
    ids=None,                                     # 삭제할 데이터 ID
    where={"키": {"$lte": 170}},                  # 삭제할 Metadata 조건
    where_document={"$contains": "name"}          # 삭제할 Document 조건
)

각 인자 설명

  • ids : 삭제할 벡터의 ID 목록. None이면 ID 조건 없이 삭제
  • where : 메타데이터를 기준으로 삭제할 조건 지정
  • where_document : 문서 내용을 기준으로 삭제할 조건 지정

이 함수는 조건에 일치하는 데이터만 삭제하며, ID, 메타데이터, 문서 중 하나 이상으로 삭제 조건을 줄 수 있습니다.


PostgreSQL + pg벡터

1. PostgreSQL 설치

sudo apt -y install postgresql
sudo apt -y install postgresql-server-dev-all gcc make

2. PostgreSQL 실행

sudo service postgresql start

3. 관리자 비밀번호 설정

sudo -u postgres psql -U postgres -c "ALTER USER postgres PASSWORD 'postgres';"

위 명령어들은 Ubuntu 등 Debian 기반 리눅스 환경에서 PostgreSQL을 설치하고 기본 설정을 하는 데 사용됩니다.


pg벡터 설치 방법

1. pg벡터란?

  • PostgreSQL에서 벡터 검색 기능을 추가해주는 확장 플러그인
  • 벡터 데이터를 저장하고 유사성 검색 가능

2. 소스 코드 다운로드 및 설치

git clone https://github.com/pgvector/pgvector.git
cd pgvector
make
sudo make install

3. pg벡터 플러그인 활성화

CREATE EXTENSION IF NOT EXISTS vector;

위 단계를 따라 하면 PostgreSQL에서 벡터 유사도 검색을 수행할 수 있습니다.


벡터 테이블 생성

【 SQL: Create Table 】

CREATE TABLE IF NOT EXISTS height_weight (
    username varchar(64) NOT NULL,     -- 기존 RDB 필드
    height real NOT NULL,
    weight real NOT NULL,
    embedding vector(2) NOT NULL       -- 2차원 벡터를 저장할 수 있는 필드
);

설명

  • username, height, weight는 일반적인 관계형 데이터베이스(RDB) 필드
  • embedding vector(2)pgvector 확장을 통해 사용 가능한 2차원 벡터 필드
    • 예: [180.0, 75.0] 같은 벡터를 저장

【 SQL: INSERT 】

INSERT INTO height_weight VALUES (
    'hong',           -- 기존 RDB 입력과 동일
    176.7,
    72.2,
    '[176.7, 72.2]'   -- 벡터 입력 형식은 string 형식
);

설명

  • username, height, weight는 일반적인 RDB 필드 값
  • embedding 필드에는 문자열 형태의 벡터를 입력 (예: '[값1, 값2]')
  • pgvector 확장을 통해 벡터 형태로 저장됨

【 SQL: SELECT 】

SELECT * FROM height_weight
WHERE height > 177
ORDER BY embedding <-> '[183,78]'
LIMIT 11;

설명

  • WHERE height > 177 → 기존 RDB 조건과 동일하게 사용 가능
  • ORDER BY embedding <-> '[183,78]'embedding 벡터 필드를 기준으로 유사도 정렬

벡터 유사도 연산자 종류

연산자의미
<->L2 거리 (유클리드 거리)
<+>L1 거리 (맨해튼 거리)
<#>Dot-product (내적)
<=>Cosine similarity (코사인 유사도)

위 쿼리는 pgvector를 사용하는 PostgreSQL에서 벡터 기반 최근접 이웃(NN) 검색을 수행하는 대표적인 방식입니다.

0개의 댓글