생성형 AI가 발전하면서 환각 없는 생성형 콘텐츠의 중요성이 확대됐고, 환각을 최소화하는 방안으로 RAG가 각광받고 있습니다.
또한, RAG를 위해서는 벡터 DB가 반드시 필요합니다.
특징 | 전통적인 데이터베이스 (RDB, NoSQL) | 벡터 데이터베이스 (벡터 DB) |
---|---|---|
데이터 타입 | 정형 데이터 (숫자, 문자열, 테이블) | 비정형 데이터 (이미지, 음성, 텍스트) |
기본 연산 | CRUD (Create, Read, Update, Delete) | 유사도 검색 (Nearest Neighbor Search) |
인덱싱 방식 | B-Tree, Hash Index | HNSW, IVF, PQ 등 |
쿼리 방식 | SQL, NoSQL 쿼리 | 벡터 유사도 검색 (Cosine Similarity, Euclidean Distance) |
응용 분야 | 전통적 Biz. Application (ERP, CRM, 금융) | AI 검색, 추천 시스템, 이미지/음성 검색 |
전통적인 데이터베이스는 ‘정확한 값을 찾는 데 강함’
벡터 데이터베이스는 ‘비슷한 것을 찾는 데 강함’
비교 항목 | KNN (K-Nearest Neighbors) | ANN (Approximate Nearest Neighbors) |
---|---|---|
정의 | 주어진 입력 벡터에 대해 가장 가까운 K개의 데이터를 찾아 분류 또는 회귀 수행 | 정확도보다는 속도와 효율성을 우선하여 근사적으로 최근접 이웃을 찾는 알고리즘 |
기본 개념 | 유클리디안 거리 등으로 거리 기반의 정확한 최근접 이웃 계산 | 효율적인 검색을 위해 인덱스 구조나 해싱 등을 사용하여 빠르게 근사 계산 |
정확도 | 매우 정확하지만 계산량이 많고 느림 | 약간의 정확도 손실이 있으나 속도가 빠름 |
속도 및 성능 | 느림 (특히 대규모 데이터에서는 매우 느림) | 매우 빠름 (특히 고차원 대용량 데이터에서 성능 우수) |
메모리 사용량 | 전체 데이터를 저장해야 하므로 큼 | 인덱스만 저장하므로 상대적으로 작음 |
확장성 | 낮음 – 데이터가 많아질수록 속도 급격히 저하 | 높음 – 수십억 개 벡터도 실시간 검색 가능 |
활용 분야 | - 분류(Classification) - 회귀(Regression) - 추천 시스템 - 이상 탐지 | - 대규모 이미지 검색 - 추천 시스템 - 문서 유사도 검색 - 임베딩 기반 검색 엔진 |
적합한 데이터 | 소규모, 고정된 데이터셋 | 대규모, 고차원 임베딩 데이터셋 |
KNN: 정확도는 높지만 속도와 확장성이 떨어짐. 소규모 데이터에 적합
ANN: 근사값을 이용하여 빠른 검색 가능. 대규모 벡터 검색에 적합
숫자나 텍스트(예: "홍길동") 같은 구조화된 데이터 저장·검색에는 최적화되어 있음
이미지, 음성, 문장 의미 같은 비정형 데이터 검색은 어려움
이미지, 영상, 음성, 텍스트 등 비정형 데이터의 확산으로 기존 관계형 DB만으로는 한계
ChatGPT, DALL·E, Stable Diffusion 등 생성형 AI 발전
이미지 검색, 음성 인식, 추천 시스템 등에는 고급 검색 필요
전통적인 데이터베이스에서는 유사도 검색의 비효율성
→ 벡터 DB 필요성 대두
자율주행 카메라에서 들어오는 영상 프레임을 실시간 벡터로 바꾸려면, 경량화된 모델 또는 하드웨어 가속이 필수입니다.
해결책:
벡터 DB는 수천만 개의 벡터 중에서 유사한 벡터를 빠르게 찾아야 함
해결책:
실시간 시스템은 단일 질의 성능뿐만 아니라 동시 다수 요청 처리 능력도 중요
해결책:
분야 | 사용 방식 |
---|---|
Tesla, Waymo | 실시간 영상에서 객체 인식 → 특징 벡터화 → 유사 장면 비교 및 판단 |
Amazon Go | 영상 기반 사용자 행동 벡터화 → 행동 패턴과 유사도 비교 |
스마트 CCTV | 얼굴 인식 결과를 벡터로 변환 → 유사 인물 탐지 |
실시간 유사도 검색은 가능하지만 고성능 하드웨어 + 최적화된 아키텍처 + 효율적인 알고리즘이 전제 조건입니다.
자율주행처럼 수밀리초 수준의 응답 시간이 요구되는 환경에서도 벡터 DB는 적극 활용되고 있습니다.
[5]
[3, 4]
[2, 5, 1]
[x, y] = [3, 4]
(지도상의 위치)[R, G, B] = [255, 0, 0]
(빨간색)벡터는 숫자로 이루어진 데이터의 표현 방식
[0.2, 0.8, 0.5, 0.1, …]
형태가 됨벡터 임베딩은 데이터를 숫자로 변환하는 중요한 과정
Word2Vec
: 단어의 의미를 숫자로 표현BERT
: 문장의 의미까지 이해할 수 있도록 표현CNN(합성곱 신경망)
을 이용해 이미지의 특징을 벡터로 변환MFCC
, Wave2Vec
등을 이용하여 음성을 벡터로 변환from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
text = "I love natural language processing."
tokens = tokenizer.tokenize(text)
print(tokens)
input_ids = tokenizer.encode(text, add_special_tokens=True)
print(input_ids)
Hugging Face의 transformers
라이브러리를 사용하면 BERT 모델을 쉽게 불러와 문장을 토큰화하고, 모델이 이해할 수 있는 입력 형식으로 변환할 수 있습니다.
→ 이 과정을 통해 음성을 숫자로 변환
import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt
audio_file = "example.wav"
y, sr = librosa.load(audio_file, sr=22050)
y
: 음성 신호sr
: 샘플링 레이트 (22050Hz)mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
plt.figure(figsize=(10, 4))
librosa.display.specshow(mfccs, x_axis="time")
plt.colorbar()
plt.title("MFCC")
plt.show()
설명
from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC
import torch
import librosa
processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-large-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-large-960h")
audio_file = "example.wav"
y, sr = librosa.load(audio_file, sr=16000)
input_values = processor(y, return_tensors="pt", sampling_rate=16000).input_values
with torch.no_grad():
logits = model(input_values).logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = processor.batch_decode(predicted_ids)[0]
print(transcription)
from transformers import pipeline
# 사전 학습된 모델을 사용한 감정 분석
classifier = pipeline('sentiment-analysis')
result = classifier("I love using Hugging Face!")
print(result)
pipeline
함수를 쓰면 감정 분석, 텍스트 요약, 질의응답 시스템 등을 쉽게 구현할 수 있음