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()
        );

    生成したベクトルデータをローカルに保存する

    インデックスデータなどを保存するには、FaissStoresaveを利用します。ここに保存したいディレクトリのパスを指定しましょう。

    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などに保存できるようになったらさらに便利そうなので、そこもまたしらべてみようとおもいます。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark