Summary

https://github.com/facebookresearch/faiss

  • dense vectors の類似検索とクラスタリングのためのライブラリ
  • RAM に収まらないケース向けのアルゴリズムも含む
  • C++ で記述されて、PYthon numpy が Warpper

メモリが足りないケースへの対応

  • ベクトルの精度を落として圧縮表現する
  • Index 構造を構築する( HNSW や NSG) How to install (Quick Start)
  • pre-compiled for Python with anaconda
    • pipは?
  • C++なので依存がほぼない LIcense
  • MIT-License

メトリクス

  • d : 次元数
  • ベクトル精度 : 32-bit float
  • xb : DB
    • nb / d
  • xq : 検索
    • nq / d
  • nb : database size
  • nq: クエリサイズ?

Memo

Getting started · facebookresearch/faiss Wiki https://github.com/facebookresearch/faiss/wiki/Getting-started

使ってみた

https://github.com/facebookresearch/faiss/blob/main/INSTALL.md

  • pip install faiss-cpu
#checkov:skip=CKV_DOCKER_2: This image is used for event-driven lambda container
#checkov:skip=CKV_DOCKER_3: command is executed as the specific Lambda user

FROM public.ecr.aws/docker/library/python:3.12

# Copy function code
WORKDIR /app

COPY requirements.txt ./
RUN pip install -r requirements.txt 

COPY app.py ./

CMD [ "app.py" ]
docker build -t faiss-test .
docker run -it --rm --entrypoint bash faiss-test 

app.py

import numpy as np
d = 64                           # dimension
nb = 100000                      # database size
nq = 10000                       # nb of queries
np.random.seed(1234)             # make reproducible
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.

import faiss                   # make faiss available
index = faiss.IndexFlatL2(d)   # build the index
print(f"index.is_trained ${index.is_trained}")
index.add(xb)                  # add vectors to the index
print(f"index.ntotal ${index.ntotal}")

LangChain から使う

できればローカル embedding model 使って楽したい(精度は後から考える) 1.Embedding models | 🦜️🔗 LangChain https://python.langchain.com/v0.1/docs/integrations/text_embedding/

  • gpt4all は min 16GM RAM が必要
  • localAI は min4GB memory かつ 4GB disk space 必要
  • やっぱり Bedrock とか OpenAI 叩く方が楽かも?

1.langchain-ai/langchain-aws: Build LangChain Applications on AWS https://github.com/langchain-ai/langchain-aws

from langchain_aws import BedrockEmbeddings
from langchain_community.vectorstores import FAISS

embedding = BedrockEmbeddings(model_id="amazon.titan-embed-text-v1")

vectorstore = FAISS.from_texts(
    ["ありがとう"], embedding
)
# save
vectorstore.save_local("./vectorstore")