HNSWLib
Compatibility
Only available on Node.js.
HNSWLib is an in-memory vectorstore that can be saved to a file. It uses HNSWLib.
Setup
caution
On Windows, you might need to install Visual Studio first in order to properly build the hnswlib-node
package.
You can install it with
- npm
- Yarn
- pnpm
npm install hnswlib-node
yarn add hnswlib-node
pnpm add hnswlib-node
- npm
- Yarn
- pnpm
npm install @langchain/openai @langchain/community
yarn add @langchain/openai @langchain/community
pnpm add @langchain/openai @langchain/community
Usage
Create a new index from texts
import { HNSWLib } from "@langchain/community/vectorstores/hnswlib";
import { OpenAIEmbeddings } from "@langchain/openai";
const vectorStore = await HNSWLib.fromTexts(
["Hello world", "Bye bye", "hello nice world"],
[{ id: 2 }, { id: 1 }, { id: 3 }],
new OpenAIEmbeddings()
);
const resultOne = await vectorStore.similaritySearch("hello world", 1);
console.log(resultOne);
API Reference:
- HNSWLib from
@langchain/community/vectorstores/hnswlib
- OpenAIEmbeddings from
@langchain/openai
Create a new index from a loader
import { HNSWLib } from "@langchain/community/vectorstores/hnswlib";
import { OpenAIEmbeddings } from "@langchain/openai";
import { TextLoader } from "langchain/document_loaders/fs/text";
// Create docs with a loader
const loader = new TextLoader("src/document_loaders/example_data/example.txt");
const docs = await loader.load();
// Load the docs into the vector store
const vectorStore = await HNSWLib.fromDocuments(docs, new OpenAIEmbeddings());
// Search for the most similar document
const result = await vectorStore.similaritySearch("hello world", 1);
console.log(result);
API Reference:
- HNSWLib from
@langchain/community/vectorstores/hnswlib
- OpenAIEmbeddings from
@langchain/openai
- TextLoader from
langchain/document_loaders/fs/text
Save an index to a file and load it again
import { HNSWLib } from "@langchain/community/vectorstores/hnswlib";
import { OpenAIEmbeddings } from "@langchain/openai";
// Create a vector store through any method, here from texts as an example
const vectorStore = await HNSWLib.fromTexts(
["Hello world", "Bye bye", "hello nice world"],
[{ id: 2 }, { id: 1 }, { id: 3 }],
new OpenAIEmbeddings()
);
// Save the vector store to a directory
const directory = "your/directory/here";
await vectorStore.save(directory);
// Load the vector store from the same directory
const loadedVectorStore = await HNSWLib.load(directory, new OpenAIEmbeddings());
// vectorStore and loadedVectorStore are identical
const result = await loadedVectorStore.similaritySearch("hello world", 1);
console.log(result);
API Reference:
- HNSWLib from
@langchain/community/vectorstores/hnswlib
- OpenAIEmbeddings from
@langchain/openai
Filter documents
import { HNSWLib } from "@langchain/community/vectorstores/hnswlib";
import { OpenAIEmbeddings } from "@langchain/openai";
const vectorStore = await HNSWLib.fromTexts(
["Hello world", "Bye bye", "hello nice world"],
[{ id: 2 }, { id: 1 }, { id: 3 }],
new OpenAIEmbeddings()
);
const result = await vectorStore.similaritySearch(
"hello world",
10,
(document) => document.metadata.id === 3
);
// only "hello nice world" will be returned
console.log(result);
API Reference:
- HNSWLib from
@langchain/community/vectorstores/hnswlib
- OpenAIEmbeddings from
@langchain/openai
Delete index
import { HNSWLib } from "@langchain/community/vectorstores/hnswlib";
import { OpenAIEmbeddings } from "@langchain/openai";
// Save the vector store to a directory
const directory = "your/directory/here";
// Load the vector store from the same directory
const loadedVectorStore = await HNSWLib.load(directory, new OpenAIEmbeddings());
await loadedVectorStore.delete({ directory });
API Reference:
- HNSWLib from
@langchain/community/vectorstores/hnswlib
- OpenAIEmbeddings from
@langchain/openai