跳到主要内容

如何减少检索延迟

前提条件

本指南假设您熟悉以下概念

减少检索延迟的一种方法是使用称为“自适应检索”的技术。MatryoshkaRetriever 使用 Matryoshka Representation Learning (MRL) 技术分两个步骤检索给定查询的文档

  • 第一遍:使用来自 MRL 嵌入的较低维度子向量进行初始、快速但不太准确的搜索。

  • 第二遍:使用完整的、高维嵌入对第一遍中的前几个结果进行重新排序,以获得更高的准确性。

Matryoshka Retriever

它基于此 Supabase 博客文章 “Matryoshka embeddings: faster OpenAI vector search using Adaptive Retrieval”

设置

提示

有关安装集成包的一般说明,请参阅此部分

npm install @langchain/openai @langchain/community @langchain/core

要遵循以下示例,您需要一个 OpenAI API 密钥

export OPENAI_API_KEY=your-api-key

我们还将使用 chroma 作为我们的向量数据库。请按照此处的说明进行设置。

import { MatryoshkaRetriever } from "langchain/retrievers/matryoshka_retriever";
import { Chroma } from "@langchain/community/vectorstores/chroma";
import { OpenAIEmbeddings } from "@langchain/openai";
import { Document } from "@langchain/core/documents";
import { faker } from "@faker-js/faker";

const smallEmbeddings = new OpenAIEmbeddings({
model: "text-embedding-3-small",
dimensions: 512, // Min number for small
});

const largeEmbeddings = new OpenAIEmbeddings({
model: "text-embedding-3-large",
dimensions: 3072, // Max number for large
});

const vectorStore = new Chroma(smallEmbeddings, {
numDimensions: 512,
});

const retriever = new MatryoshkaRetriever({
vectorStore,
largeEmbeddingModel: largeEmbeddings,
largeK: 5,
});

const irrelevantDocs = Array.from({ length: 250 }).map(
() =>
new Document({
pageContent: faker.lorem.word(7), // Similar length to the relevant docs
})
);
const relevantDocs = [
new Document({
pageContent: "LangChain is an open source github repo",
}),
new Document({
pageContent: "There are JS and PY versions of the LangChain github repos",
}),
new Document({
pageContent: "LangGraph is a new open source library by the LangChain team",
}),
new Document({
pageContent: "LangChain announced GA of LangSmith last week!",
}),
new Document({
pageContent: "I heart LangChain",
}),
];
const allDocs = [...irrelevantDocs, ...relevantDocs];

/**
* IMPORTANT:
* The `addDocuments` method on `MatryoshkaRetriever` will
* generate the small AND large embeddings for all documents.
*/
await retriever.addDocuments(allDocs);

const query = "What is LangChain?";
const results = await retriever.invoke(query);
console.log(results.map(({ pageContent }) => pageContent).join("\n"));

/**
I heart LangChain
LangGraph is a new open source library by the LangChain team
LangChain is an open source github repo
LangChain announced GA of LangSmith last week!
There are JS and PY versions of the LangChain github repos
*/

API 参考

注意

由于某些向量数据库的限制,大型嵌入元数据字段在存储之前会被字符串化 (JSON.stringify)。这意味着从向量数据库检索元数据字段时,需要对其进行解析 (JSON.parse)。

下一步

您现在已经学习了一种可以帮助加快检索查询的技术。

接下来,查看关于 RAG 的更广泛的教程,或者此部分以了解如何创建您自己的自定义检索器来处理任何数据源。


此页对您有帮助吗?


您也可以留下详细的反馈 在 GitHub 上.