如果您的所选提供商提供公共 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. 使用新的嵌入器更新您的索引设置
© . This site is unofficial and not affiliated with Meilisearch.