跳转到内容
搜索文档

查询向量

最后更新 查看 MarkdownAgent 设置

查询索引或向量搜索,使您能够通过提供输入向量并根据配置的距离度量返回最近的向量来搜索索引。

可选地,您可以应用元数据过滤器namespace 来缩小向量搜索空间。

查询示例

要将向量作为查询传递给索引,请在索引本身上使用 query() 方法。

查询向量是 JavaScript 数字数组、32 位浮点数或 64 位浮点数:number[]Float32ArrayFloat64Array。与插入向量不同,查询向量不需要 ID 或元数据。

// query vector dimensions must match the Vectorize index dimension being queried
let queryVector = [54.8, 5.5, 3.1, ...];
let matches = await env.YOUR_INDEX.query(queryVector);

这将返回一组匹配结果,基于为 Vectorize 索引配置的距离度量。使用 cosine 距离度量的示例响应:

{
	"count": 5,
	"matches": [
		{ "score": 0.999909486, "id": "5" },
		{ "score": 0.789848214, "id": "4" },
		{ "score": 0.720476967, "id": "4444" },
		{ "score": 0.463884663, "id": "6" },
		{ "score": 0.378282232, "id": "1" }
	]
}

您可以选择更改返回结果的数量和/或结果是否包含元数据和值:

// query vector dimensions must match the Vectorize index dimension being queried
let queryVector = [54.8, 5.5, 3.1, ...];
// topK defaults to 5; returnValues defaults to false; returnMetadata defaults to "none"
let matches = await env.YOUR_INDEX.query(queryVector, {
	topK: 1,
	returnValues: true,
	returnMetadata: "all",
});

这将返回一组匹配结果,基于为 Vectorize 索引配置的距离度量。使用 cosine 距离度量的示例响应:

{
	"count": 1,
	"matches": [
		{
			"score": 0.999909486,
			"id": "5",
			"values": [58.79999923706055, 6.699999809265137, 3.4000000953674316, ...],
			"metadata": { "url": "/products/sku/55519183" }
		}
	]
}

请参阅 Vectorize API 获取更多示例。

按向量标识符查询

Vectorize 现在提供使用 queryById() 操作搜索与索引中已有向量相似的向量的能力。这可以视为结合 getById()query() 操作的单一操作。

// the query operation would yield results if a vector with id `some-vector-id` is already present in the index.
let matches = await env.YOUR_INDEX.queryById("some-vector-id");

评分精度和查询准确性的控制

查询向量时,您可以指定使用高精度评分,从而提高查询匹配分数的精度以及查询结果的准确性,或使用近似评分以获得更快的响应时间。 使用近似评分时,返回的分数将是查询与返回向量之间真实距离/相似性的近似值;这是查询的默认设置,在准确性和延迟之间取得了良好的平衡。

通过在查询上设置 returnValues: true 启用高精度评分。此设置告诉 Vectorize 使用匹配项的原始向量值,从而计算精确的匹配分数并提高结果的准确性。但由于它处理更多数据,高精度评分会增加查询延迟。

Workers AI

如果您从 Workers AI 文本嵌入模型生成嵌入,env.AI.run() 的响应类型是一个对象,包括响应向量的 shape(例如 [1,768])和作为向量数组的 data

interface EmbeddingResponse {
	shape: number[];
	data: number[][];
}

let userQuery = "a query from a user or service";
const queryVector: EmbeddingResponse = await env.AI.run(
	"@cf/baai/bge-base-en-v1.5",
	{
		text: [userQuery],
	},
);

将向量传递给 Vectorize 索引的 query() 方法时,仅传递 .data 子对象上的向量嵌入本身,而不是顶级响应。

例如:

let matches = await env.TEXT_EMBEDDINGS.query(queryVector.data[0], { topK: 1 });

传递 queryVectorqueryVector.data 会导致 query() 返回错误。

OpenAI

使用 OpenAI 的 JavaScript 客户端 APIEmbeddings API 时,embeddings.create 的响应类型是一个对象,包括模型、用量信息和请求的向量嵌入。

const openai = new OpenAI({ apiKey: env.YOUR_OPENAPI_KEY });

let userQuery = "a query from a user or service";

let embeddingResponse = await openai.embeddings.create({
	input: userQuery,
	model: "text-embedding-ada-002",
});

与 Workers AI 类似,您需要提供向量嵌入本身(.embedding[0]),而不是 EmbeddingResponse 包装器来查询 Vectorize 索引:

let matches = await env.TEXT_EMBEDDINGS.query(embeddingResponse.embedding[0], {
	topK: 1,
});

这篇文档对您有帮助吗?