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")