AI / MLJavaScriptLangChain.jsLLMNode.js

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

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts