阿里云检索服务Elasticsearch版(简称ES)结合了搜索开发工作台的组件化模型能力,本文介绍如何搭建AI语义搜索。
方案介绍
阿里云搜索开发工作台围绕智能搜索及检索增强生成RAG(Retrieval-Augmented Generation)场景,能够提供优质的组件化服务。阿里云ES提供高性能混合检索方案,结合搜索开发工作台AI模型服务,可以提供完整的AI语义搜索方案。
方案如下:
- 数据写入原理:
对大文档数据进行切片处理(可选操作),将切分后的文档片段调用文本向量化服务,生成稠密向量(Dense ventor)和稀疏向量(Sparse ventor),在阿里云ES中构建稠密向量索引和稀疏向量索引。稀疏向量常用于表达关键词和词频信息,可与稠密向量、文本索引搭配进行混合检索,提升检索效果。 - 数据查询原理:
将需要查询的Query信息,通过向量化模型转换为稠密向量和稀疏向量,在阿里云ES中进行混合检索,召回TOP N文档内容。
前提条件
- 已创建阿里云ES 8.13及以上版本实例。具体操作,请参见创建阿里云Elasticsearch实例。
说明
- 将待访问ES实例的设备的IP地址加入ES实例的公网或私网访问白名单中,详情请参见配置实例公网或私网访问白名单。
- 登录Kibana控制台。您可以在Kibana控制台的开发工具(Dev Tools)上执行本文中出现的所有代码。具体操作,请参见登录Kibana控制台。
- 已在华东2(上海)地域开通阿里云搜索开发工作台服务。具体操作,请参见开通服务。
说明
步骤一:创建模型
阿里云ES的Inference API提供了加载第三方模型服务的功能, 同时扩展了对阿里云搜索开发工作台推理模型服务的支持,详情参见阿里云Elasticsearch Inference API介绍。
在阿里云ES中注册搜索开发工作台模型服务,构建语义搜索需要的模型服务如下:
说明
- 您也可以使用已注册模型服务快速搭建语义搜索。
环节 |
服务说明 |
服务说明文档 |
文档切片 |
文档切片服务(ops-document-split-001):提供通用文本切片服务,支持基于文档段落、文本语义、指定规则,对HTML、Markdown、txt格式的结构化数据进行拆分,同时支持以富文本形式提取文档中的代码、图片以及表格。 |
|
文本向量化 |
|
|
文本稀疏向量化 |
文本稀疏向量化服务(ops-text-sparse-embedding-001):提供将文本数据转化为稀疏向量形式表达的服务,稀疏向量存储空间更小,常用于表达关键词和词频信息,可与稠密向量搭配进行混合检索,提升检索效果。提供多语言(100+)文本向量化服务,输入文本最大长度8192。 |
创建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的更多信息,请参见Ingest Processor扩展。
不使用文档切片
配置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":{ } } }