向量搜索
向量搜索 是一项使用大语言模型根据查询的含义和上下文检索搜索结果的实验性技术。
此功能可以提高不匹配数据集中的关键字的查询搜索相关性,允许你的用户搜索图像和其他非文本媒体,建议网上商店中的相关产品,并创建会话式搜索界面。
所有用户均可使用矢量搜索。Meilisearch Cloud 是使用矢量搜索的推荐方式。
使用矢量搜索
激活矢量搜索
如果使用 Meilisearch Cloud,请导航到您的项目概览并找到“实验性功能”,然后勾选“矢量存储”框。
或者,使用 /experimental-features
路由 在运行时激活矢量搜索
curl \
-X PATCH 'http://localhost:7700/experimental-features/' \
-H 'Content-Type: application/json' \
--data-binary '{
"vectorStore": true
}'
Meilisearch Cloud AI 驱动的搜索候补名单
为确保 Meilisearch Cloud 最新的 AI 驱动的搜索产品能得到妥善推广,您必须先进入候补名单才能激活矢量搜索。在您的注册获得批准之前,您将无法在 Cloud 界面或通过 /experimental-features
路由激活矢量搜索。
生成矢量嵌入
要使用矢量搜索,请首先配置 embedders
索引设置。您可以为索引配置多个嵌入器。
嵌入器从您的文档中生成矢量数据。Meilisearch 原生支持以下嵌入器
- OpenAI
- Hugging Face
- Ollama
- 任何具有 REST 接口的嵌入器
也可以 手动提供自定义嵌入。在这种情况下,您必须手动生成嵌入并将其作为文档中的字段包含进去。
生成自动嵌入
使用 更新 /settings
端点 的 embedders
索引设置,为某个索引配置一个或多个嵌入器
curl \
-X PATCH 'http://localhost:7700/indexes/movies/settings' \
-H 'Content-Type: application/json' \
--data-binary '{
"embedders": {
"default": {
"source": "openAi",
"apiKey": "anOpenAiApiKey",
"model": "text-embedding-3-small",
"documentTemplate": "A movie titled {{doc.title}} whose description starts with {{doc.overview|truncatewords: 20}}",
"dimensions": 1536
}
}
}'
在使用 OpenAI 嵌入器时,必须通过 OPENAI_API_KEY
环境变量或 apiKey
字段传递一个 OpenAI API 密钥。 从您的 OpenAI 帐户生成 API 密钥。为了获得最佳性能,请使用 2 级密或以上密 ключи。钥。
model
是一个必填字段,用于指示兼容的 OpenAI 模型。Meilisearch 支持以下 OpenAI 模型: openai-text-embedding-ada-002
、text-embedding-3-small
和 text-embedding-3-large
。
documentTemplate
是一个可选字段。使用它来自定义发送到嵌入器的数据。强烈建议您为文档配置自定义模板。
dimensions
是一个可选字段。它必须大于零且小于或等于所选模型的维度。此选项与 text-embedding-ada-002
不兼容。较少的维度可能会提高性能,但会降低搜索结果的准确性。
`documentTemplate` 使用
documentTemplate
必须是 Liquid 模板。使用 {{ doc.attribute }}
访问文档的 attribute
字段值。Meilisearch 还会公开一个 {{ fields }}
数组,其中包含每个文档字段一个对象,您可以使用 {{ field.name }}
和 {{ field.value }}
访问这些对象。
您以这种方式引用的任何字段都必须存在于所有文档中,否则在索引时会引发错误。
要获得最佳结果,请使用短字符串来指示该索引中文档的类型,仅包含高度相关的文档字段,并截断长的字段。
手动生成自定义嵌入
您还可以提供自定义嵌入。在这种情况下,在向索引中添加、更新和移除文档时,您必须手动更新您的嵌入。
配置 embedder
索引设置
curl \
-X PATCH 'http://localhost:7700/indexes/movies/settings' \
-H 'Content-Type: application/json' \
--data-binary '{
"embedders": {
"image2text": {
"source": "userProvided",
"dimensions": 3
}
}
}'
然后,使用 /documents
终结点 上传矢量化文档。在文档的 _vectors
字段中存储矢量数据
curl -X POST -H 'content-type: application/json' \
'localhost:7700/indexes/products/documents' \
--data-binary '[
{ "id": 0, "_vectors": {"image2text": [0, 0.8, -0.2]}, "text": "frying pan" },
{ "id": 1, "_vectors": {"image2text": [1, -0.2, 0]}, "text": "baking dish" }
]'
分布偏移
出于数学原因,语义搜索结果的 _rankingScore
往往紧密地围绕一个平均值分组,该平均值取决于所使用的嵌入器和模型。这可能导致与关键字搜索结果相比,相关的语义点击率过低,而无关的语义点击率过高。
在配置嵌入器时使用 distribution
,以仿射变换更正语义点击率返回的 _rankingScore
curl \
-X PATCH 'http://localhost:7700/indexes/movies/settings' \
-H 'Content-Type: application/json' \
--data-binary '{
"embedders": {
"default": {
"source": "huggingFace",
"model": "MODEL_NAME",
"distribution": {
"mean": 0.7,
"sigma": 0.3
}
}
}
}'
配置 distribution
需要反复试验,您必须执行语义搜索并监控结果。根据其 rankingScore
和相关性,为该索引添加观察到的 mean
和 sigma
值。
distribution
是与所有嵌入器源兼容的可选字段。它必须是一个包含两个字段的对象
mean
:0 到 1 之间的一个数字,表示在使用distribution
设置之前的略微相关点击率的语义评分sigma
:0 到 1 之间的一个数字,表示非常相关的点击率与略微相关的点击率之间的绝对_rankingScore
差的平均值,以及略微相关的点击率与无关的点击率之间的差。
更改 distribution
不会触发重新索引操作。
自动嵌入矢量搜索
使用 q
和 hybrid
执行搜索,以使用关键字和语义搜索检索搜索结果
curl -X POST -H 'content-type: application/json' \
'localhost:7700/indexes/products/search' \
--data-binary '{
"q": "kitchen utensils",
"hybrid": {
"semanticRatio": 0.9,
"embedder": "default"
}
}'
hybrid
是一个对象,接受两个字段
semanticRatio
:0 到 1 之间的一个数字。0 表示完整的关键字搜索,1 表示完整的语义搜索。默认为 0.5embedder
:字符串,表示为查询索引配置的其中一个嵌入器。默认为"default"
hybrid
可以与 其他搜索参数 搭配使用,包括 filter
和 sort
curl -X POST -H 'content-type: application/json' \
'localhost:7700/indexes/products/search' \
--data-binary '{
"q": "kitchen utensils",
"hybrid": {
"semanticRatio": 0.9,
"embedder": "default"
},
"filter": "price < 10",
"sort": ["price:asc"]
}'
使用用户提供的嵌入向量的向量搜索
使用 vector
搜索参数进行向量搜索
curl -X POST -H 'content-type: application/json' \
'localhost:7700/indexes/products/search' \
--data-binary '{ "vector": [0, 1, 2] }'
使用用户提供的嵌入向量的向量搜索时,vector
必须是表示搜索向量的数字数组。必须在使用向量搜索时自行生成这些数字数组。
vector
可以与 其他搜索参数 搭配使用,包括 filter
和 sort
curl -X POST -H 'content-type: application/json' \
'localhost:7700/indexes/products/search' \
--data-binary '{
"vector": [0, 1, 2],
"filter": "price < 10",
"sort": ["price:asc"]
}'
其他资源
查看 Meilisearch 博客文章,了解 使用 LangChain 实现语义搜索的指南。
停用向量搜索
手动从索引中删除所有嵌入器配置
curl \
-X DELETE 'http://localhost:7700/indexes/movies/settings/embedders' \
-H 'Content-Type: application/json'
警告
如果您没有删除所有嵌入器,Meilisearch 将继续自动为您文档生成嵌入。即使 vectorStore
已被设置为 false
,这种情况也会发生,当使用 OpenAI 的付费层级时,可能会导致意外的开支。
如果您使用的是 Meilisearch Cloud,请转到您的项目概览并找到“实验性功能”,然后取消选中“向量存储”复选框。
或者,使用 /experimental
路由
curl \
-X PATCH 'http://localhost:7700/experimental-features/' \
-H 'Content-Type: application/json' \
--data-binary '{
"vectorStore": false
}'
更多信息
有关在 Meilisearch 中使用向量搜索的最新信息,请参阅 GitHub 上的功能讨论。此功能正在积极开发中,欢迎您提供任何反馈。