這篇文章將為大家詳細(xì)講解有關(guān)基于Milvus實(shí)現(xiàn)向量與結(jié)構(gòu)化數(shù)據(jù)混合查詢(xún)的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
專(zhuān)注于為中小企業(yè)提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)婁煩免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了數(shù)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
通過(guò)深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)模型,可以將圖片、視頻、語(yǔ)音、還有文本等非結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)換為特征向量。除了結(jié)構(gòu)化的向量,這些數(shù)據(jù)往往也需添加其他屬性。如人臉圖片,可以添加性別、是否戴眼鏡、圖片抓取時(shí)間等標(biāo)簽;文本可以添加語(yǔ)言類(lèi)型、語(yǔ)料分類(lèi)、文本創(chuàng)建時(shí)間等標(biāo)簽。
以往,人們通常將特征向量存入結(jié)構(gòu)化的標(biāo)簽屬性表。但傳統(tǒng)數(shù)據(jù)庫(kù)無(wú)法針對(duì)海量、高維特征向量進(jìn)行有效的搜索。這時(shí)就需要一個(gè)特征向量數(shù)據(jù)庫(kù),用來(lái)高效存儲(chǔ)、檢索特征向量。
Milvus 是一款向量搜索引擎,可以輕松實(shí)現(xiàn)針對(duì)海量向量的高性能檢索。結(jié)合傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)如 Postgres ,用其存儲(chǔ) Milvus 對(duì)向量的唯一標(biāo)識(shí) ID 和向量的對(duì)應(yīng)屬性。將 Milvus 向量檢索結(jié)果,在 Postgres 中進(jìn)一步查詢(xún),就能快速得出混合查詢(xún)結(jié)果,具體解決方案如下:
1、特征向量存儲(chǔ)
如上圖藍(lán)色實(shí)線(xiàn),其表示 Milvus 混合查詢(xún)的特征向量存儲(chǔ)過(guò)程。首先,將源特征向量數(shù)據(jù)存入 Milvus 特征向量數(shù)據(jù)庫(kù), Milvus 會(huì)給返回每個(gè)源向量數(shù)據(jù)對(duì)應(yīng)的 ID 。然后將每個(gè)特征向量的唯一標(biāo)識(shí) ID 與其標(biāo)簽屬性存儲(chǔ)至關(guān)系型數(shù)據(jù)庫(kù),如 Postgres ,至此完成特征向量與標(biāo)簽屬性的存儲(chǔ)。
2、特征向量檢索
如上圖橙色實(shí)線(xiàn),其表示 Milvus 混合查詢(xún)的特征向量檢索過(guò)程。向 Milvus 中傳入需要查詢(xún)的特征向量數(shù)據(jù), Milvus 會(huì)得出與搜索向量相似度最高的查詢(xún)結(jié)果 ID ,利用該結(jié)果 ID 到 Postgres 中進(jìn)行查詢(xún),最終得出檢索向量的混合查詢(xún)結(jié)果。
至此,你可能會(huì)有疑問(wèn),為什么不直接將特征向量和對(duì)應(yīng)屬性存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中呢?接下來(lái)將用 Milvus 對(duì) ANN_SIFT1B 中的一億數(shù)據(jù)進(jìn)行測(cè)試,為你解答,參考鏈接[1]。
1、特征向量數(shù)據(jù)集
本次實(shí)現(xiàn)的 Mivus 混合查詢(xún),其特征向量提取自 ANN_SIFT1B 中 Base Set 文件中的一億數(shù)據(jù)( 128 維)。特征向量檢索時(shí)從 Query set 中提取,假定 ANN_SIFT1B 數(shù)據(jù)集為人臉特征向量,并為每個(gè)向量添加性別、是否戴眼鏡、圖片抓取時(shí)間的標(biāo)簽:
# 提取 Base Set 文件中的一億數(shù)據(jù),以用于導(dǎo)入 Milvus
vectors = load_bvecs_data(FILE_PATH,10000000)
# 為向量隨機(jī)生成性別、是否戴眼鏡、圖片抓取時(shí)間標(biāo)簽
sex = random.choice(['female','male'])
get_time = fake.past_datetime(start_date="-120d", tzinfo=None)
is_glasses = random.choice(['True','False'])
2、特征向量存儲(chǔ)
將一億數(shù)據(jù)導(dǎo)入 Milvus ,其返回的 ids 是向量對(duì)應(yīng)的唯一表示 ID ,將 ids 與向量的標(biāo)簽存入 Postgres ,當(dāng)然,原始特征向量也可以存入 Postgres (可選):
# 將一億原始數(shù)據(jù)導(dǎo)入 Milvus
status, ids = milvus.add_vectors(table_name=MILVUS_TABLE, records=vectors)
# 將 ids 與向量的標(biāo)簽存入 Postgres
sql = "INSERT INTO PG_TABLE_NAME VALUES(ids, sex, get_time, is_glasses);"
cur.execute(sql)
3、特征向量檢索
向 Milvus 中傳入需要搜索的向量。設(shè)定 TOP_K=10 以及 DISTANCE_THRESHOLD=1 (可根據(jù)需求修改), TOP_K 表示搜索與查詢(xún)向量相似度最高的前 10 個(gè)結(jié)果,DISTANCE_THRESHOLD表示查詢(xún)向量與搜索結(jié)果向量的距離閾值。
ANN_SIFT1B 中采用歐氏距離計(jì)算,參數(shù)設(shè)定后 Milvus 將返回查詢(xún)結(jié)果的 ids ,利用該 ids 到 Postgres 中進(jìn)行查詢(xún),最終混合查詢(xún)結(jié)果。
# 根據(jù) query_location 從 Query set 中提取需要搜索的向量
vector = load_query_list(QUERY_PATH,query_location)
# 向 Milvus 中傳入需要搜索的向量 vectors
status, results = milvus.search_vectors(table_name = MILVUS_TABLE,query_records=vector, top_k=top_k)
# 利用 Milvus 返回的 results.ids 到 Postgres 中進(jìn)行查詢(xún)
sql = "select * from PG_TABLE_NAME where ids = results.ids ;"
cur.execute(sql)
在對(duì)一億數(shù)據(jù)進(jìn)行混合查詢(xún)時(shí), Milvus 特征向量搜索僅需 70ms ,在 Postgres 中對(duì) Milvus 搜索結(jié)果的 ids 進(jìn)行查詢(xún)不超過(guò) 7ms 。
總的來(lái)說(shuō),利用 Milvus 特征向量數(shù)據(jù)庫(kù),可以快速實(shí)現(xiàn)向量與結(jié)構(gòu)化數(shù)據(jù)的混合查詢(xún)。若僅使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行向量查詢(xún),不僅大規(guī)模向量數(shù)據(jù)存儲(chǔ)難,而且無(wú)法高性能完成特征向量檢索。
Milvus 特征向量搜索時(shí)間 | Postgres 搜索ids時(shí)間 |
---|---|
70 ms | 1 ms ~ 7 ms |
這里實(shí)現(xiàn)了基于 Milvus 的混合查詢(xún)。在一億特征向量數(shù)據(jù)集的情況下,混合查詢(xún)時(shí)間不超過(guò) 77 ms 。
并且基于 Milvus 易管易用的特性,通過(guò)參考 Milvus 混合查詢(xún)方案[2] 所提供的工具,能輕松實(shí)現(xiàn)向量和結(jié)構(gòu)化數(shù)據(jù)的混合查詢(xún),更好的支持業(yè)務(wù)需求。
關(guān)于基于Milvus實(shí)現(xiàn)向量與結(jié)構(gòu)化數(shù)據(jù)混合查詢(xún)的示例分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。