阿里云檢索服務Elasticsearch版(簡稱ES)結合了搜索開放平臺的組件化模型能力,可以用于構建高效、精準的語義搜索系統。本文介紹搭建AI語義搜索的方法,帶您體驗AI技術如何提升搜索的準確性和用戶體驗。
前提條件
已創建阿里云ES 8.13及以上版本實例。本文以8.15版本為例。具體操作,請參見創建阿里云Elasticsearch實例。
已開通阿里云搜索開放平臺并創建AI推理模型。
8.15及以上版本,在ES實例控制臺自動創建AI模型。具體操作,請參見創建AI推理模型。
8.13版本,在Kibana中通過代碼創建AI模型。更多信息,請參見創建和調用Inference APIs。
已登錄ES實例的Kibana控制臺。具體操作,請參見登錄Kibana控制臺。
您可以在Kibana控制臺的開發工具(Dev Tools)上執行本文中出現的所有代碼。
操作流程
AI場景語義搜索包括數據寫入和數據查詢兩個核心步驟。具體原理,請參見AI語義搜索。操作流程包括:
AI模型調試:驗證模型是否可以成功調用。
數據處理與寫入:
配置ingest pipeline:配置可以對數據進行預處理的ingest pipeline,應用文檔切片模型對源數據進行語義切分,應用向量化模型生成文檔片段的稠密與稀疏向量。
創建索引:在ES中建立基于向量的文檔索引。
寫入數據:將源數據寫入索引作為搜索內容的基礎。
數據查詢:
Knn查詢:將Query轉化為稠密向量進行稠密向量檢索。
RRF查詢:將Query轉化為稠密向量及稀疏向量,并進行全文檢索、稠密向量檢索、稀疏向量檢索,通過融合排序算法召回Top 10的內容。
本文演示了2個ES語義搜索示例:
不使用文檔切片:根據寫入的文本,直接生成embedding、sparse_embedding字段。
使用文檔切片:使用ES nested類型,將一個文本切成多個chunk數組,分別對這些chunk進行embedding、sparse_embedding。
操作步驟(不使用文檔切片)
步驟一:(可選)調試模型
調試doc_split推理模型。
POST _inference/doc_split/ops-document-split-001 { "input":["文檔切片服務(ops-document-split-001):提供通用文本切片服務,支持基于文檔段落、文本語義、指定規則,對HTML、Markdown、txt格式的結構化數據進行拆分,同時支持以富文本形式提取文檔中的代碼、圖片以及表格。OpenSearch文本向量化服務-001(ops-text-embedding-001)提供多語言(40+)文本向量化服務,輸入文本最大長度300,輸出向量維度1536維。"] }
調試text_embedding推理模型。
POST _inference/text_embedding/ops-text-embedding-001 { "input":["科學技術是第一生產力", "elasticsearch產品文檔"] }
調試sparse_embedding推理模型。
POST _inference/sparse_embedding/ops-text-sparse-embedding-001 { "input":["科學技術是第一生產力", "elasticsearch產品文檔"] }
步驟二:配置ingest pipeline
文檔原始數據長度較小,或已完成文檔切片的doc,在向量模型最大處理限制之內,可不使用文檔切片,只對寫入的內容進行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": "ops-text-embedding-001",
"input_output": [
{
"input_field": "content",
"output_field": "content_embedding"
}
]
}
},
{
"text_embedding": {
"model_id": "ops-text-sparse-embedding-001",
"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處理后的數據寫入索引作為搜索內容基礎。
寫入數據時帶上配置好的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查詢(稠密向量檢索)
將Query轉化為稠密向量進行稠密向量檢索。
GET os_demo_no_split_index/_search
{
"_source": "content",
"knn" : {
"field": "content_embedding",
"query_vector_builder": {
"text_embedding": {
"model_id": "ops-text-embedding-001",
"model_text": """
AI在醫療和金融行業的應用
"""
}
},
"k": 10,
"num_candidates": 100
}
}
RRF查詢(混合檢索)
將Query轉化為稠密向量及稀疏向量,并進行全文檢索、稠密向量檢索、稀疏向量檢索,通過融合排序算法召回Top 10的內容。
GET os_demo_no_split_index/_search
{
"_source": "content",
"sub_searches":[
{
"query":{
"match": {
"content": "AI在醫療和金融行業的應用"
}
}
},
{
"query": {
"text_expansion":{
"content_sparse_embedding":{
"model_id":"ops-text-sparse-embedding-001",
"model_text":"AI在醫療和金融行業的應用"
}
}
}
}
],
"knn" : {
"field": "content_embedding",
"query_vector_builder": {
"text_embedding": {
"model_id": "ops-text-embedding-001",
"model_text": """
AI在醫療和金融行業的應用
"""
}
},
"k": 10,
"num_candidates": 100
},
"rank":{
"rrf":{
}
}
}
操作步驟(使用文檔切片)
步驟一:(可選)調試模型
調試doc_split推理模型。
POST _inference/doc_split/ops-document-split-001 { "input":["文檔切片服務(ops-document-split-001):提供通用文本切片服務,支持基于文檔段落、文本語義、指定規則,對HTML、Markdown、txt格式的結構化數據進行拆分,同時支持以富文本形式提取文檔中的代碼、圖片以及表格。OpenSearch文本向量化服務-001(ops-text-embedding-001)提供多語言(40+)文本向量化服務,輸入文本最大長度300,輸出向量維度1536維。"] }
調試text_embedding推理模型。
POST _inference/text_embedding/ops-text-embedding-001 { "input":["科學技術是第一生產力", "elasticsearch產品文檔"] }
調試sparse_embedding推理模型。
POST _inference/sparse_embedding/ops-text-sparse-embedding-001 { "input":["科學技術是第一生產力", "elasticsearch產品文檔"] }
步驟二:配置ingest pipeline
pipeline配置文檔切片模型對文檔進行語義切分,并應用向量化模型將切片后的文檔生成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": "ops-document-split-001",
"input_output": [
{
"input_field": "content",
"output_field": "chunk",
"extend_output_field": "chunk_ext"
}
]
}
},
{
"foreach": {
"field": "chunk",
"processor": {
"text_embedding": {
"model_id": "ops-text-embedding-001",
"input_output": [
{
"input_field": "_ingest._value.content",
"output_field": "_ingest._value.embedding"
}
]
}
}
}
},
{
"foreach": {
"field": "chunk",
"processor": {
"text_embedding": {
"model_id": "ops-text-sparse-embedding-001",
"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都在發揮著重要的作用,為人類的生活帶來了翻天覆地的變化。"
}
}
]
}
步驟三:創建索引
執行以下代碼,在ES中建立基于向量的文檔索引。
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處理后的數據寫入索引作為搜索內容基礎。
寫入數據時帶上配置好的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":"文學作品是人類思想的結晶。通過閱讀文學作品,人們可以了解不同的世界觀和價值觀,培養同理心,提升文化素養。"}
步驟五:查詢數據
content
、model_text
中的內容,可以替換為您想要查詢的內容。
knn查詢(稠密向量檢索)
將Query轉化為稠密向量進行稠密向量檢索。
GET os_demo_index/_search
{
"_source": "content",
"knn" : {
"field": "chunk.embedding",
"query_vector_builder": {
"text_embedding": {
"model_id": "ops-text-embedding-001",
"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": "ops-text-embedding-001",
"model_text": """
AI在醫療和金融行業的應用
"""
}
},
"k": 10,
"num_candidates": 100,
"inner_hits":{
"_source": ["chunk.content","chunk.meta"],
"size":2
}
}
}
RRF查詢(混合檢索)
將Query轉化為稠密向量及稀疏向量,并進行全文檢索、稠密向量檢索、稀疏向量檢索,通過融合排序算法召回Top 10的內容。
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":"ops-text-sparse-embedding-001",
"model_text":"AI在醫療和金融行業的應用"
}
}
}
}
}
}
],
"knn" : {
"field": "chunk.embedding",
"query_vector_builder": {
"text_embedding": {
"model_id": "ops-text-embedding-001",
"model_text": """
AI在醫療和金融行業的應用
"""
}
},
"k": 10,
"num_candidates": 100
},
"rank":{
"rrf":{
}
}
}
常見問題
配置inference接口時的相關報錯及解決方法:
報錯信息:
"Received an unsuccessful status code for request from inference entity id [${inference_endpoint}] status [400]. Error message: [Credentials is not found]"
。解決方法:配置的api_key不存在,請檢查api_key是否配置正確。
報錯信息:
"Received an unsuccessful status code for request from inference entity id [${inference_endpoint}] status [400]. Error message: [service_id does not exist]"
。解決方法:配置的service_id不存在,請檢查service_id是否配置正確。
報錯信息:
"Invalid host [${URL}], please check that the URL is correct."
。解決方法:配置的host錯誤,請檢查host是否配置正確。
報錯信息:
"Received an unsuccessful status code for request from inference entity id [${inference_endpoint}] status [400]. Error message: [App is not found]"
。解決方法:配置的workspace錯誤,請檢查workspace是否配置正確。