向量搜索

    向量搜索 是一项使用大语言模型根据查询的含义和上下文检索搜索结果的实验性技术。

    此功能可以提高不匹配数据集中的关键字的查询搜索相关性,允许你的用户搜索图像和其他非文本媒体,建议网上商店中的相关产品,并创建会话式搜索界面。

    所有用户均可使用矢量搜索。Meilisearch Cloud 是使用矢量搜索的推荐方式。

    如果使用 Meilisearch Cloud,请导航到您的项目概览并找到“实验性功能”,然后勾选“矢量存储”框。

    A section of the project overview interface titled "Experimental features". There are two options: "Score details" and "Vector store". "Vector store" is turned on.

    或者,使用 /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 原生支持以下嵌入器

    也可以 手动提供自定义嵌入。在这种情况下,您必须手动生成嵌入并将其作为文档中的字段包含进去。

    生成自动嵌入

    使用 更新 /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-002text-embedding-3-smalltext-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 和相关性,为该索引添加观察到的 meansigma 值。

    distribution 是与所有嵌入器源兼容的可选字段。它必须是一个包含两个字段的对象

    更改 distribution 不会触发重新索引操作。

    自动嵌入矢量搜索

    使用 qhybrid 执行搜索,以使用关键字和语义搜索检索搜索结果

    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 是一个对象,接受两个字段

    hybrid 可以与 其他搜索参数 搭配使用,包括 filtersort

    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 可以与 其他搜索参数 搭配使用,包括 filtersort

    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 上的功能讨论。此功能正在积极开发中,欢迎您提供任何反馈。