AI Agent

Weaviate 완전 정복: 오픈소스 벡터 데이터베이스의 모든 것

코딩 코디네이터 2025. 5. 3. 10:00
반응형

Weaviate 완전 정복: 오픈소스 벡터 데이터베이스의 모든 것

GPT가 아무리 똑똑해도, 관련 문서를 못 찾으면 무용지물이에요.
그 해결사, 바로 Weaviate입니다!

 

반응형

 

안녕하세요, 데이터 기반 AI 서비스에 관심 많은 여러분! 오늘은 요즘 뜨거운 관심을 받고 있는 Weaviate 벡터 데이터베이스에 대해 이야기해보려 해요. LLM을 제대로 활용하고 싶다면 꼭 알아야 할 핵심 기술 중 하나죠. 특히 RAG(Retrieval-Augmented Generation)를 구성하거나, 유사도 기반 검색 엔진을 만들고 싶을 때 Weaviate는 정말 강력한 무기가 되어줘요. 제가 수업 시간에 학생들에게 직접 설명하는 방식 그대로, 최대한 쉽게! 핵심부터 차근차근 알려드릴게요.

1. Weaviate란 무엇인가요?

요즘 생성형 AI나 챗봇을 개발하다 보면 꼭 마주치는 키워드가 있어요. 바로 "벡터 데이터베이스(Vector DB)"입니다. 그 중에서도 가장 많이 언급되는 오픈소스 프로젝트 중 하나가 Weaviate예요.

Weaviate는 텍스트, 이미지, 오디오 같은 비정형 데이터를 벡터로 변환하고 저장한 다음, 코사인 유사도, L2 거리 같은 수학적 연산으로 빠르게 검색할 수 있게 해주는 데이터베이스예요.

그냥 저장만 하는 게 아니라 검색 중심으로 설계된 DB라는 점에서 전통적인 RDBMS와는 다른 방식의 사고가 필요하죠.

📌 Weaviate의 정의 요약

  • 비정형 데이터를 벡터(숫자 배열)로 변환해 저장하고 검색
  • 의미 기반 검색에 최적화된 데이터베이스 (RAG, 추천시스템, NLP 등에 활용)
  • OpenAI, HuggingFace 같은 모델들과 연동 가능 (임베딩 자동화)

💡 왜 Weaviate를 써야 할까요?

  1. 문장을 입력하면 유사한 문서를 똑똑하게 찾아주는 검색 기능을 갖춤
  2. 기존 DB처럼 스키마를 정의할 수 있어 직관적임
  3. GraphQL로 벡터 검색 쿼리를 날릴 수 있어서 유연함
  4. Python, JavaScript SDK 제공 → 초보자도 빠르게 실습 가능

한마디로 말하면, 검색 가능한 인공지능 데이터 저장소라고 생각하시면 딱이에요.

다음 섹션에서는 Weaviate의 핵심 기능을 하나씩 뜯어보며, 실제 어떻게 쓰는지 보여드릴게요.

2. 핵심 기능과 사용법

이제 Weaviate의 대표 기능들을 하나하나 살펴볼게요. 단순한 저장소가 아니라, 정말 스마트한 검색 시스템이라는 걸 바로 느끼실 거예요.

🔍 (1) Vector Search – 의미 기반 검색

Weaviate의 핵심은 단연 벡터 검색입니다. 단어 하나하나에만 의존하지 않고, 문장의 의미 자체를 비교해 유사한 정보를 찾아주죠.

  • “사과”라는 단어 입력 → [0.11, -0.23, 0.88, ...] 같은 벡터로 변환
  • 그 벡터와 가장 가까운 벡터들 반환 (코사인 유사도 등 사용)

🤖 (2) Built-in Vectorization – 벡터 자동 생성

텍스트를 벡터로 바꾸는 데 필요한 임베딩 모델도 Weaviate가 자동으로 처리해줄 수 있어요. OpenAI, Cohere, HuggingFace 모델을 연결하면 텍스트를 넣는 순간 벡터가 자동 생성됩니다.

직접 생성한 벡터도 사용할 수 있어서 BYOV(Bring Your Own Vector) 전략도 가능하죠.

📐 (3) 스키마 기반 모델링 – 직관적 구조 설계

RDB처럼 스키마를 정의할 수 있어요. 예를 들어 블로그 글을 저장하고 싶다면 아래처럼 스키마를 만들 수 있죠:

{
  "class": "Article",
  "properties": [
    {"name": "title", "dataType": ["text"]},
    {"name": "content", "dataType": ["text"]}
  ]
}

🧩 (4) GraphQL & REST API – 자유로운 쿼리

GraphQL로 벡터 검색을 할 수 있는 점이 굉장히 매력적이에요. 물론 REST API나 Python SDK도 제공돼서 사용자의 상황에 맞게 선택 가능하죠.

🔀 (5) Hybrid Search – 벡터와 키워드의 만남

벡터 검색만으로는 부족할 때가 있어요. 그래서 벡터 + 키워드를 함께 사용하는 하이브리드 검색이 중요하죠.

예를 들어 “벡터 검색”이라는 키워드를 기준으로 하되, 의미적으로 관련된 문서도 함께 찾아주는 거예요. 정확도와 유연성을 모두 챙길 수 있죠.

다음 섹션에서는 이런 기능이 실제로 어떻게 구조적으로 작동하는지, 내부 구성과 흐름을 시각적으로 설명해드릴게요.

3. 내부 구조와 데이터 흐름

이제 Weaviate가 내부적으로 어떻게 구성되어 있는지 살펴볼 차례예요. 단순히 벡터를 저장하는 게 아니라, 검색 효율성과 유연성을 위한 다양한 컴포넌트가 조화롭게 돌아가고 있답니다.

🧱 구성 요소 요약

  • 스키마(Schema) – 클래스(Class)와 속성(Properties) 구조를 정의
  • 벡터 인덱스(Vector Index) – HNSW 방식으로 빠른 유사도 검색 수행
  • 벡터화기(Vectorizer) – 텍스트를 벡터로 바꾸는 모듈 (ex. OpenAI)
  • 저장소(Storage) – 실제 데이터를 저장하는 물리적인 위치
  • API 서버 – GraphQL / REST / gRPC 쿼리 처리

🔗 데이터 흐름 요약

[입력 데이터]
     ↓
[Vectorizer - ex. OpenAI]
     ↓
[HNSW 인덱스 등록]
     ↓
[Storage에 영구 저장]
     ↓
[API 서버를 통해 검색/조회 처리]

특히 HNSW (Hierarchical Navigable Small World) 인덱싱 방식은, 수천만 개 이상의 벡터에서도 빠르게 유사도를 계산할 수 있도록 도와주는 핵심 엔진이에요.

📊 구성 구조 요약 표

컴포넌트 역할
Schema 클래스/속성 정의 (데이터 구조 설계)
Vectorizer 텍스트 → 벡터 임베딩 변환
Index (HNSW) 벡터 간 유사도 탐색용 고속 인덱스
Storage 영구 데이터 저장 공간
API 서버 GraphQL/REST 등 외부 요청 처리

전체적으로 보면 Weaviate는 검색 속도와 정확도를 위해 벡터 구조 + 검색 인덱스 + API 인터페이스를 유기적으로 연결한 모듈형 구조라고 볼 수 있어요.

자, 이제 이 멋진 구조를 실습해보는 차례예요. 다음 장에서는 Docker로 직접 설치해보고, Python으로 데이터를 넣고 검색까지 해볼 거예요!

4. 설치와 환경 구성

Weaviate는 설치가 정말 간단해요. Docker만 설치되어 있다면, 명령어 몇 줄이면 바로 실행 가능합니다. 별도의 빌드나 복잡한 설정 없이도 로컬 테스트가 가능하다는 점이 아주 큰 장점이죠.

🚀 Docker 명령어로 바로 실행

docker run -d \
  -p 8080:8080 \
  -e QUERY_DEFAULTS_LIMIT=25 \
  -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
  -e PERSISTENCE_DATA_PATH="/var/lib/weaviate" \
  -v $(pwd)/weaviate_data:/var/lib/weaviate \
  semitechnologies/weaviate:latest

위 명령어를 터미널에 입력하면 localhost:8080에서 Weaviate가 실행됩니다. 브라우저에서 접속하면 JSON 형태의 API 테스트도 바로 해볼 수 있어요.

📦 Docker Compose를 이용한 설정 예시

OpenAI API와 연동하고 싶다면 아래처럼 text2vec-openai 벡터화 모듈을 설정할 수 있어요. Docker Compose를 활용하면 더 깔끔하게 관리할 수 있죠.

version: "3.8"
services:
  weaviate:
    image: semitechnologies/weaviate:1.25
    restart: always
    ports:
      - "8080:8080"
      - "50051:50051"   # gRPC
    environment:
      - QUERY_DEFAULTS_LIMIT=20
      - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true
      - PERSISTENCE_DATA_PATH=/var/lib/weaviate
      - DEFAULT_VECTORIZER_MODULE=text2vec-openai
      - OPENAI_APIKEY=${OPENAI_API_KEY}
    volumes:
      - ./weaviate_data:/var/lib/weaviate

🛠 설치 전 준비 사항

  • Docker가 설치되어 있어야 합니다. (필수)
  • OpenAI API 키가 필요할 수 있어요 (vectorizer를 사용할 경우)
  • localhost:8080 포트가 열려 있어야 브라우저에서 접근 가능해요

이제 설치가 끝났으니, 본격적으로 Python 코드로 데이터를 넣고 검색하는 실습을 해볼 시간입니다. 다음 장에서는 실제 데이터를 벡터로 저장하고, 유사도를 기준으로 검색하는 흐름을 단계별로 보여드릴게요.

5. Python으로 실습해보기

Weaviate를 제대로 이해하려면 직접 데이터를 넣어보고 검색해보는 게 최고입니다. Python SDK를 통해 스키마 생성 → 데이터 삽입 → 벡터 검색까지 한 번에 해보죠.

🐍 Step 1: Python 클라이언트 설치 및 연결

pip install -U weaviate-client
import weaviate

client = weaviate.Client("http://localhost:8080")

로컬에서 실행 중인 Weaviate 인스턴스에 바로 연결할 수 있어요.

📐 Step 2: 스키마 정의

schema = {
  "class": "Document",
  "properties": [{"name": "text", "dataType": ["text"]}]
}
client.schema.create_class(schema)

클래스 이름은 "Document"로, 텍스트 필드 하나만 가진 단순 구조예요. 실습에 딱 좋죠.

📝 Step 3: 데이터 삽입

client.data_object.create(
    data_object={"text": "Weaviate는 벡터 검색 엔진입니다."},
    class_name="Document"
)

이제 DB에 하나의 문장이 벡터와 함께 저장되었어요. 자동 임베딩 기능이 켜져 있다면 백그라운드에서 이미 벡터화도 완료됩니다.

🔍 Step 4: 유사도 기반 검색

result = client.query.get("Document", ["text"]) \
    .with_near_text({"concepts": ["벡터 검색"]}) \
    .with_limit(3) \
    .do()

print(result)

“벡터 검색”이라는 개념과 유사한 문장을 3개까지 반환해달라는 쿼리예요. 실제로 실행해보면 매우 직관적인 결과가 출력됩니다.

⚡️ Step 5: 하이브리드 검색 (선택)

coll = client.collections.get("Document")

result = coll.query.hybrid("벡터 검색", limit=3, alpha=0.7)

alpha는 벡터 검색(1.0)과 키워드 검색(0.0)의 비율이에요. 0.7이면 벡터 기반 검색을 좀 더 신뢰하겠다는 뜻이죠.

자, 이렇게 해서 Weaviate의 전체 사용 흐름을 실습으로 따라와봤어요. 이제 마지막으로 RAG 시스템 안에서 Weaviate가 어떻게 동작하는지, 실전 활용 사례를 통해 정리해드릴게요!

6. RAG 구성에서의 역할과 활용 사례

GPT 같은 대형 언어 모델(LLM)이 아무리 똑똑해도, 최근 정보나 사내 문서처럼 사전 학습에 없는 데이터는 몰라요. 그걸 해결해주는 게 바로 RAG(Retrieval-Augmented Generation) 구조이고, 이 구조에서 Weaviate는 핵심 역할을 합니다.

📊 RAG 구조 속 Weaviate의 흐름

[사용자 질문 입력]
     ↓
[Embedding 모델로 벡터화] ← OpenAI / BGE / HuggingFace
     ↓
[Weaviate 벡터 검색]
     ↓
[유사 문서 반환]
     ↓
[LLM에게 문맥 제공 → 응답 생성]

즉, LLM이 잘 모르는 분야에 대해도 정확한 정보를 기반으로 응답할 수 있게 도와주는 정보 검색 파트너 역할을 하는 셈이죠.

📌 대표 활용 사례 4가지

사용 사례 설명
RAG 시스템 LLM이 벡터 검색 결과를 참조해 더 정확하고 사실 기반의 응답 생성
FAQ 챗봇 질문을 벡터로 바꿔 유사 질문·답변을 찾아주는 고객 지원 시스템
이미지 검색 이미지를 벡터로 임베딩 후, 유사한 이미지 추천 (멀티모달 활용 가능)
추천 시스템 사용자 행동을 벡터화하고, 유사 사용자 또는 아이템을 추천

🤖 GPT와 Weaviate를 연결한 예시

question = "하이브리드 검색의 장점은 뭐야?"
context = "\n".join([o["content"] for o in hybrid_result.objects])
prompt = f"문맥:\n{context}\n\n질문: {question}\n답:"
response = openai.ChatCompletion.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content.strip())

이처럼 Weaviate가 제공하는 정보로 GPT가 더 정교한 답변을 만들 수 있어요. 이게 바로 "생성 + 검색 = RAG"의 힘입니다.

마지막 STEP에서는 지금까지 정리한 내용을 간단히 요약하고, Weaviate를 도입할 때 유의해야 할 점과 추천하는 학습 방향도 함께 안내해드릴게요!

마무리하며: 왜 지금 Weaviate를 배워야 할까?

지금까지 Weaviate의 정의부터 구조, 설치, 실습, 그리고 RAG 시스템에서의 활용까지 살펴봤어요. 핵심은 간단해요. Weaviate는 단순한 DB가 아니라, AI 시대의 검색 엔진이라는 점입니다.

GPT처럼 거대한 언어모델이 등장하면서, 벡터 기반의 의미 검색은 필수가 되었고, Weaviate는 그 중심에서 가장 널리 쓰이는 오픈소스 플랫폼으로 떠오르고 있어요.

Python, Docker, GraphQL을 조금만 다뤄본 분이라면 누구나 쉽게 설치하고 실험할 수 있다는 점도 정말 큰 장점이에요. 특히 RAG 프로젝트를 기획 중이라면 지금 당장 도입을 고려해보셔도 좋습니다.

📌 요약 정리

  • Weaviate는 벡터 + 키워드 검색이 가능한 오픈소스 DB입니다.
  • 설치는 Docker 하나면 충분하며, Python SDK로 쉽게 실습 가능해요.
  • RAG 구조에 완벽하게 어울리는 백엔드 검색 솔루션이에요.

지금 배우고 써보는 게 곧 실전이 되는 시대입니다. 여러분이 만들 AI 서비스, 챗봇, 검색 시스템 속에 Weaviate가 들어간다면, 그건 단순한 도입이 아니라 확실한 업그레이드예요.

반응형