跳到主要内容
利用 Typesense 搜索引擎的向量存储。

基本用法

有关安装 LangChain 软件包的一般说明,请参阅此部分
npm
npm install @langchain/openai @langchain/community @langchain/core
import {
  Typesense,
  TypesenseConfig,
} from "@lanchain/community/vectorstores/typesense";
import { OpenAIEmbeddings } from "@langchain/openai";
import { Client } from "typesense";
import { Document } from "@langchain/core/documents";

const vectorTypesenseClient = new Client({
  nodes: [
    {
      // Ideally should come from your .env file
      host: "...",
      port: 123,
      protocol: "https",
    },
  ],
  // Ideally should come from your .env file
  apiKey: "...",
  numRetries: 3,
  connectionTimeoutSeconds: 60,
});

const typesenseVectorStoreConfig = {
  // Typesense client
  typesenseClient: vectorTypesenseClient,
  // Name of the collection to store the vectors in
  schemaName: "your_schema_name",
  // Optional column names to be used in Typesense
  columnNames: {
    // "vec" is the default name for the vector column in Typesense but you can change it to whatever you want
    vector: "vec",
    // "text" is the default name for the text column in Typesense but you can change it to whatever you want
    pageContent: "text",
    // Names of the columns that you will save in your typesense schema and need to be retrieved as metadata when searching
    metadataColumnNames: ["foo", "bar", "baz"],
  },
  // Optional search parameters to be passed to Typesense when searching
  searchParams: {
    q: "*",
    filter_by: "foo:[fooo]",
    query_by: "",
  },
  // You can override the default Typesense import function if you want to do something more complex
  // Default import function:
  // async importToTypesense<
  //   T extends Record<string, unknown> = Record<string, unknown>
  // >(data: T[], collectionName: string) {
  //   const chunkSize = 2000;
  //   for (let i = 0; i < data.length; i += chunkSize) {
  //     const chunk = data.slice(i, i + chunkSize);

  //     await this.caller.call(async () => {
  //       await this.client
  //         .collections<T>(collectionName)
  //         .documents()
  //         .import(chunk, { action: "emplace", dirty_values: "drop" });
  //     });
  //   }
  // }
  import: async (data, collectionName) => {
    await vectorTypesenseClient
      .collections(collectionName)
      .documents()
      .import(data, { action: "emplace", dirty_values: "drop" });
  },
} satisfies TypesenseConfig;

/**
 * Creates a Typesense vector store from a list of documents.
 * Will update documents if there is a document with the same id, at least with the default import function.
 * @param documents list of documents to create the vector store from
 * @returns Typesense vector store
 */
const createVectorStoreWithTypesense = async (documents: Document[] = []) =>
  Typesense.fromDocuments(
    documents,
    new OpenAIEmbeddings(),
    typesenseVectorStoreConfig
  );

/**
 * Returns a Typesense vector store from an existing index.
 * @returns Typesense vector store
 */
const getVectorStoreWithTypesense = async () =>
  new Typesense(new OpenAIEmbeddings(), typesenseVectorStoreConfig);

// Do a similarity search
const vectorStore = await getVectorStoreWithTypesense();
const documents = await vectorStore.similaritySearch("hello world");

// Add filters based on metadata with the search parameters of Typesense
// will exclude documents with author:JK Rowling, so if Joe Rowling & JK Rowling exists, only Joe Rowling will be returned
vectorStore.similaritySearch("Rowling", undefined, {
  filter_by: "author:!=JK Rowling",
});

// Delete a document
vectorStore.deleteDocuments(["document_id_1", "document_id_2"]);

构造函数

开始之前,在 Typesense 中创建一个包含 ID、向量字段和文本字段的 schema。根据需要添加任意数量的其他字段作为元数据。
  • constructor(embeddings: Embeddings, config: TypesenseConfig): 构造 Typesense 类的新实例。
    • embeddings: 用于嵌入文档的 Embeddings 类实例。
    • config: Typesense 向量存储的配置对象。
      • typesenseClient: Typesense 客户端实例。
      • schemaName: 用于存储和搜索文档的 Typesense schema 名称。
      • searchParams(可选):Typesense 搜索参数。默认为 { q: '*', per_page: 5, query_by: '' }
      • columnNames(可选):列名配置。
        • vector(可选):向量列名。默认为 'vec'
        • pageContent(可选):页面内容列名。默认为 'text'
        • metadataColumnNames(可选):元数据列名。默认为空数组 []
      • import(可选):替换用于将数据导入 Typesense 的默认导入函数。这可能会影响文档更新的功能。

方法

  • async addDocuments(documents: Document[]): Promise<void>: 将文档添加到向量存储。如果存在相同 ID 的文档,则会更新该文档。
  • static async fromDocuments(docs: Document[], embeddings: Embeddings, config: TypesenseConfig): Promise<Typesense>: 从文档列表中创建 Typesense 向量存储。文档在构造过程中添加到向量存储中。
  • static async fromTexts(texts: string[], metadatas: object[], embeddings: Embeddings, config: TypesenseConfig): Promise<Typesense>: 从文本列表和相关元数据中创建 Typesense 向量存储。文本被转换为文档并在构造过程中添加到向量存储中。
  • async similaritySearch(query: string, k?: number, filter?: Record<string, unknown>): Promise<Document[]>: 根据查询搜索相似文档。返回相似文档数组。
  • async deleteDocuments(documentIds: string[]): Promise<void>: 根据文档 ID 从向量存储中删除文档。

以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。
© . This site is unofficial and not affiliated with LangChain, Inc.