Faiss-node + LangChainでEmbeddingしたベクトルデータをローカルファイルに保存・ロードする
LangChainでRAGを作る際、Embedding APIで作ったベクトルデータを保存する方法として、faissを試しました。Node.jsで動作するfaiss-nodeを使用し、FaissStoreを利用することでベクトルデータを生成し、保存できます。保存したデータを利用して検索する場合も、FaissStoreのloadメソッドを使用します。保存したファイルからベクトルデータを読み込むことができます。これにより、より手軽にRAGのデモやPoCを作成できるようになります。また、Amazon S3やCloudflare R2に保存することも検討しています。
目次
LangChainでRAGを作る際、Embedding APIで作ったベクトルデータをどこに保存するかが重要な課題となります。さまざまなサービスを試してはいますが、ローカル環境で手軽に試す方法として、faissについても触ってみました。
Node版のfaissをインストールする
Faiss自体はCなどで動くものの様子です。これをNode.jsでうごくようにしたのがfaiss-node
・・・という理解であっている(はず)です。
$ npm i langchain faiss-node
LangChainとFaissでベクトルデータを生成する
LangChainがこの手のライブラリを抽象化してくれるので、FaissStore
を利用してvectorStore
を作るだけでいけます。
const vectorStore = await FaissStore.fromTexts(
["Hello world", "Bye bye", "hello nice world"],
[{ id: 2 }, { id: 1 }, { id: 3 }],
new OpenAIEmbeddings()
);
生成したベクトルデータをローカルに保存する
インデックスデータなどを保存するには、FaissStore
のsave
を利用します。ここに保存したいディレクトリのパスを指定しましょう。
faissApp.get('save', async c => {
const vectorStore = await FaissStore.fromTexts(
["Hello world", "Bye bye", "hello nice world"],
[{ id: 2 }, { id: 1 }, { id: 3 }],
new OpenAIEmbeddings({
openAIApiKey: process.env.OPENAI_API_KEY
})
);
await vectorStore.save(path.join(__dirname, '../vector-store'));
return c.text('done');
})
実行すると、JSONファイルとIndexファイルの2つが生成されます。
$ ls vector-store/
docstore.json faiss.index
ローカルに保存したファイルから、ベクトルデータを読み込む
保存したデータを検索に使ってみましょう。ファイルを読み込む場合は、FaissStore.load
にディレクトリのパスとEmbeddingに利用するモデルを渡してやります。
faissApp.get('load', async c => {
const vectorStore = await FaissStore.load(
path.join(__dirname, '../vector-store'),
new OpenAIEmbeddings({
openAIApiKey: process.env.OPENAI_API_KEY
})
);
const resultOne = await vectorStore.similaritySearch("hello world", 1);
return c.json(resultOne)
})
非常に簡単に作れました。
Faissを使ってみて
これまでローカルにインデックスデータを保存する場合、JSONデータのみを保存して、メモリー系のVectorStoreを使う方法をとっていました。しかしFaissを使える環境では、インデックス自体も保存・読み込みができるので、より手軽にRAGのデモやPoCが作れそうです。
あとは・・・Amazon S3やCloudflare R2などに保存できるようになったらさらに便利そうなので、そこもまたしらべてみようとおもいます。