FAISS란? & CPU/GPU

wldbs._.·2025년 7월 30일

RAG

목록 보기
7/22
post-thumbnail

FAISS Github
: "Faiss is a library for efficient similarity search and clustering of dense vectors."

이전 시간에 랭체인과 랭스미스(? 이렇게 부르는 거 맞나), 랭그래프에 대한 간략한 개요를 알아보았다.
지피티가 제공해주는 답변에서, FAISS를 예시로 드는 경우가 많았다.
이에 대해서 알아보고 넘어가자.


FAISS(Facebook AI Similarity Search)는 LLM 기반 시스템에서 매우 자주 사용되며,
주로 LangChain의 벡터 검색(Retrieval) 단계에서 사용된다.

1. FAISS에 대하여

🔍 FAISS란?

  • Facebook AI Similarity Search의 약자.
  • 고차원 벡터를 빠르게 검색하기 위한 라이브러리.
  • 문서 임베딩을 저장하고, 질문과 유사한 문서 청크를 찾아내는 데 사용됨.
  • CPU/GPU 모두 지원하고, 대규모 데이터셋에도 빠른 성능 제공.

🧩 LLM 시스템 내에서의 위치

FAISS는 RAG (Retrieval-Augmented Generation) 구조에서 다음 위치에 해당한다:

[사용자 질문]
      ↓
[질문 임베딩] ←─── LLM 또는 임베딩 모델 사용
      ↓
🔎 [FAISS: 벡터 검색기]
      ↓
[관련 문서 청크 반환]
      ↓
[LLM으로 응답 생성]

✅ LangChain에서의 FAISS 사용 예시

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)

🧠 FAISS를 사용하는 이유

이유설명
🔍 빠른 검색수천~수백만 개 벡터 중에서도 빠르게 유사 벡터 검색
💾 로컬 저장클라우드가 필요 없는 로컬 벡터 DB
🔧 커스터마이징다양한 검색 알고리즘(index type) 지원
🆓 오픈소스무료로 사용 가능 (C++ 기반 + Python 바인딩)

📦 LangChain 외 사용 사례

  • FAISS는 LangChain 외에도 HuggingFace, Haystack, LlamaIndex 등에서도 벡터 검색기로 사용된다.

🧭 요약

항목내용
FAISS 위치문서 임베딩을 저장하고, 질문 임베딩과 유사한 청크를 찾는 벡터 검색 단계
LangChain 내 사용FAISS.from_documents() 등으로 벡터 저장소 생성 후 검색에 활용
RAG 내 위치"질문 → 임베딩 → 유사 문서 검색" 과정에서 핵심

❓ 의문점

Q. FAISS는 벡터 DB가 아니고, 벡터 검색을 지원하는 라이브러리일뿐?
A. FAISS는 데이터베이스(DB)가 아니고, “벡터 검색 엔진 라이브러리” 에 가깝다.

✅ 한줄 요약
👉 “FAISS는 벡터 검색을 위한 빠른 라이브러리고, Milvus 같은 건 벡터 검색 + 메타데이터 관리까지 되는 ‘데이터베이스’.”

👉 즉, 저장·관리·메타데이터 기능은 없고,
👉 “메모리에 로드한 벡터에 대해 검색” 만 수행한다.

아래는 FAISS와 벡터DB를 비교한 표이다.

특징FAISSMilvus / 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로 바로 가는 게 낫다.


2. FAISS - CPU/GPU

FAISS가 CPU/GPU를 모두 지원한다는 의미를 자세히 알아보자.
(사실 CPU/GPU에 대한 정확한 개념을 알고 있지 않은 상태이다. 이 기회를 통해 더 알아가자!)

✅ 기본 개념: CPU vs GPU

항목CPUGPU
역할일반적인 컴퓨팅 연산병렬 연산에 최적화 (특히 벡터/행렬 계산)
장점범용성, 유연함대량 벡터 연산 시 훨씬 빠름
단점병렬 처리에 한계일반 연산엔 과도한 리소스일 수 있음

🔍 FAISS에서의 의미

FAISS는 내부적으로 고차원 벡터 간의 유사도 계산을 매우 많이 수행한다.

  • 예: 질문 임베딩과 10만 개 문서 임베딩을 비교.

이때 FAISS는:

  • CPU 버전: 일반적인 환경에서 잘 작동 (기본 설치 시 사용됨)
  • GPU 버전: 수십~수백만 개 벡터를 다룰 때 훨씬 빠름 (NVIDIA CUDA 기반)

🧪 예시 시나리오

벡터 개수CPU 처리 속도GPU 처리 속도
10,000개약간 느림빠름
1,000,000개매우 느림훨씬 빠름

🛠️ FAISS 설치 방식에 따른 차이

설치 명령어설명
pip install faiss-cpuCPU 전용 버전
pip install faiss-gpuGPU(CUDA) 가속 지원 버전
Conda 사용 시: conda install -c pytorch faiss-gpu환경에 따라 CUDA 자동 적용
  • GPU 버전은 NVIDIA 드라이버와 CUDA Toolkit이 필요하다.

📌 요약

항목내용
"지원한다"는 뜻FAISS가 연산을 CPU에서도 하고, GPU(CUDA)에서도 수행 가능하다는 의미
왜 중요한가?대량 벡터 검색 시 속도 향상을 위해 GPU 연산이 필수인 경우가 많음
언제 GPU가 필요한가?벡터 개수가 많고 검색 속도가 중요할 때 (예: 10만 개 이상)

3. 💁‍♀️ 추가: 대량 처리 시 GPU

대량의 벡터 연산이나 데이터 처리가 필요한 상황에서는 GPU를 선호한다. 이유가 뭘까?

✅ 왜 GPU를 선호할까?

이유설명
병렬 처리에 최적화GPU는 수천 개의 코어를 이용해 동시에 연산 가능 (벡터 유사도 계산에 딱 맞음)
속도 향상CPU보다 수십~수백 배 빠르게 검색 가능 (특히 수십만~수백만 벡터일 때)
스케일 대응력사용자가 많아지고, 처리할 문서나 질문 수가 많을수록 성능 차이가 확연히 드러남

🧠 언제 GPU가 특히 유리한가?

  • 🔍 RAG 시스템에서 벡터 DB가 수십만 건 이상일 때
  • 🧾 사용자 실시간 질의응답에서 빠른 응답속도가 중요한 경우
  • 🤖 멀티 에이전트 시스템에서 벡터 연산이 반복적으로 발생할 때
  • 📦 임베딩을 대량으로 생성/저장할 때 (문서 ingestion 단계)

📌 실무 예

상황CPU로 하면GPU로 하면
1만 개 벡터 검색괜찮음더 빠름
100만 개 벡터 검색수 초~수십 초0.1~1초 이내 가능
실시간 챗봇 수천 명 동시 접속병목 발생 가능부드럽게 처리 가능

🔧 주의할 점

  • GPU를 쓰기 위해선 CUDA 환경 설정이 필요 (NVIDIA GPU 필요)
  • GPU는 비용이 높기 때문에, 데이터 양이 적거나 실시간성이 낮은 경우엔 CPU로 충분함

🧭 결론

"처리해야 할 벡터가 많고, 빠른 응답이 중요하면 → GPU 선택이 유리"
"문서 개수 적고, 요청량이 적으면 → CPU도 충분"

profile
공부 기록용 24.08.05~ #LLM #RAG

0개의 댓글