阿里云Elasticsearch AI場(chǎng)景語義搜索
阿里云檢索服務(wù)Elasticsearch版(簡(jiǎn)稱ES)結(jié)合了搜索開發(fā)工作臺(tái)的組件化模型能力,本文介紹搭建AI語義搜索的方案。
方案介紹
阿里云搜索開發(fā)工作臺(tái)圍繞智能搜索及檢索增強(qiáng)生成RAG(Retrieval-Augmented Generation)場(chǎng)景,能夠提供優(yōu)質(zhì)的組件化服務(wù)。阿里云ES提供高性能混合檢索方案,結(jié)合搜索開發(fā)工作臺(tái)AI模型服務(wù),可以提供完整的AI語義搜索方案。方案如下:
數(shù)據(jù)寫入原理:
對(duì)大文檔數(shù)據(jù)進(jìn)行切片處理(可選操作),將切分后的文檔片段調(diào)用文本向量化服務(wù),生成稠密向量(Dense ventor)和稀疏向量(Sparse ventor),在阿里云ES中構(gòu)建稠密向量索引和稀疏向量索引。稀疏向量常用于表達(dá)關(guān)鍵詞和詞頻信息,可與稠密向量、文本索引搭配進(jìn)行混合檢索,提升檢索效果。
數(shù)據(jù)查詢?cè)恚?/p>
將需要查詢的Query信息,通過向量化模型轉(zhuǎn)換為稠密向量和稀疏向量,在阿里云ES中進(jìn)行混合檢索,召回TOP N文檔內(nèi)容。
前提條件
已創(chuàng)建阿里云ES 8.13及以上版本實(shí)例。具體操作,請(qǐng)參見創(chuàng)建阿里云Elasticsearch實(shí)例。
說明將待訪問ES實(shí)例的設(shè)備的IP地址加入ES實(shí)例的公網(wǎng)或私網(wǎng)訪問白名單中,詳情請(qǐng)參見配置實(shí)例公網(wǎng)或私網(wǎng)訪問白名單。
登錄Kibana控制臺(tái)。您可以在Kibana控制臺(tái)的開發(fā)工具(Dev Tools)上執(zhí)行本文中出現(xiàn)的所有代碼。具體操作,請(qǐng)參見登錄Kibana控制臺(tái)。
已在華東2(上海)地域開通阿里云搜索開發(fā)工作臺(tái)服務(wù)。具體操作,請(qǐng)參見開通服務(wù)。
說明獲取搜索開發(fā)工作臺(tái)服務(wù)的調(diào)用地址和身份鑒權(quán)信息,詳情請(qǐng)參見獲取服務(wù)調(diào)用地址、管理API-KEY。
步驟一:創(chuàng)建模型
阿里云ES的Inference API提供了加載第三方模型服務(wù)的功能, 同時(shí)擴(kuò)展了對(duì)阿里云搜索開發(fā)工作臺(tái)推理模型服務(wù)的支持,詳情參見阿里云Elasticsearch Inference API介紹。
在阿里云ES中注冊(cè)搜索開發(fā)工作臺(tái)模型服務(wù),構(gòu)建語義搜索需要的模型服務(wù)如下:
您也可以使用已注冊(cè)模型服務(wù)快速搭建語義搜索。
環(huán)節(jié) | 服務(wù)說明 | 服務(wù)說明文檔 |
文檔切片 | 文檔切片服務(wù)(ops-document-split-001):提供通用文本切片服務(wù),支持基于文檔段落、文本語義、指定規(guī)則,對(duì)HTML、Markdown、txt格式的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行拆分,同時(shí)支持以富文本形式提取文檔中的代碼、圖片以及表格。 | |
文本向量化 |
| |
文本稀疏向量化 | 文本稀疏向量化服務(wù)(ops-text-sparse-embedding-001):提供將文本數(shù)據(jù)轉(zhuǎn)化為稀疏向量形式表達(dá)的服務(wù),稀疏向量存儲(chǔ)空間更小,常用于表達(dá)關(guān)鍵詞和詞頻信息,可與稠密向量搭配進(jìn)行混合檢索,提升檢索效果。提供多語言(100+)文本向量化服務(wù),輸入文本最大長(zhǎng)度8192。 |
創(chuàng)建doc_split推理模型
注冊(cè)搜索開發(fā)工作臺(tái)文檔切片服務(wù)(ops-document-split-001),創(chuàng)建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
用來設(shè)置切片的最大長(zhǎng)度,默認(rèn)值是300。由于本文測(cè)試的文本較短,為了測(cè)試查詢時(shí)的inner_hits
參數(shù),以上示例max_chunk_size設(shè)置了較小值。其他參數(shù)請(qǐng)參見阿里云Elasticsearch Inference API介紹。
創(chuàng)建text_embedding推理模型
注冊(cè)搜索開發(fā)工作臺(tái)文本向量化服務(wù)-001(ops-text-embedding-001),創(chuàng)建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"
}
}
創(chuàng)建sparse_embedding推理模型
注冊(cè)搜索開發(fā)工作臺(tái)文本稀疏向量化服務(wù)(ops-text-sparse-embedding-001),創(chuàng)建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"
}
}
調(diào)試模型
以下代碼以調(diào)試text_embedding推理模型為例,其他模型使用類似方式調(diào)試。
POST _inference/text_embedding/os-embeddings-test
{
"input":["科學(xué)技術(shù)是第一生產(chǎn)力", "elasticsearch產(chǎn)品文檔"]
}
步驟二:調(diào)用服務(wù)搭建語義搜索并調(diào)試
以下演示了2個(gè)ES語義搜索示例:
不使用文檔切片:根據(jù)寫入的文本,直接生成embedding、sparse_embedding字段。
使用文檔切片:使用ES nested類型,將一個(gè)文本切成多個(gè)chunk數(shù)組,分別對(duì)這些chunk進(jìn)行embedding、sparse_embedding。
關(guān)于ingest pipeline的更多信息,請(qǐng)參見Ingest Processor擴(kuò)展。
不使用文檔切片
配置ingest pipeline
文檔原始數(shù)據(jù)長(zhǎng)度較小,或已完成文檔切片的doc,在向量模型最大處理限制之內(nèi),可不使用文檔切片,只對(duì)寫入的content進(jìn)行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創(chuàng)建成功后,可以通過simulate接口(僅用于模擬調(diào)試,不會(huì)實(shí)際創(chuàng)建索引),測(cè)試pipeline處理的效果:
POST _ingest/pipeline/os-pipeline-no-split-demo/_simulate
{
"docs": [
{
"_index": "testindex",
"_id": "1",
"_source":{
"content": "elasticsearch產(chǎn)品文檔"
}
}
]
}
創(chuàng)建索引
執(zhí)行以下代碼,創(chuàng)建不使用文檔切片的索引:
PUT os_demo_no_split_index
{
"mappings": {
"properties": {
"content": {
"type": "text"
},
"content_embedding":{
"type": "dense_vector",
"dims": 1536
},
"content_sparse_embedding":{
"type": "sparse_vector"
}
}
}
}
寫入數(shù)據(jù)
寫入數(shù)據(jù)時(shí)帶上配置好的pipeline_id,文本數(shù)據(jù)就可以通過pipeline進(jìn)行自動(dòng)的embedding。
POST os_demo_no_split_index/_bulk?pipeline=os-pipeline-no-split-demo
{"index":{}}
{"content":"現(xiàn)代科技的發(fā)展推動(dòng)了人工智能的極速進(jìn)步。AI在各個(gè)領(lǐng)域展現(xiàn)出巨大的潛力,從醫(yī)療到金融,AI都在發(fā)揮著重要的作用,為人類的生活帶來了翻天覆地的變化。"}
{"index":{}}
{"content":"教育是一個(gè)國(guó)家發(fā)展的基石。高質(zhì)量的教育不僅能夠幫助個(gè)人實(shí)現(xiàn)夢(mèng)想,還能推動(dòng)社會(huì)的進(jìn)步。教育公平是實(shí)現(xiàn)社會(huì)和諧的關(guān)鍵,每個(gè)孩子都有受教育的權(quán)利。"}
{"index":{}}
{"content":"旅游可以讓人們開闊視野,體驗(yàn)不同的文化和風(fēng)俗。無論是飽覽自然風(fēng)光,還是探尋歷史古跡,旅行都能讓人們?cè)隗w驗(yàn)中學(xué)習(xí)和成長(zhǎng)。"}
{"index":{}}
{"content":"健康飲食對(duì)于保持身體健康至關(guān)重要。合理搭配膳食,攝入足夠的營(yíng)養(yǎng),不僅可以增強(qiáng)免疫力,還能預(yù)防多種疾病。多吃蔬菜水果,少吃高脂食物,是保持健康的重要措施。"}
{"index":{}}
{"content":"互聯(lián)網(wǎng)改變了人們的生活方式。隨著智能手機(jī)和社交媒體的普及,信息傳播的速度大大加快。人們可以通過網(wǎng)絡(luò)獲取最新的新聞、學(xué)習(xí)新的知識(shí),以及與朋友保持聯(lián)系。"}
{"index":{}}
{"content":"歷史是一面鏡子,通過研究歷史,人們能夠更好地了解過去,從而預(yù)測(cè)未來。無論是戰(zhàn)爭(zhēng)的經(jīng)驗(yàn)教訓(xùn),還是文明的更迭,歷史都為我們提供了寶貴的知識(shí)和智慧。"}
{"index":{}}
{"content":"運(yùn)動(dòng)是保持身體健康的重要途徑。無論是跑步、游泳,還是做瑜伽,都有助于強(qiáng)身健體。適量的運(yùn)動(dòng)可以提高心肺功能,增強(qiáng)體力,減輕壓力,提高生活質(zhì)量。"}
{"index":{}}
{"content":"藝術(shù)是人類文明的重要組成部分。通過繪畫、音樂、舞蹈等形式,藝術(shù)表達(dá)了人們的情感和思想。豐富多彩的藝術(shù)形式不僅帶給人們美的享受,還能陶冶情操、激發(fā)創(chuàng)造力。"}
{"index":{}}
{"content":"環(huán)境保護(hù)是全人類共同的責(zé)任。隨著工業(yè)化進(jìn)程的推進(jìn),環(huán)境問題日益嚴(yán)重。保護(hù)環(huán)境不僅關(guān)系到我們這一代人的生活質(zhì)量,也影響到后代的福祉。"}
{"index":{}}
{"content":"科學(xué)研究是推動(dòng)社會(huì)進(jìn)步的重要力量。通過不斷的探索和實(shí)驗(yàn),科學(xué)家們揭示了自然界的奧秘,為人類文明的發(fā)展提供了強(qiáng)大的推動(dòng)力。"}
{"index":{}}
{"content":"城市化進(jìn)程中,城市規(guī)劃顯得尤為重要??茖W(xué)合理的城市規(guī)劃能夠提高居民的生活質(zhì)量,優(yōu)化資源配置,促進(jìn)經(jīng)濟(jì)發(fā)展。"}
{"index":{}}
{"content":"文學(xué)作品是人類思想的結(jié)晶。通過閱讀文學(xué)作品,人們可以了解不同的世界觀和價(jià)值觀,培養(yǎng)同理心,提升文化素養(yǎng)。"}
查詢數(shù)據(jù)
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在醫(yī)療和金融行業(yè)的應(yīng)用 """ } }, "k": 10, "num_candidates": 100 } }
使用RRF查詢,并對(duì)文本檢索、稀疏向量檢索、稠密向量檢索進(jìn)行混合排序:
GET os_demo_no_split_index/_search { "_source": "content", "sub_searches":[ { "query":{ "match": { "content": "AI在醫(yī)療和金融行業(yè)的應(yīng)用" } } }, { "query": { "text_expansion":{ "content_sparse_embedding":{ "model_id":"os-sparse-embeddings-test", "model_text":"AI在醫(yī)療和金融行業(yè)的應(yīng)用" } } } } ], "knn" : { "field": "content_embedding", "query_vector_builder": { "text_embedding": { "model_id": "os-embeddings-test", "model_text": """ AI在醫(yī)療和金融行業(yè)的應(yīng)用 """ } }, "k": 10, "num_candidates": 100 }, "rank":{ "rrf":{ } } }
使用文檔切片
配置ingest pipeline
對(duì)寫入的文檔進(jìn)行文檔切片,使用nested類型存儲(chǔ)切片內(nèi)容,將切片后的文檔、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創(chuàng)建成功后,可以通過simulate接口(僅用于模擬調(diào)試,不會(huì)實(shí)際創(chuàng)建索引),測(cè)試pipeline處理的效果::
POST _ingest/pipeline/os-pipeline-demo/_simulate
{
"docs": [
{
"_index": "testindex",
"_id": "1",
"_source":{
"content": "現(xiàn)代科技的發(fā)展推動(dòng)了人工智能的極速進(jìn)步。AI在各個(gè)領(lǐng)域展現(xiàn)出巨大的潛力,從醫(yī)療到金融,AI都在發(fā)揮著重要的作用,為人類的生活帶來了翻天覆地的變化。"
}
}
]
}
創(chuàng)建索引
執(zhí)行以下代碼,創(chuàng)建使用文檔切片的索引:
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"
}
}
}
}
}
}
寫入數(shù)據(jù)
寫入數(shù)據(jù)時(shí)帶上配置好的pipeline_id,文本數(shù)據(jù)就可以通過pipeline進(jìn)行自動(dòng)的embedding。
POST os_demo_index/_bulk?pipeline=os-pipeline-demo
{"index":{}}
{"content":"現(xiàn)代科技的發(fā)展推動(dòng)了人工智能的極速進(jìn)步。AI在各個(gè)領(lǐng)域展現(xiàn)出巨大的潛力,從醫(yī)療到金融,AI都在發(fā)揮著重要的作用,為人類的生活帶來了翻天覆地的變化。"}
{"index":{}}
{"content":"教育是一個(gè)國(guó)家發(fā)展的基石。高質(zhì)量的教育不僅能夠幫助個(gè)人實(shí)現(xiàn)夢(mèng)想,還能推動(dòng)社會(huì)的進(jìn)步。教育公平是實(shí)現(xiàn)社會(huì)和諧的關(guān)鍵,每個(gè)孩子都有受教育的權(quán)利。"}
{"index":{}}
{"content":"旅游可以讓人們開闊視野,體驗(yàn)不同的文化和風(fēng)俗。無論是飽覽自然風(fēng)光,還是探尋歷史古跡,旅行都能讓人們?cè)隗w驗(yàn)中學(xué)習(xí)和成長(zhǎng)。"}
{"index":{}}
{"content":"健康飲食對(duì)于保持身體健康至關(guān)重要。合理搭配膳食,攝入足夠的營(yíng)養(yǎng),不僅可以增強(qiáng)免疫力,還能預(yù)防多種疾病。多吃蔬菜水果,少吃高脂食物,是保持健康的重要措施。"}
{"index":{}}
{"content":"互聯(lián)網(wǎng)改變了人們的生活方式。隨著智能手機(jī)和社交媒體的普及,信息傳播的速度大大加快。人們可以通過網(wǎng)絡(luò)獲取最新的新聞、學(xué)習(xí)新的知識(shí),以及與朋友保持聯(lián)系。"}
{"index":{}}
{"content":"歷史是一面鏡子,通過研究歷史,人們能夠更好地了解過去,從而預(yù)測(cè)未來。無論是戰(zhàn)爭(zhēng)的經(jīng)驗(yàn)教訓(xùn),還是文明的更迭,歷史都為我們提供了寶貴的知識(shí)和智慧。"}
{"index":{}}
{"content":"運(yùn)動(dòng)是保持身體健康的重要途徑。無論是跑步、游泳,還是做瑜伽,都有助于強(qiáng)身健體。適量的運(yùn)動(dòng)可以提高心肺功能,增強(qiáng)體力,減輕壓力,提高生活質(zhì)量。"}
{"index":{}}
{"content":"藝術(shù)是人類文明的重要組成部分。通過繪畫、音樂、舞蹈等形式,藝術(shù)表達(dá)了人們的情感和思想。豐富多彩的藝術(shù)形式不僅帶給人們美的享受,還能陶冶情操、激發(fā)創(chuàng)造力。"}
{"index":{}}
{"content":"環(huán)境保護(hù)是全人類共同的責(zé)任。隨著工業(yè)化進(jìn)程的推進(jìn),環(huán)境問題日益嚴(yán)重。保護(hù)環(huán)境不僅關(guān)系到我們這一代人的生活質(zhì)量,也影響到后代的福祉。"}
{"index":{}}
{"content":"科學(xué)研究是推動(dòng)社會(huì)進(jìn)步的重要力量。通過不斷的探索和實(shí)驗(yàn),科學(xué)家們揭示了自然界的奧秘,為人類文明的發(fā)展提供了強(qiáng)大的推動(dòng)力。"}
{"index":{}}
{"content":"城市化進(jìn)程中,城市規(guī)劃顯得尤為重要??茖W(xué)合理的城市規(guī)劃能夠提高居民的生活質(zhì)量,優(yōu)化資源配置,促進(jìn)經(jīng)濟(jì)發(fā)展。"}
{"index":{}}
{"content":"文學(xué)作品是人類思想的結(jié)晶。通過閱讀文學(xué)作品,人們可以了解不同的世界觀和價(jià)值觀,培養(yǎng)同理心,提升文化素養(yǎng)。"}
查詢數(shù)據(jù)
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在醫(yī)療和金融行業(yè)的應(yīng)用 """ } }, "k": 10, "num_candidates": 100 } }
查詢時(shí)帶上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在醫(yī)療和金融行業(yè)的應(yīng)用 """ } }, "k": 10, "num_candidates": 100, "inner_hits":{ "_source": ["chunk.content","chunk.meta"], "size":2 } } }
使用RRF查詢,并對(duì)文本檢索、稀疏向量檢索、稠密向量檢索進(jìn)行混合排序。
GET os_demo_index/_search { "_source": "content", "sub_searches":[ { "query":{ "match": { "content": "AI在醫(yī)療和金融行業(yè)的應(yīng)用" } } }, { "query":{ "nested": { "path": "chunk", "query": { "text_expansion":{ "chunk.sparse_embedding":{ "model_id":"os-sparse-embeddings-test", "model_text":"AI在醫(yī)療和金融行業(yè)的應(yīng)用" } } } } } } ], "knn" : { "field": "chunk.embedding", "query_vector_builder": { "text_embedding": { "model_id": "os-embeddings-test", "model_text": """ AI在醫(yī)療和金融行業(yè)的應(yīng)用 """ } }, "k": 10, "num_candidates": 100 }, "rank":{ "rrf":{ } } }
常見問題
配置inference接口時(shí)的相關(guān)報(bào)錯(cuò)及解決方法:
報(bào)錯(cuò)信息:
"Received an unsuccessful status code for request from inference entity id [${inference_endpoint}] status [400]. Error message: [Credentials is not found]"
。解決方法:配置的api_key不存在,請(qǐng)檢查api_key是否配置正確。
報(bào)錯(cuò)信息:
"Received an unsuccessful status code for request from inference entity id [${inference_endpoint}] status [400]. Error message: [service_id does not exist]"
。解決方法:配置的service_id不存在,請(qǐng)檢查service_id是否配置正確。
報(bào)錯(cuò)信息:
"Invalid host [${URL}], please check that the URL is correct."
。解決方法:配置的host錯(cuò)誤,請(qǐng)檢查host是否配置正確。
報(bào)錯(cuò)信息:
"Received an unsuccessful status code for request from inference entity id [${inference_endpoint}] status [400]. Error message: [App is not found]"
。解決方法:配置的workspace錯(cuò)誤,請(qǐng)加差workspace是否配置正確。