FAISS: 고차원 벡터의 효율적인 유사성 검색 도구

AI 프로젝트를 위한 최고의 10개 벡터 데이터베이스

2023년을 위한 벡터 데이터베이스 선택: 비교 및 안내

Getting Started With Faiss

Building a Wardley Mapping Books AI Assistant Using Langchain, FAISS, and OpenAI — A Code Walkthrough

Advanced RAG- Cohere Re-Ranker

FAISS (Facebook AI Similarity Search)는 개발자가 서로 유사한 멀티미디어 문서의 임베딩을 빠르게 검색할 수 있게 해주는 라이브러리입니다. 이것은 전통적인 쿼리 검색 엔진이 해시 기반 검색에 최적화되어 있어 발생하는 제한 사항을 해결하고, 보다 확장 가능한 유사성 검색 기능을 제공합니다.

Facebook AI 유사성 검색, 줄여서 FAISS는 Facebook의 AI 팀에서 개발한 밀집 벡터의 효율적인 유사성 검색 및 클러스터링을 위한 라이브러리입니다. 대규모 데이터셋을 검색하여 대상 항목과 유사한 항목을 찾아야 하는 상황에서 도움을 줄 수 있도록 설계되었습니다. 간략한 개요는 다음과 같습니다:

  1. 목적: FAISS는 메모리 사용량과 속도에 중점을 둔 어떤 크기의 벡터 집합에서든 검색하는 데 사용됩니다. 매우 큰 데이터셋을 다룰 때 특히 유용합니다.
  2. 효율성: FAISS에는 밀리초 내에 수백만 개의 벡터를 검색할 수 있는 알고리즘이 포함되어 있습니다. CPU와 GPU 사용 모두에 최적화되어 있습니다.
  3. 사용 사례: 가장 가까운 이웃 검색과 같은 머신 러닝 작업에 자주 사용됩니다. 이는 추천 시스템, 클러스터링 및 다른 많은 AI 응용 프로그램에 필수적인 작업입니다.
  4. 통합: FAISS는 PyTorch와 같은 다른 머신 러닝 도구 및 라이브러리와 쉽게 통합될 수 있습니다.
  5. 오픈 소스: FAISS는 오픈 소스로, GitHub에서 누구나 사용, 수정, 기여할 수 있도록 코드가 제공됩니다.

FAISS를 프로젝트에 사용하려는 경우나 기술적 세부 사항에 대해 자세히 알고 싶다면 공식 문서와 GitHub 저장소를 확인하는 것을 추천합니다.

효율적인 유사성 검색

FAISS를 사용하면 개발자들은 표준 데이터베이스 엔진(SQL)으로는 비효율적이거나 불가능한 방식으로 멀티미디어 문서를 검색할 수 있습니다. FAISS는 메모리-속도-정확도의 트레이드오프를 최적화하는 백만에서 수십억 규모의 데이터셋을 위한 최근접 이웃 검색 구현을 포함하고 있습니다. FAISS의 목표는 모든 운영 포인트에 대해 최첨단의 성능을 제공하는 것입니다.

FAISS에는 어떤 크기의 벡터 집합에서도 검색하는 알고리즘이 포함되어 있으며, 평가 및 매개변수 튜닝을 위한 지원 코드도 포함되어 있습니다. 가장 유용한 알고리즘 중 일부는 GPU에서 구현되어 있습니다. FAISS는 C++로 구현되어 있으며, 선택적인 Python 인터페이스와 CUDA를 통한 GPU 지원이 있습니다.

설치하기

Faiss는 Python의 Anaconda를 위한 사전 컴파일된 라이브러리와 함께 제공됩니다. faiss-cpufaiss-gpu를 참조하세요. 라이브러리는 주로 C++로 구현되어 있으며, 유일한 의존성은 BLAS 구현입니다. 선택적인 GPU 지원은 CUDA를 통해 제공되며, Python 인터페이스도 선택 사항입니다. cmake로 컴파일됩니다. 자세한 내용은 INSTALL.md를 참조하세요.

Faiss의 작동 방식

Faiss는 벡터 집합을 저장하는 인덱스 유형을 중심으로 구축되며, L2 및/또는 내적 벡터 비교를 사용하여 그 안에서 검색하는 기능을 제공합니다. 일부 인덱스 유형은 정확한 검색과 같은 간단한 기준선입니다. 사용 가능한 색인 구조의 대부분은 다음과 관련된 다양한 트레이드오프에 해당합니다:

  • 검색 시간
  • 검색 품질
  • 인덱스 벡터당 사용되는 메모리
  • 훈련 시간
  • 추가 시간
  • 비지도 학습을 위한 외부 데이터 필요성

선택적 GPU 구현은 (2017년 3월 기준으로) 고차원 벡터에 대한 가장 빠른 정확하고 근사적 (압축 도메인) 최근접 이웃 검색 구현, 가장 빠른 로이드의 k-평균, 그리고 알려진 가장 빠른 작은 k-선택 알고리즘을 제공합니다. 구현에 대한 자세한 내용은 여기에 설명되어 있습니다.

How does FAISS handle large datasets?

Faiss는 대규모 데이터셋을 효과적으로 처리하기 위해 특별히 설계되었으며, 이를 위해 여러 전략과 기술을 사용합니다:

  1. 양자화: Faiss가 사용하는 주요 기술 중 하나는 벡터 양자화입니다. 이를 통해 고차원 벡터를 컴팩트한 코드로 압축할 수 있어 메모리 사용량을 크게 줄일 수 있습니다. Faiss에는 Product Quantization (PQ) 및 Scalar Quantization (SQ)과 같은 다양한 양자화 방법이 있습니다.
  2. 인덱싱 구조: Faiss는 다양한 시나리오에 맞게 맞춤화된 다양한 인덱싱 구조를 제공합니다. 예를 들어, IndexFlatL2는 정확한 검색을 위한 간단한 평면 구조이며, IndexIVFPQ는 효율적인 근사 검색을 위해 역파일 시스템과 제품 양자화를 결합합니다.
  3. GPU 가속: Faiss는 특히 대규모 데이터셋을 처리할 때 특정 연산을 가속화하기 위해 GPU를 활용합니다. GPU 구현은 종종 더 빠른 최근접 이웃 검색, k-평균 군집화 및 기타 연산을 제공합니다.
  4. 배치 처리: Faiss는 배치 처리를 지원하여 여러 쿼리를 동시에 병렬 처리할 수 있습니다. 이는 특히 대규모 데이터셋을 처리할 때 검색 작업을 가속화하는 데 유리합니다.
  5. 계층적 탐색 가능 소규모 세계 (HNSW) 및 NSG: 이것들은 Faiss의 고급 인덱싱 구조로, 검색을 더 효율적으로 만들기 위해 원시 벡터 위에 레이어를 추가합니다. 더 빠른 최근접 이웃 검색을 촉진하기 위해 계층적 그래프를 생성합니다.
  6. 재훈련 없이 추가: 일부 Faiss 인덱스는 완전한 재훈련 없이 새로운 벡터를 추가할 수 있게 해주어 시간이 지남에 따라 성장하는 동적 데이터셋에 적합합니다.
  7. 외부 메모리: RAM에 맞지 않는 너무 큰 데이터셋의 경우, Faiss는 디스크에 저장된 데이터로 작업할 수 있는 인덱스를 지원하여 전체 데이터셋을 메모리에 로드하지 않고도 효율적인 유사성 검색을 가능하게 합니다.
  8. 클러스터링: 인덱스를 구축하기 전에 Faiss는 중심이 벡터 그룹을 나타내는 k-평균 군집화를 사용하여 대규모 데이터셋을 클러스터링할 수 있습니다. 이로 인해 검색 공간이 줄어들어 검색이 가장 관련 있는 클러스터에 중점을 둘 수 있습니다.

요약하면, Faiss는 고차원 공간에서의 유사성 검색을 위한 솔루션으로, 대규모 데이터셋을 효율적으로 처리하고 검색하기 위해 기술, 알고리즘, 구조의 조합을 포함하고 있습니다.

Faiss는 실시간 검색에 적합한가요?

Faiss는 고차원 벡터 공간에서의 유사성 검색을 위해 특별히 설계되었으며, 많은 경우에 실시간 또는 거의 실시간 검색을 지원할 수 있습니다. 그러나 Faiss를 실시간 검색에 사용하는 것이 적합한지 여부는 몇 가지 요소에 따라 달라집니다:

  1. 데이터 크기: 사용하는 데이터셋의 크기에 따라 검색 시간이 달라질 수 있습니다. 작은 데이터셋의 경우 Faiss는 매우 빠른 검색을 제공할 수 있습니다.
  2. 인덱스 유형: Faiss는 다양한 인덱싱 구조를 제공합니다. 예를 들어, 정확한 검색을 위한 IndexFlatL2는 근사적 검색을 위한 IndexIVFPQ보다 더 빠를 수 있습니다.
  3. 하드웨어: GPU 가속을 활용하면 특히 대규모 데이터셋에서 검색 성능이 크게 향상될 수 있습니다.
  4. 검색 정밀도: 근사적 검색을 사용하면 정확도는 약간 감소하지만 검색 속도가 빨라질 수 있습니다.
  5. 동시 쿼리 처리: Faiss는 배치 처리를 지원하므로 여러 쿼리를 동시에 빠르게 처리할 수 있습니다.
  6. 데이터 업데이트 빈도: 자주 업데이트되는 동적 데이터셋의 경우, 인덱스를 자주 재구축해야 할 수 있습니다. 이는 실시간 검색에 영향을 줄 수 있습니다.

총망라하면, Faiss는 많은 상황에서 실시간 또는 거의 실시간 검색을 지원할 수 있습니다. 그러나 특정 애플리케이션의 요구 사항에 따라 적절한 인덱싱 전략과 하드웨어 구성을 선택해야 합니다.


Langchain, FAISS, 그리고 OpenAI를 이용하여 Wardley Mapping Books AI 어시스턴트 구축하기 – 코드 완전 해설

섹션 1: 파이썬 패키지 설치

이 섹션에서는 스크립트를 위해 필요한 파이썬 패키지를 설치합니다. 이에는 Langchain, OpenAI, tiktoken, PyPDF, 그리고 FAISS가 포함됩니다.

!pip install -q langchain
!pip install -q openai
!pip install -q tiktoken
!pip install -q pypdf
!pip install -q faiss-cpu

섹션 2: OpenAI API 키 설정

여기에서 GPT-4 AI 모델에 접근하기 위해 OpenAI API 키를 설정합니다. “your_openai_api_key_here”를 실제 API 키로 교체해야 합니다.

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

섹션 3: GitHub 저장소 복제 및 소스 문서 로딩

이제 GitHub 저장소에서 책을 복제합니다. 책은 이미 페이지별로 분리되어 있어 AI 어시스턴트가 응답할 때 소스 페이지를 식별하는 데 도움이 됩니다.

PDF 형식의 Wardley Mapping 책이 포함된 GitHub 저장소를 복제합니다.

!git clone https://github.com/tractorjuice/wardley_book_chat chatwithbook

로컬 디렉터리를 검색하여 모든 PDF 문서를 찾아 리스트에 저장합시다.

documents = []
for root, dirs, files in os.walk("/content/chatwithbook/source_docs"):
    for name in files:
        documents.append(os.path.join(root, name))

섹션 4: PDF를 텍스트로 변환하고 벡터 데이터베이스 생성

여기서는 PyPDFLoader를 사용하여 PDF 파일에서 텍스트를 추출하고 청크로 분할합니다. 여기에서 청크에 대한 자세한 정보를 찾을 수 있습니다.

pages = []
for files in documents:
    loader = PyPDFLoader(files)
    pages.extend(loader.load_and_split())

이제 OpenAIEmbeddings를 사용하여 임베딩을 생성합니다. 여기에서 임베딩에 대한 자세한 정보를 찾을 수 있습니다.

embeddings = OpenAIEmbeddings()

섹션 5: 벡터 스토어 저장

이제 임베딩을 인메모리 FAISS 벡터 데이터베이스에 저장합니다.

vector_store = FAISS.from_documents(pages, embeddings)

그런 다음 인메모리 벡터 데이터베이스를 로컬 디렉터리에 저장합니다. 이 파일들은 나중에 Streamlit을 사용하여 구축된 프론트엔드 UI와 함께 사용됩니다.

vector_store.save_local("/content/chatwithbook/data_store")

섹션 6: 벡터 스토어 로딩

텍스트 쿼리를 수행하고 파일에서 재사용할 수 있도록 벡터 스토어를 다시 로드합시다.

vector_store = FAISS.load_local(
    "/content/chatwithbook/data_store",
    OpenAIEmbeddings()
)

섹션 7: 채팅 모델 및 프롬프트 설정

OpenAI를 위한 프롬프트를 설정합시다. 다양한 프롬프트로 자유롭게 플레이 해보세요.

system_template = """다음 컨텍스트 조각을 사용하여 사용자의 질문에 답하십시오.
출처를 참고하고 답변에 "SOURCES: source1 source2" 형식으로 포함시키십시오. 출처 수에 관계없이 "SOURCES"를 대문자로 사용하십시오.
답을 모르면 "모르겠습니다"라고 말하십시오, 답을 만들려고 시도하지 마십시오.
----------------
{summaries}"""
messages = [
    SystemMessagePromptTemplate.from_template(system_template),
    HumanMessagePromptTemplate.from_template("{question}")
]
prompt = ChatPromptTemplate.from_messages(messages)

Langchain 라이브러리를 사용하여 채팅 모델과 프롬프트를 설정하고, ChatOpenAI 모듈을 사용하여 OpenAI 모델과 인터페이스합니다.

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0, max_tokens=256)
chain = RetrievalQAWithSourcesChain.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vector_store.as_retriever(),
    return_source_documents=True,
    chain_type_kwargs=chain_type_kwargs
)

섹션 8: 벡터 쿼리하기

작동하는지 확인하려면 빠른 쿼리를 실행해 봅시다. 이 섹션에서는 사용자의 질문으로 벡터 스토어를 쿼리하는 방법을 보여줍니다. chain 객체는 벡터 스토어를 검색하고 응답을 생성하는데 사용된 소스와 함께 답변을 반환하는 데 사용됩니다.

query = "who is Simon Wardley"
result = chain(query)

여기서 사용자의 질문과 AI 어시스턴트의 답변을 출력합니다.

print(result['question'])
print(result['answer'])

마지막으로 답변을 생성하는데 사용된 소스를 출력합니다. 이를 통해 사용자는 정보를 확인하고 원하는 경우 소스 자료를 더 자세히 살펴볼 수 있습니다.

source_documents = result['source_documents']
for index, document in enumerate(source_documents):
    print(f"\n\nSource {index + 1}:")
    print(f"  Page Content: {document.page_content}")

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다