阿里云Elasticsearch AI场景语义搜索最佳实践

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 本文介绍了如何使用阿里云Elasticsearch结合搜索开发工作台搭建AI语义搜索。

阿里云检索服务Elasticsearch版(简称ES)结合了搜索开发工作台的组件化模型能力,本文介绍如何搭建AI语义搜索。

方案介绍

阿里云搜索开发工作台围绕智能搜索及检索增强生成RAG(Retrieval-Augmented Generation)场景,能够提供优质的组件化服务。阿里云ES提供高性能混合检索方案,结合搜索开发工作台AI模型服务,可以提供完整的AI语义搜索方案。

方案如下:

  • 数据写入原理:
    对大文档数据进行切片处理(可选操作),将切分后的文档片段调用文本向量化服务,生成稠密向量(Dense ventor)和稀疏向量(Sparse ventor),在阿里云ES中构建稠密向量索引和稀疏向量索引。稀疏向量常用于表达关键词和词频信息,可与稠密向量、文本索引搭配进行混合检索,提升检索效果。
  • 数据查询原理:
    将需要查询的Query信息,通过向量化模型转换为稠密向量和稀疏向量,在阿里云ES中进行混合检索,召回TOP N文档内容。

前提条件

说明

  • 将待访问ES实例的设备的IP地址加入ES实例的公网或私网访问白名单中,详情请参见配置实例公网或私网访问白名单
  • 登录Kibana控制台。您可以在Kibana控制台的开发工具(Dev Tools)上执行本文中出现的所有代码。具体操作,请参见登录Kibana控制台
  • 已在华东2(上海)地域开通阿里云搜索开发工作台服务。具体操作,请参见开通服务

说明

步骤一:创建模型

阿里云ES的Inference API提供了加载第三方模型服务的功能, 同时扩展了对阿里云搜索开发工作台推理模型服务的支持,详情参见阿里云Elasticsearch Inference API介绍

在阿里云ES中注册搜索开发工作台模型服务,构建语义搜索需要的模型服务如下:

说明

  • 您也可以使用已注册模型服务快速搭建语义搜索。

环节

服务说明

服务说明文档

文档切片

文档切片服务(ops-document-split-001):提供通用文本切片服务,支持基于文档段落、文本语义、指定规则,对HTML、Markdown、txt格式的结构化数据进行拆分,同时支持以富文本形式提取文档中的代码、图片以及表格。

文档切片API

文本向量化

  • 文本向量化服务-001(ops-text-embedding-001):提供多语言(40+)文本向量化服务,输入文本最大长度300,输出向量维度1536维。
  • 通用文本向量化服务-002(ops-text-embedding-002):提供多语言(100+)文本向量化服务,输入文本最大长度8192,输出向量维度1024维。
  • 文本向量化服务-中文-001(ops-text-embedding-zh-001):提供中文文本向量化服务,输入文本最大长度1024,输出向量维度768维。
  • 文本向量化服务-英文-001(ops-text-embedding-en-001):提供英文文本向量化服务,输入文本最大长度512,输出向量维度768维。

文本向量API

文本稀疏向量化

文本稀疏向量化服务(ops-text-sparse-embedding-001):提供将文本数据转化为稀疏向量形式表达的服务,稀疏向量存储空间更小,常用于表达关键词和词频信息,可与稠密向量搭配进行混合检索,提升检索效果。提供多语言(100+)文本向量化服务,输入文本最大长度8192。

文本稀疏向量化API

创建doc_split推理模型

注册搜索开发工作台文档切片服务(ops-document-split-001),创建doc_split推理模型。

PUT _inference/doc_split/os-doc-split-test
{
  "service": "alibabacloud-ai-search",
  "service_settings": {
    "api_key": "OS-xxx",
    "service_id": "ops-document-split-001",
    "host" : "default-j01.platform-cn-shanghai.opensearch.aliyuncs.com",
    "workspace" : "default"
  },
  "task_settings": {
    "document": {"content_type": "text"},
    "strategy": {"max_chunk_size": 20}
  }
}

max_chunk_size用来设置切片的最大长度,默认值是300。由于本文测试的文本较短,为了测试查询时的inner_hits参数,以上示例max_chunk_size设置了较小值。其他参数请参见阿里云Elasticsearch Inference API介绍

创建text_embedding推理模型

注册搜索开发工作台文本向量化服务-001(ops-text-embedding-001),创建text_embedding推理模型。

PUT _inference/text_embedding/os-embeddings-test
{
  "service": "alibabacloud-ai-search",
  "service_settings": {
    "api_key": "OS-xxx",
    "service_id": "ops-text-embedding-001",
    "host" : "default-j01.platform-cn-shanghai.opensearch.aliyuncs.com",
    "workspace" : "default"
  }
}

创建sparse_embedding推理模型

注册搜索开发工作台文本稀疏向量化服务(ops-text-sparse-embedding-001),创建sparse_embedding推理模型。

PUT _inference/sparse_embedding/os-sparse-embeddings-test
{
  "service": "alibabacloud-ai-search",
  "service_settings": {
    "api_key": "OS-xxx",
    "service_id": "ops-text-sparse-embedding-001",
    "host" : "default-j01.platform-cn-shanghai.opensearch.aliyuncs.com",
    "workspace" : "default"
  }
}

调试模型

以下代码以调试text_embedding推理模型为例,其他模型使用类似方式调试。

POST _inference/text_embedding/os-embeddings-test
{
  "input":["科学技术是第一生产力", "elasticsearch产品文档"]
}

步骤二:调用服务搭建语义搜索并调试

以下演示了2个ES语义搜索示例:

  • 不使用文档切片:根据写入的文本,直接生成embedding、sparse_embedding字段。
  • 使用文档切片:使用ES nested类型,将一个文本切成多个chunk数组,分别对这些chunk进行embedding、sparse_embedding。

说明


不使用文档切片

配置ingest pipeline

文档原始数据长度较小,或已完成文档切片的doc,在向量模型最大处理限制之内,可不使用文档切片,只对写入的content进行text dense embedding和sparse embedding,配置的ingest pipeline示例如下:

PUT _ingest/pipeline/os-pipeline-no-split-demo
{
  "description": "This is an example of text-embedding and sparse-embedding fields",
  "processors": [
    {
      "text_embedding": {
        "model_id": "os-embeddings-test",
        "input_output": [
          {
            "input_field": "content",
            "output_field": "content_embedding"
          }
        ]
      }
    },
    {
      "text_embedding": {
        "model_id": "os-sparse-embeddings-test",
        "input_output": [
          {
            "input_field": "content",
            "output_field": "content_sparse_embedding"
          }
        ]
      }
    }
  ]
}


ingest pipeline创建成功后,可以通过simulate接口(仅用于模拟调试,不会实际创建索引),测试pipeline处理的效果:

POST _ingest/pipeline/os-pipeline-no-split-demo/_simulate
{
  "docs": [
    {
      "_index": "testindex",
      "_id": "1",
      "_source":{
        "content": "elasticsearch产品文档"
      }
    }
    ]
}

创建索引

执行以下代码,创建不使用文档切片的索引:

PUT os_demo_no_split_index
{
  "mappings": {
    "properties": {
        "content": {
          "type": "text"
        },
        "content_embedding":{
          "type": "dense_vector",
          "dims": 1536
        },
        "content_sparse_embedding":{
          "type": "sparse_vector"
        }
      }
  }
}

写入数据

写入数据时带上配置好的pipeline_id,文本数据就可以通过pipeline进行自动的embedding。

POST os_demo_no_split_index/_bulk?pipeline=os-pipeline-no-split-demo
{"index":{}}
{"content":"现代科技的发展推动了人工智能的极速进步。AI在各个领域展现出巨大的潜力,从医疗到金融,AI都在发挥着重要的作用,为人类的生活带来了翻天覆地的变化。"}
{"index":{}}
{"content":"教育是一个国家发展的基石。高质量的教育不仅能够帮助个人实现梦想,还能推动社会的进步。教育公平是实现社会和谐的关键,每个孩子都有受教育的权利。"}
{"index":{}}
{"content":"旅游可以让人们开阔视野,体验不同的文化和风俗。无论是饱览自然风光,还是探寻历史古迹,旅行都能让人们在体验中学习和成长。"}
{"index":{}}
{"content":"健康饮食对于保持身体健康至关重要。合理搭配膳食,摄入足够的营养,不仅可以增强免疫力,还能预防多种疾病。多吃蔬菜水果,少吃高脂食物,是保持健康的重要措施。"}
{"index":{}}
{"content":"互联网改变了人们的生活方式。随着智能手机和社交媒体的普及,信息传播的速度大大加快。人们可以通过网络获取最新的新闻、学习新的知识,以及与朋友保持联系。"}
{"index":{}}
{"content":"历史是一面镜子,通过研究历史,人们能够更好地了解过去,从而预测未来。无论是战争的经验教训,还是文明的更迭,历史都为我们提供了宝贵的知识和智慧。"}
{"index":{}}
{"content":"运动是保持身体健康的重要途径。无论是跑步、游泳,还是做瑜伽,都有助于强身健体。适量的运动可以提高心肺功能,增强体力,减轻压力,提高生活质量。"}
{"index":{}}
{"content":"艺术是人类文明的重要组成部分。通过绘画、音乐、舞蹈等形式,艺术表达了人们的情感和思想。丰富多彩的艺术形式不仅带给人们美的享受,还能陶冶情操、激发创造力。"}
{"index":{}}
{"content":"环境保护是全人类共同的责任。随着工业化进程的推进,环境问题日益严重。保护环境不仅关系到我们这一代人的生活质量,也影响到后代的福祉。"}
{"index":{}}
{"content":"科学研究是推动社会进步的重要力量。通过不断的探索和实验,科学家们揭示了自然界的奥秘,为人类文明的发展提供了强大的推动力。"}
{"index":{}}
{"content":"城市化进程中,城市规划显得尤为重要。科学合理的城市规划能够提高居民的生活质量,优化资源配置,促进经济发展。"}
{"index":{}}
{"content":"文学作品是人类思想的结晶。通过阅读文学作品,人们可以了解不同的世界观和价值观,培养同理心,提升文化素养。"}

查询数据

  • knn查询:
GET os_demo_no_split_index/_search
{
  "_source": "content", 
  "knn" : {
    "field": "content_embedding",
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "os-embeddings-test",
        "model_text": """
        AI在医疗和金融行业的应用
        """
      }
    },
    "k": 10,
    "num_candidates": 100
  }
}


  • 使用RRF查询,并对文本检索、稀疏向量检索、稠密向量检索进行混合排序:
GET os_demo_no_split_index/_search
{
  "_source": "content", 
  "sub_searches":[
    {
      "query":{
        "match": {
          "content": "AI在医疗和金融行业的应用"
        }
      }
    },
    {
      "query": {
        "text_expansion":{
          "content_sparse_embedding":{
            "model_id":"os-sparse-embeddings-test",
            "model_text":"AI在医疗和金融行业的应用"
          }
        }
      }
    }
  ],
  "knn" : {
    "field": "content_embedding",
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "os-embeddings-test",
        "model_text": """
        AI在医疗和金融行业的应用
        """
      }
    },
    "k": 10,
    "num_candidates": 100
  },
  "rank":{
    "rrf":{
    }
  }
}


使用文档切片

配置ingest pipeline

对写入的文档进行文档切片,使用nested类型存储切片内容,将切片后的文档、text embedding向量和sparse embedding向量写入nested的子文档中。

PUT _ingest/pipeline/os-pipeline-demo
{
  "description": "This is an example of splitting, text-embedding and sparse-embedding fields use foreach",
  "processors": [
    {
      "document_splitting": {
        "model_id": "os-doc-split-test",
        "input_output": [
          {
            "input_field": "content",
            "output_field": "chunk",
            "extend_output_field": "chunk_ext"
          }
        ]
      }
    },
    {
      "foreach": {
        "field": "chunk",
        "processor": {
          "text_embedding": {
            "model_id": "os-embeddings-test",
            "input_output": [
              {
                "input_field": "_ingest._value.content",
                "output_field": "_ingest._value.embedding"
              }
            ]
          }
        }
      }
    },
    {
      "foreach": {
        "field": "chunk",
        "processor": {
          "text_embedding": {
            "model_id": "os-sparse-embeddings-test",
            "input_output": [
              {
                "input_field": "_ingest._value.content",
                "output_field": "_ingest._value.sparse_embedding"
              }
            ]
          }
        }
      }
    }
  ]
}


ingest pipeline创建成功后,可以通过simulate接口(仅用于模拟调试,不会实际创建索引),测试pipeline处理的效果:

POST _ingest/pipeline/os-pipeline-demo/_simulate
{
  "docs": [
    {
      "_index": "testindex",
      "_id": "1",
      "_source":{
        "content": "现代科技的发展推动了人工智能的极速进步。AI在各个领域展现出巨大的潜力,从医疗到金融,AI都在发挥着重要的作用,为人类的生活带来了翻天覆地的变化。"
      }
    }
    ]
}

创建索引

执行以下代码,创建使用文档切片的索引:

PUT os_demo_index
{
  "mappings": {
    "properties": {
        "content": {
          "type": "text"
        },
        "chunk":{
          "type":"nested",
          "properties": {
            "content":{
              "type":"text"
            },
            "embedding":{
              "type": "dense_vector",
              "dims": 1536
            },
            "sparse_embedding":{
              "type": "sparse_vector"
            }
          }
        }
      }
  }
}

写入数据

写入数据时带上配置好的pipeline_id,文本数据就可以通过pipeline进行自动的embedding。

POST os_demo_index/_bulk?pipeline=os-pipeline-demo
{"index":{}}
{"content":"现代科技的发展推动了人工智能的极速进步。AI在各个领域展现出巨大的潜力,从医疗到金融,AI都在发挥着重要的作用,为人类的生活带来了翻天覆地的变化。"}
{"index":{}}
{"content":"教育是一个国家发展的基石。高质量的教育不仅能够帮助个人实现梦想,还能推动社会的进步。教育公平是实现社会和谐的关键,每个孩子都有受教育的权利。"}
{"index":{}}
{"content":"旅游可以让人们开阔视野,体验不同的文化和风俗。无论是饱览自然风光,还是探寻历史古迹,旅行都能让人们在体验中学习和成长。"}
{"index":{}}
{"content":"健康饮食对于保持身体健康至关重要。合理搭配膳食,摄入足够的营养,不仅可以增强免疫力,还能预防多种疾病。多吃蔬菜水果,少吃高脂食物,是保持健康的重要措施。"}
{"index":{}}
{"content":"互联网改变了人们的生活方式。随着智能手机和社交媒体的普及,信息传播的速度大大加快。人们可以通过网络获取最新的新闻、学习新的知识,以及与朋友保持联系。"}
{"index":{}}
{"content":"历史是一面镜子,通过研究历史,人们能够更好地了解过去,从而预测未来。无论是战争的经验教训,还是文明的更迭,历史都为我们提供了宝贵的知识和智慧。"}
{"index":{}}
{"content":"运动是保持身体健康的重要途径。无论是跑步、游泳,还是做瑜伽,都有助于强身健体。适量的运动可以提高心肺功能,增强体力,减轻压力,提高生活质量。"}
{"index":{}}
{"content":"艺术是人类文明的重要组成部分。通过绘画、音乐、舞蹈等形式,艺术表达了人们的情感和思想。丰富多彩的艺术形式不仅带给人们美的享受,还能陶冶情操、激发创造力。"}
{"index":{}}
{"content":"环境保护是全人类共同的责任。随着工业化进程的推进,环境问题日益严重。保护环境不仅关系到我们这一代人的生活质量,也影响到后代的福祉。"}
{"index":{}}
{"content":"科学研究是推动社会进步的重要力量。通过不断的探索和实验,科学家们揭示了自然界的奥秘,为人类文明的发展提供了强大的推动力。"}
{"index":{}}
{"content":"城市化进程中,城市规划显得尤为重要。科学合理的城市规划能够提高居民的生活质量,优化资源配置,促进经济发展。"}
{"index":{}}
{"content":"文学作品是人类思想的结晶。通过阅读文学作品,人们可以了解不同的世界观和价值观,培养同理心,提升文化素养。"}

查询数据

  • knn查询:
GET os_demo_index/_search
{
  "_source": "content", 
  "knn" : {
    "field": "chunk.embedding",
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "os-embeddings-test",
        "model_text": """
        AI在医疗和金融行业的应用
        """
      }
    },
    "k": 10,
    "num_candidates": 100
  }
}


  • 查询时带上inner hint,可返回knn查询命中的chunk:
GET os_demo_index/_search
{
  "_source": "content", 
  "knn" : {
    "field": "chunk.embedding",
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "os-embeddings-test",
        "model_text": """
        AI在医疗和金融行业的应用
        """
      }
    },
    "k": 10,
    "num_candidates": 100,
    "inner_hits":{
      "_source": ["chunk.content","chunk.meta"],
      "size":2
    }
  }
}


  • 使用RRF查询,并对文本检索、稀疏向量检索、稠密向量检索进行混合排序。
GET os_demo_index/_search
{
  "_source": "content", 
  "sub_searches":[
    {
      "query":{
        "match": {
          "content": "AI在医疗和金融行业的应用"
        }
      }
    },
    {
      "query":{
        "nested": {
          "path": "chunk",
          "query": {
            "text_expansion":{
              "chunk.sparse_embedding":{
                "model_id":"os-sparse-embeddings-test",
                "model_text":"AI在医疗和金融行业的应用"
              }
            }
          }
        }
      }
    }
  ],
  "knn" : {
    "field": "chunk.embedding",
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "os-embeddings-test",
        "model_text": """
        AI在医疗和金融行业的应用
        """
      }
    },
    "k": 10,
    "num_candidates": 100
  },
  "rank":{
    "rrf":{
    }
  }
}
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
9天前
|
云安全 人工智能 安全
阿里云欧阳欣:AI时代下的安全新范式
2024 云栖大会技术主论坛重磅发布
271 4
阿里云欧阳欣:AI时代下的安全新范式
|
10天前
|
存储 人工智能 运维
重磅!阿里云可观测产品家族全新升级,AI +数据双驱动,打造全栈可观测体系
近日,阿里云可观测产品家族正式发布云监控 2.0,隶属产品日志服务 SLS、云监控 CMS、应用实时监控服务 ARMS 迎来重磅升级。
129 11
|
8天前
|
人工智能 Prometheus Cloud Native
新场景、新能力,AI-native 时代的可观测革新
借助 AI-native 可观测解决方案,阿里云为用户提供开箱即用的覆盖大模型应用、大模型到基础设施的全链路实时观测、告警与诊断能力,帮助企业在复杂的数字化转型过程中更有效地确保资源的高效利用与业务的持续成功。
|
6天前
|
人工智能 运维 大数据
阿里云“触手可及,函数计算玩转 AI 大模型”解决方案评测报告
阿里云“触手可及,函数计算玩转 AI 大模型”解决方案评测报告
18 1
|
6天前
|
人工智能 Cloud Native 调度
阿里云容器服务在AI智算场景的创新与实践
2024年云栖大会,我们总结过往支持AI智算基础底座的实践经验、发现与思考,给出《容器服务在AI智算场景的创新与实践》的演讲。不仅希望将所做所想与客户和社区分享,也期待引出更多云原生AI领域的交流和共建。
|
7天前
|
云安全 人工智能 安全
AI时代云安全新范式,阿里云安全能力全线升级!
AI时代,云安全面临着新的挑战,不仅要持续面对以往的传统问题,更需要全新理念落地于产品设计、技术演进、架构设计,才能实现效果、性能、和成本的最优解。
31 0
|
7天前
|
人工智能 关系型数据库 分布式数据库
用友X阿里云:加速AI in SaaS
在今年的云栖大会上,用友公司与阿里云共同宣布将进一步加深合作,推动用友BIP与阿里云深度融合,以SaaS模式为诸多大中型企业客户提供一体化解决方案。同时,通义大模型已作为底层基础大模型集成到用友企业服务大模型YonGPT,加速企业数智化转型。
28 0
|
6天前
|
机器学习/深度学习 数据采集 人工智能
探索AI技术在文本生成中的应用与挑战
【9月更文挑战第26天】本文深入探讨了AI技术在文本生成领域的应用,并分析了其面临的挑战。通过介绍AI文本生成的基本原理、应用场景以及未来发展趋势,帮助读者全面了解该技术的潜力和局限性。同时,文章还提供了代码示例,展示了如何使用Python和相关库实现简单的文本生成模型。
30 9
|
2天前
|
机器学习/深度学习 人工智能 供应链
精准农业:AI在农业生产中的应用
【10月更文挑战第1天】随着科技的发展,人工智能(AI)逐渐渗透到农业领域,通过精准监控和管理提升了农业生产效率和质量。AI在精准农业中的应用包括:精准农田管理,如个性化灌溉和施肥;作物病虫害识别与预测,及时发现并预防病虫害;智能农机自动化作业,提高作业效率;农产品质量检测与分类,确保品质;农业供应链优化,预测需求和价格。尽管面临数据收集、技术接受度等挑战,AI在精准农业中的未来前景广阔,有望实现全程自动化作业、数据驱动决策及智能预警系统,推动农业可持续发展。
22 11
|
2天前
|
机器学习/深度学习 数据采集 人工智能
探索AI在医疗诊断中的应用
【9月更文挑战第30天】本文将探讨人工智能(AI)如何在医疗诊断中发挥重要作用。我们将从AI的基本概念开始,然后深入到其在医疗领域的应用,特别是如何帮助医生进行更准确的诊断。最后,我们将通过一些实际的代码示例来展示AI是如何工作的。无论你是AI专家还是医疗专业人士,这篇文章都将为你提供有价值的信息。

相关产品

  • 检索分析服务 Elasticsearch版
  • 下一篇
    无影云桌面