FAISS Github
: "Faiss is a library for efficient similarity search and clustering of dense vectors."
이전 시간에 랭체인과 랭스미스(? 이렇게 부르는 거 맞나), 랭그래프에 대한 간략한 개요를 알아보았다.
지피티가 제공해주는 답변에서, FAISS를 예시로 드는 경우가 많았다.
이에 대해서 알아보고 넘어가자.
FAISS(Facebook AI Similarity Search)는 LLM 기반 시스템에서 매우 자주 사용되며,
주로 LangChain의 벡터 검색(Retrieval) 단계에서 사용된다.
FAISS는 RAG (Retrieval-Augmented Generation) 구조에서 다음 위치에 해당한다:
[사용자 질문]
↓
[질문 임베딩] ←─── LLM 또는 임베딩 모델 사용
↓
🔎 [FAISS: 벡터 검색기]
↓
[관련 문서 청크 반환]
↓
[LLM으로 응답 생성]
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 1. 문서 청크 생성
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
chunks = splitter.split_documents(documents)
# 2. 문서 임베딩
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
# 3. 벡터 검색 → 질의응답 체인에서 사용
retriever = vectorstore.as_retriever()
qa_chain = RetrievalQA.from_chain_type(llm=ChatOpenAI(), retriever=retriever)
| 이유 | 설명 |
|---|---|
| 🔍 빠른 검색 | 수천~수백만 개 벡터 중에서도 빠르게 유사 벡터 검색 |
| 💾 로컬 저장 | 클라우드가 필요 없는 로컬 벡터 DB |
| 🔧 커스터마이징 | 다양한 검색 알고리즘(index type) 지원 |
| 🆓 오픈소스 | 무료로 사용 가능 (C++ 기반 + Python 바인딩) |
| 항목 | 내용 |
|---|---|
| FAISS 위치 | 문서 임베딩을 저장하고, 질문 임베딩과 유사한 청크를 찾는 벡터 검색 단계 |
| LangChain 내 사용 | FAISS.from_documents() 등으로 벡터 저장소 생성 후 검색에 활용 |
| RAG 내 위치 | "질문 → 임베딩 → 유사 문서 검색" 과정에서 핵심 |
Q. FAISS는 벡터 DB가 아니고, 벡터 검색을 지원하는 라이브러리일뿐?
A. FAISS는 데이터베이스(DB)가 아니고, “벡터 검색 엔진 라이브러리” 에 가깝다.
✅ 한줄 요약
👉 “FAISS는 벡터 검색을 위한 빠른 라이브러리고, Milvus 같은 건 벡터 검색 + 메타데이터 관리까지 되는 ‘데이터베이스’.”
👉 즉, 저장·관리·메타데이터 기능은 없고,
👉 “메모리에 로드한 벡터에 대해 검색” 만 수행한다.
아래는 FAISS와 벡터DB를 비교한 표이다.
| 특징 | FAISS | Milvus / Weaviate / Pinecone (벡터DB) |
|---|---|---|
| 역할 | 벡터 유사도 검색 라이브러리 | 벡터 + 메타데이터를 저장/관리 + 검색 |
| 저장 기능 | ❌ 없음 (메모리에만 유지) | ✅ 있음 (DB처럼 영구 저장 가능) |
| 메타데이터 관리 | ❌ 안 됨 | ✅ 필드/속성 같이 저장 가능 |
| 검색 방식 | IVF, HNSW, PQ 등 인덱스 방식 지원 | 내부적으로 FAISS/HNSW 기반 기술도 사용 |
| 배포 방식 | 파이썬/CPP 라이브러리 (pip 설치) | 서버/클라우드 서비스 형태 (Milvus 서버 실행 필요) |
| GPU | ✅ 지원 | ✅ 지원 (설정에 따라) |
그럼 정리해보자.
🔍 정리
- FAISS = 벡터를 “검색”하는 라이브러리
- Milvus/Weaviate/Pinecone = 벡터를 “저장 + 관리 + 검색”하는 DB
➡ 그래서 Milvus 같은 벡터DB 내부에서도
👉 “유사도 검색 엔진”으로 FAISS를 선택적으로 사용할 수 있다.
📌 FAISS를 직접 쓸 때
- 데이터셋이 크지 않고, 서버 없이 “파일 + 메모리”로 검색할 때.
- GPU 기반 초고속 검색이 필요할 때.
- DB 관리 기능이 필요 없는 연구/개발 단계.
📌 FAISS 안 써도 될 때
- 서비스 운영, 메타데이터 관리, 필터 검색이 필요할 때 → Milvus, Weaviate 같은 DB로 바로 가는 게 낫다.
FAISS가 CPU/GPU를 모두 지원한다는 의미를 자세히 알아보자.
(사실 CPU/GPU에 대한 정확한 개념을 알고 있지 않은 상태이다. 이 기회를 통해 더 알아가자!)
| 항목 | CPU | GPU |
|---|---|---|
| 역할 | 일반적인 컴퓨팅 연산 | 병렬 연산에 최적화 (특히 벡터/행렬 계산) |
| 장점 | 범용성, 유연함 | 대량 벡터 연산 시 훨씬 빠름 |
| 단점 | 병렬 처리에 한계 | 일반 연산엔 과도한 리소스일 수 있음 |
FAISS는 내부적으로 고차원 벡터 간의 유사도 계산을 매우 많이 수행한다.
이때 FAISS는:
| 벡터 개수 | CPU 처리 속도 | GPU 처리 속도 |
|---|---|---|
| 10,000개 | 약간 느림 | 빠름 |
| 1,000,000개 | 매우 느림 | 훨씬 빠름 |
| 설치 명령어 | 설명 |
|---|---|
pip install faiss-cpu | CPU 전용 버전 |
pip install faiss-gpu | GPU(CUDA) 가속 지원 버전 |
Conda 사용 시: conda install -c pytorch faiss-gpu | 환경에 따라 CUDA 자동 적용 |
| 항목 | 내용 |
|---|---|
| "지원한다"는 뜻 | FAISS가 연산을 CPU에서도 하고, GPU(CUDA)에서도 수행 가능하다는 의미 |
| 왜 중요한가? | 대량 벡터 검색 시 속도 향상을 위해 GPU 연산이 필수인 경우가 많음 |
| 언제 GPU가 필요한가? | 벡터 개수가 많고 검색 속도가 중요할 때 (예: 10만 개 이상) |
대량의 벡터 연산이나 데이터 처리가 필요한 상황에서는 GPU를 선호한다. 이유가 뭘까?
| 이유 | 설명 |
|---|---|
| 병렬 처리에 최적화 | GPU는 수천 개의 코어를 이용해 동시에 연산 가능 (벡터 유사도 계산에 딱 맞음) |
| 속도 향상 | CPU보다 수십~수백 배 빠르게 검색 가능 (특히 수십만~수백만 벡터일 때) |
| 스케일 대응력 | 사용자가 많아지고, 처리할 문서나 질문 수가 많을수록 성능 차이가 확연히 드러남 |
| 상황 | CPU로 하면 | GPU로 하면 |
|---|---|---|
| 1만 개 벡터 검색 | 괜찮음 | 더 빠름 |
| 100만 개 벡터 검색 | 수 초~수십 초 | 0.1~1초 이내 가능 |
| 실시간 챗봇 수천 명 동시 접속 | 병목 발생 가능 | 부드럽게 처리 가능 |
"처리해야 할 벡터가 많고, 빠른 응답이 중요하면 → GPU 선택이 유리"
"문서 개수 적고, 요청량이 적으면 → CPU도 충분"