配置 REST 嵌入器

    如果您选择的提供商提供公共 REST API,您可以将任何文本嵌入生成器与 Meilisearch 集成。

    将 REST 嵌入器与 Meilisearch 集成的过程因提供商及其数据结构方式而异。 本指南向您展示在哪里可以找到所需的信息,然后引导您根据找到的信息配置 Meilisearch 嵌入器。

    查找您的嵌入器提供商的文档

    每个提供商都要求查询遵循特定的结构。

    在开始创建嵌入器之前,请找到您的提供商关于嵌入创建的文档。 这应该包含您需要的关于 API 请求、请求标头和响应的信息。

    例如,Mistral 的嵌入文档 是其 API 参考的一部分。 对于 Cloudflare Workers AI,预期的输入和响应与您选择的模型相关联。

    设置 REST 源和 URL

    打开您的文本编辑器并创建一个嵌入器对象。 给它一个名称并将其源设置为 "rest"

    {
      "EMBEDDER_NAME": {
        "source": "rest"
      }
    }
    

    接下来,配置 Meilisearch 应该用来联系嵌入提供商的 URL

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL"
      }
    }
    

    对于所有 REST 嵌入器,设置嵌入器名称、sourceurl 是强制性的。

    配置 Meilisearch 发送给提供商的数据

    Meilisearch 的 request 字段定义了它将发送给提供商的输入的结构。 您必须填写此字段的方式因提供商而异。

    例如,Mistral 需要两个强制性参数:modelinput。 它还接受一个可选参数:encoding_format。 相比之下,Cloudflare 仅需要一个字段 text

    选择模型

    在许多情况下,您的提供商要求您明确设置要用于创建嵌入的模型。 例如,在 Mistral 中,model 必须是一个字符串,指定一个有效的 Mistral 模型。

    更新你的嵌入器对象,添加此字段及其值

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME"
        }
      }
    }
    

    在 Cloudflare 的情况下,模型是 API 路由本身的一部分,不需要在你的 request 中指定。

    嵌入提示

    提示对应于提供商将用于生成文档嵌入的数据。它的具体名称取决于你选择的提供商。在 Mistral 中,这是 input 字段。在 Cloudflare 中,它被称为 text

    大多数提供商接受字符串或字符串数组。单个字符串将为数据库中的每个文档生成一个请求

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "input": "{{text}}"
        }
      }
    }
    

    {{text}} 表示 Meilisearch 应该用你的文档数据替换字段的内容,如嵌入器的 documentTemplate 中所示。

    字符串数组允许 Meilisearch 在一个请求中发送最多 10 个文档,从而减少对提供商的 API 调用次数

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "input": [
            "{{text}}", 
            "{{..}}"
          ]
        }
      }
    }
    

    当使用数组提示时,第一个项目必须是 {{text}}。 如果你想在单个请求中发送多个文档,则第二个数组项目必须是 {{..}}。当使用 "{{..}}" 时,它必须同时存在于 requestresponse 中。

    当使用其他嵌入提供商时,input 可能被称为其他名称,例如 textprompt

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "text": "{{text}}"
        }
      }
    }
    

    提供其他请求字段

    你可以根据需要向 request 对象添加任意数量的字段。Meilisearch 在查询嵌入提供商时会包含它们。

    例如,Mistral 允许你选择性地配置 encoding_format。通过在嵌入器的 request 中声明此字段来设置它

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "input": ["{{text}}", "{{..}}"],
          "encoding_format": "float"
        }
      }
    }
    

    嵌入响应

    你必须指明 Meilisearch 可以在提供商的响应中找到文档嵌入的位置。查阅你的提供商的 API 文档,注意它将嵌入放置在哪里。

    Cloudflare 的嵌入位于 response.result.data 内的数组中。在你的嵌入器的 response 中描述到嵌入数组的完整路径。第一个数组项必须是 "{{embedding}}"

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "text": "{{text}}"
        },
        "response": {
          "result": {
            "data": ["{{embedding}}"]
          }
        }
      }
    }
    

    如果响应包含多个嵌入,请使用 "{{..}}" 作为其第二个值

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "input": [
            "{{text}}", 
            "{{..}}"
          ]
        },
        "response": {
          "data": [
            {
              "embedding": "{{embedding}}"
            },
            "{{..}}"
          ]
        }
      }
    }
    

    当使用 "{{..}}" 时,它必须同时存在于 requestresponse 中。

    响应可能包含数组之外的单个嵌入。使用 "{{embedding}}" 作为其值

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "input": "{{text}}"
        },
        "response": {
          "data": {
            "text": "{{embedding}}"
          }
        }
      }
    }
    

    响应也可能是不嵌套在对象中的单个项目或数组

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "input": [
            "{{text}}",
            "{{..}}"
          ]
        },
        "response": [
          "{{embedding}}",
          "{{..}}"
        ]
      }
    }
    

    提示数据类型不一定与响应数据类型匹配。例如,即使你的请求中的提示是字符串,Cloudflare 始终返回嵌入数组。

    Meilisearch 会静默忽略未指向 "{{embedding}}" 值的 response 字段。

    嵌入标头

    你的提供商可能还会要求你向请求添加特定的标头。例如,Azure 的 AI 服务需要包含 API 密钥的 api-key 标头。

    headers 字段添加到你的嵌入器对象

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "text": "{{text}}"
        },
        "response": {
          "result": {
            "data": ["{{embedding}}"]
          }
        },
        "headers": {
          "FIELD_NAME": "FIELD_VALUE"
        }
      }
    }
    

    默认情况下,Meilisearch 包括 Content-Type 标头。如果你提供了 API 密钥,它也可能包括授权持有者令牌。

    配置嵌入器的其余部分

    sourcerequestresponseheader 是 REST 嵌入器特有的字段。

    像其他远程嵌入器一样,你可能需要提供 apiKey

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "input": ["{{text}}", "{{..}}"],
          "encoding_format": "float"
        },
        "response": {
          "data": [
            {
              "embedding": "{{embedding}}"
            },
            "{{..}}"
          ]
        },
        "apiKey": "PROVIDER_API_KEY",
      }
    }
    

    你还应该设置 documentTemplate。好的模板应该简短,并且只包含高度相关的文档数据

    {
      "EMBEDDER_NAME": {
        "source": "rest",
        "url": "PROVIDER_URL",
        "request": {
          "model": "MODEL_NAME",
          "input": ["{{text}}", "{{..}}"],
          "encoding_format": "float"
        },
        "response": {
          "data": [
            {
              "embedding": "{{embedding}}"
            },
            "{{..}}"
          ]
        },
        "apiKey": "PROVIDER_API_KEY",
        "documentTemplate": "SHORT_AND_RELEVANT_DOCUMENT_TEMPLATE"
      }
    }
    

    更新你的索引设置

    现在嵌入器对象已完成,更新你的索引设置

    curl \
      -X PATCH 'MEILISEARCH_URL/indexes/INDEX_NAME/settings/embedders' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "EMBEDDER_NAME": {
          "source": "rest",
          "url": "PROVIDER_URL",
          "request": {
            "model": "MODEL_NAME",
            "input": ["{{text}}", "{{..}}"],
          },
          "response": {
            "data": [
              {
                "embedding": "{{embedding}}"
              },
              "{{..}}"
            ]
          },
          "apiKey": "PROVIDER_API_KEY",
          "documentTemplate": "SHORT_AND_RELEVANT_DOCUMENT_TEMPLATE"
        }
      }'
    

    结论

    在本指南中,你已经看到了如何在 Meilisearch 中配置 REST 嵌入器的一些示例。虽然它使用了 Mistral 和 Cloudflare,但对于所有提供商来说,一般步骤仍然相同

    1. 查找提供商的 REST API 文档
    2. 确定嵌入创建请求参数
    3. 在你的嵌入器的 request 中包含参数
    4. 确定嵌入创建响应
    5. 在你的嵌入器的 response 中重现返回的嵌入的路径
    6. 将任何必需的 HTTP 标头添加到你的嵌入器的 header
    7. 使用新的嵌入器更新你的索引设置