DM Log

[AI 실습 #1] Chroma 실습: 벡터DB를 활용한 문서 검색 본문

개발공부/AI

[AI 실습 #1] Chroma 실습: 벡터DB를 활용한 문서 검색

Dev. Dong 2025. 9. 13. 13:58

벡터DB를 활용한 문서 검색 실습

  • Chroma를 이용해 문서를 벡터화하고, 검색하는 실습 진행
  • Chroma는 설치가 간편하고 LangChain에서 기본적으로 지원하기 때문에, RAG 실습

환경 세팅

 

1. 필수 라이브러리 설치

pip install langchain langchain-community langchain-openai chromadb

 

2.  OpenAI API Key 설정

export OPENAI_API_KEY="your_api_key_here"   # macOS/Linux
setx OPENAI_API_KEY "your_api_key_here"     # Windows PowerShell

 

또는 코드 상단

import os
os.environ["OPENAI_API_KEY"] = "your_api_key_here"

Chroma 기본 실습

1. 임베딩 모델과 텍스트 준비

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

# OpenAI 임베딩 모델 초기화
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 간단한 문서 데이터
texts = [
    "사과는 과일이다.",
    "자동차는 바퀴가 달린 탈것이다.",
    "바나나는 노란색 과일이다."
]

2. Chroma 벡터스토어 생성

# 벡터스토어에 텍스트 삽입
vectorstore = Chroma.from_texts(texts, embeddings)

3. 유사도 검색 실행

# 질문을 벡터화하여 검색
query = "노란 과일"
results = vectorstore.similarity_search(query, k=2)

# 결과 출력
for doc in results:
    print("내용:", doc.page_content, "| 메타데이터:", doc.metadata)

 

출력 예시:

내용: 바나나는 노란색 과일이다. | 메타데이터: {}
내용: 사과는 과일이다. | 메타데이터: {}

메타데이터 활용

Chroma는 단순 텍스트뿐 아니라 메타데이터를 함께 저장

metadatas = [
    {"source": "doc1"},
    {"source": "doc2"},
    {"source": "doc3"}
]

vectorstore = Chroma.from_texts(texts, embeddings, metadatas=metadatas)

results = vectorstore.similarity_search("과일", k=2)
for doc in results:
    print("내용:", doc.page_content, "| 출처:", doc.metadata["source"])

👉 실제 서비스에서는 PDF 파일명, 작성일, 문서 경로 등을 메타데이터로 넣어두면 유용

👉 여기서 texts와 metadatas는 리스트 인덱스 기준으로 1:1 매칭됩니다.

  • texts[0] → metadatas[0]
  • texts[1] → metadatas[1]
  • texts[2] → metadatas[2]

⚠️ texts와 metadatas의 길이가 다르면 오류(ValueError)가 발생하니 주의하세요.


Chroma의 장점과 한계

[Chroma의 장점]

 

  • 로컬 DB라 설치/사용이 간단
  • LangChain 기본 통합 지원
  • 실험/프로토타입에 최적

 

[Chroma의 한계]

 

  • 대규모 데이터 확장성 부족 (수억 단위 검색에는 부적합)
  • 클라우드 관리형 서비스 없음 (운영 환경에서는 Pinecone, Weaviate 고려 필요)

 


(부록) 용어 정리

  • Chroma: 오픈소스 벡터 DB
  • similarity_search: 쿼리 벡터와 가장 가까운 문서 검색
  • metadata: 문서의 부가 정보(출처, 작성자 등)