配置 AI 搜索类型
本页面提供了不同 AI 搜索工作流类型的示例配置。每个示例都展示了如何根据特定用例(例如语义搜索或混合检索)定制设置。要从头到尾构建一个工作流,请按照在 OpenSearch Dashboards 中构建 AI 搜索工作流中的步骤进行操作,将您的用例配置应用到设置的相应部分。
先决条件:配置 ML 资源
在开始之前,请根据您的用例选择并配置必要的机器学习 (ML) 资源。例如,要实现语义搜索,您必须在 OpenSearch 集群中配置一个文本嵌入模型。有关在本地部署 ML 模型或连接到外部托管模型的更多信息,请参阅集成 ML 模型。
目录
语义搜索
本示例演示了如何配置语义搜索。
ML 资源
在 Amazon Bedrock 上创建并部署 Amazon Titan 文本嵌入模型。
索引
确保索引设置包含 index.knn: true
,并且您的索引在映射中包含一个 knn_vector
字段,如下所示
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"<embedding_field_name>": {
"type": "knn_vector",
"dimension": "<embedding_size>"
}
}
}
}
摄入管道
配置单个 ML 推理处理器。将您的输入文本映射到 inputText
模型输入字段。可选地,将输出 embedding
映射到一个新的文档字段。
搜索管道
配置单个 ML 推理搜索请求处理器。将包含输入文本的查询字段映射到 inputText
模型输入字段。可选地,将输出 embedding
映射到一个新字段。覆盖查询以包含一个 knn
查询,例如
{
"_source": {
"excludes": [
"<embedding_field>"
]
},
"query": {
"knn": {
"<embedding_field>": {
"vector": ${embedding},
"k": 10
}
}
}
}
混合搜索
混合搜索结合了关键词搜索和向量搜索。本示例演示了如何配置混合搜索。
ML 资源
在 Amazon Bedrock 上创建并部署 Amazon Titan 文本嵌入模型。
索引
确保索引设置包含 index.knn: true
,并且您的索引在映射中包含一个 knn_vector
字段,如下所示
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"<embedding_field_name>": {
"type": "knn_vector",
"dimension": "<embedding_size>"
}
}
}
}
摄入管道
配置单个 ML 推理处理器。将您的输入文本映射到 inputText
模型输入字段。可选地,将输出 embedding
映射到一个新的文档字段。
搜索管道
配置一个 ML 推理搜索请求处理器和一个归一化处理器。
**对于 ML 推理处理器**,将包含输入文本的查询字段映射到 inputText
模型输入字段。可选地,将输出 embedding
映射到一个新字段。覆盖查询,使其包含一个 hybrid
查询。请务必指定 embedding_field
、text_field
和 text_field_input
{
"_source": {
"excludes": [
"<embedding_field>"
]
},
"query": {
"hybrid": {
"queries": [
{
"match": {
"<text_field>": {
"query": "<text_field_input>"
}
}
},
{
"knn": {
"<embedding_field>": {
"vector": ${embedding},
"k": 10
}
}
}
]
}
}
}
**对于归一化处理器**,为每个子查询配置权重。有关更多信息,请参阅混合搜索归一化处理器示例。
基本 RAG(文档摘要)
本示例演示了如何配置基本的检索增强生成(RAG)。
以下示例展示了 Claude v1 messages API 的简化连接器蓝图。虽然连接器蓝图和模型接口可能会随着时间而演变,但此示例演示了如何将复杂的 API 交互抽象为单个 prompt
字段输入。
样本输入可能如下所示,其中占位符表示动态获取的结果
{
"prompt": "Human: You are a professional data analyst. You are given a list of document results. You will analyze the data and generate a human-readable summary of the results. If you don't know the answer, just say I don't know.\n\n Results: ${parameters.results.toString()}\n\n Human: Please summarize the results.\n\n Assistant:"
}
ML 资源
在 Amazon Bedrock 上创建并部署 Anthropic Claude 3 Sonnet 模型。
搜索管道
使用以下步骤配置 ML 推理搜索响应处理器
- 为
prompt
输入字段选择 **Template** 作为转换类型。 - 通过选择 **Configure** 打开模板配置。
- 选择一个预设模板以简化设置。
- 创建一个输入变量,用于提取评论列表(例如,
review
)。 - 通过复制并粘贴到模板中,将变量注入到提示中。
- 选择 **Run preview** 以验证转换后的提示是否正确地包含了示例动态数据。
- 选择 **Save** 以应用更改并退出。
多模态搜索
多模态搜索通过文本和图像进行搜索。本示例演示了如何配置多模态搜索。
ML 资源
在 Amazon Bedrock 上创建并部署 Amazon Titan 多模态嵌入模型。
索引
确保索引设置包含 index.knn: true
,并且您的索引在映射中包含一个 knn_vector
字段(用于持久化生成的嵌入)和一个 binary
字段(用于持久化图像二进制数据),如下所示
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"image_base64": {
"type": "binary"
},
"image_embedding": {
"type": "knn_vector",
"dimension": <dimension>
}
}
}
}
摄入管道
配置单个 ML 推理处理器。将您的输入文本字段和输入图像字段分别映射到 inputText
和 inputImage
模型输入字段。如果需要文本和图像两种输入,请确保两者都已映射。或者,如果单个输入足以生成嵌入,则可以只映射一个输入(文本或图像)。
可选地,将输出 embedding
映射到一个新的文档字段。
搜索管道
配置单个 ML 推理搜索请求处理器。将查询中的输入图像字段或输入文本字段分别映射到 image_url
或 text
模型输入字段。CLIP 模型可以灵活处理其中一个或两者,因此请选择最适合您用例的选项。
覆盖查询,使其包含一个 knn
查询,包括嵌入输出
{
"_source": {
"excludes": [
"<embedding_field>"
]
},
"query": {
"knn": {
"<embedding_field>": {
"vector": ${embedding},
"k": 10
}
}
}
}
命名实体识别
本示例演示了如何配置命名实体识别(NER)。
ML 资源
创建并部署 Amazon Comprehend 实体检测模型。
摄入管道
配置单个 ML 推理处理器。将您的输入文本字段映射到 text
模型输入字段。为了将任何已识别的实体与每个文档一起持久化,请转换输出(一个实体数组)并将其存储在 entities_found
字段中。使用以下 output_map
配置作为参考
"output_map": [
{
"entities_found": "$.response.Entities[*].Type"
}
],
此配置将提取的实体映射到 entities_found
字段,确保它们与每个文档一起存储。
语言检测和分类
以下示例演示了如何配置语言检测和分类。
ML 资源
创建并部署 Amazon Comprehend 语言检测模型。
摄入管道
配置单个 ML 推理处理器。将您的输入文本字段映射到 text
模型输入字段。为了存储为每个文档检测到的最相关或最可能的语言,请转换输出(一个语言数组)并将其持久化到 detected_dominant_language
字段中。使用以下 output_map
配置作为参考
"output_map": [
{
"detected_dominant_language": "response.Languages[0].LanguageCode"
}
],
结果重新排序
结果重新排序可以通过多种方式实现,具体取决于所用模型的功能。通常,模型至少需要两个输入:原始查询和要分配相关性分数的数据。有些模型支持批量处理,允许在一次推理调用中处理多个结果,而另一些模型则需要单独为每个结果评分。
在 OpenSearch 中,这导致了两种常见的重新排序模式
-
启用批量处理
- 收集所有搜索结果。
- 将批量处理的结果传递给单个 ML 处理器进行评分。
- 返回前 **n** 个排序结果。
-
禁用批量处理
- 收集所有搜索结果。
- 将每个结果传递给 ML 处理器以分配新的相关性分数。
- 将所有具有更新分数的搜索结果发送到重新排序处理器进行排序。
- 返回前 **n** 个排序结果。
以下示例演示了**模式 2(禁用批量处理)**以突出显示重新排序处理器。但是,请注意,此示例中使用的 **Cohere Rerank** 模型**确实支持批量处理**,因此您也可以使用此模型实现**模式 1**。
ML 资源
创建并部署 Cohere Rerank 模型。
搜索管道
配置一个 ML 推理**搜索响应**处理器,然后配置一个重新排序**搜索响应**处理器。对于禁用批量处理的重新排序,使用 ML 处理器为检索到的结果生成新的相关性分数,然后应用重新排序器进行相应排序。
使用以下 ML 处理器配置
- 将包含用于比较的数据的文档字段映射到模型的
documents
字段。 - 将原始查询映射到模型的
query
字段。 - 使用 JSONPath 访问查询 JSON,前缀为
_request.query
。
使用以下 input_map
配置作为参考
"input_map": [
{
"documents": "description",
"query": "$._request.query.term.value"
}
],
可选地,您可以将重新评分的结果存储在新字段中的模型输出中。您也可以仅提取并持久化相关性分数,如下所示
"input_map": [
{
"new_score": "results[0].relevance_score"
}
],
使用以下重新排序处理器配置:在 **target_field** 下,选择模型评分字段(本例中为 new_score
)。
使用自定义 CLIP 模型进行多模态搜索(文本或图像)
以下示例使用托管在 Amazon SageMaker 上的自定义 CLIP 模型。该模型动态地将文本或图像 URL 作为输入,并返回一个向量嵌入。
ML 资源
创建并部署 自定义 CLIP 多模态模型。
索引
确保索引设置包含 index.knn: true
,并且您的索引在映射中包含一个 knn_vector
字段,如下所示
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"<embedding_field_name>": {
"type": "knn_vector",
"dimension": "<embedding_size>"
}
}
}
}
摄入管道
配置单个 ML 推理处理器。根据您要摄入并持久化到索引中的数据类型,将您的图像字段映射到 image_url
模型输入字段,或者将您的文本字段映射到 text
模型输入字段。例如,如果构建一个根据文本或图像输入返回相关图像的应用程序,您将需要持久化图像,并且应该将图像字段映射到 image_url
字段。
搜索管道
配置单个 ML 推理搜索请求处理器。将查询中的输入图像字段或输入文本字段分别映射到 image_url
或 text
模型输入字段。CLIP 模型可以灵活处理其中一个或两者,因此请选择最适合您用例的选项。
覆盖查询,使其包含一个 knn
查询,包括嵌入输出
{
"_source": {
"excludes": [
"<embedding_field>"
]
},
"query": {
"knn": {
"<embedding_field>": {
"vector": ${embedding},
"k": 10
}
}
}
}
神经稀疏搜索
本示例演示了如何配置神经稀疏搜索。
ML 资源
创建并部署一个 神经稀疏编码模型。
索引
确保索引映射包含一个 rank_features
字段
"<embedding_field_name>": {
"type": "rank_features"
}
摄入管道
配置单个 ML 推理处理器。将您的输入文本映射到 text_doc
模型输入字段。可选地,将输出 response
映射到一个新的文档字段。如果需要,使用 JSONPath 表达式转换响应。
搜索管道
配置单个 ML 推理搜索请求处理器。将包含输入文本的查询字段映射到 text_doc
模型输入字段。可选地,将输出 response
映射到一个新字段。如果需要,使用 JSONPath 表达式转换响应。包含一个神经稀疏查询
{
"_source": {
"excludes": [
"<embedding_field>"
]
},
"query": {
"neural_sparse": {
"<embedding_field>": {
"query_tokens": ${response},
}
}
}
}