一、前言
? ? 通過學(xué)習(xí)"開源模型應(yīng)用落地"系列文章,我們成功地建立了一個完整可實施的AI交付流程。現(xiàn)在,我們要引入向量數(shù)據(jù)庫,作為我們AI服務(wù)的二級緩存。本文將詳細(xì)介紹如何使用Milvus Lite來為我們的AI服務(wù)部署一個前置緩存。
二、術(shù)語
2.1、向量數(shù)據(jù)庫
? ? 向量數(shù)據(jù)庫是一種專門用于存儲和處理高維向量數(shù)據(jù)的數(shù)據(jù)庫系統(tǒng)。與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫或文檔數(shù)據(jù)庫不同,向量數(shù)據(jù)庫的設(shè)計目標(biāo)是高效地支持向量數(shù)據(jù)的索引和相似性搜索。
? ? 在傳統(tǒng)數(shù)據(jù)庫中,數(shù)據(jù)通常是以結(jié)構(gòu)化的表格形式存儲,每個記錄都有預(yù)定義的字段。但是,對于包含大量高維向量的數(shù)據(jù),如圖像、音頻、文本等,傳統(tǒng)的數(shù)據(jù)庫模型往往無法有效地處理。向量數(shù)據(jù)庫通過引入特定的數(shù)據(jù)結(jié)構(gòu)和索引算法,允許高效地存儲和查詢向量數(shù)據(jù)。
? ? 向量數(shù)據(jù)庫的核心概念是向量索引。它使用一種稱為向量空間模型的方法,將向量映射到多維空間中的點,并利用這種映射關(guān)系構(gòu)建索引結(jié)構(gòu)。這樣,當(dāng)需要搜索相似向量時,可以通過計算向量之間的距離或相似度來快速定位相似的向量。
2.2、向量數(shù)據(jù)庫的使用場景
? ? ?向量數(shù)據(jù)庫在許多領(lǐng)域中都有廣泛的應(yīng)用場景,特別是涉及到高維向量數(shù)據(jù)存儲和相似性搜索的任務(wù)。以下是一些常見的使用場景:
- 目標(biāo)識別和圖像搜索:向量數(shù)據(jù)庫可用于存儲圖像特征向量,以支持快速的相似圖像搜索和目標(biāo)識別。它在圖像搜索引擎、人臉識別和視頻監(jiān)控等領(lǐng)域具有重要作用。
- 推薦系統(tǒng):向量數(shù)據(jù)庫可以存儲用戶和物品的特征向量,用于個性化推薦。基于相似性搜索,可以找到與用戶興趣相似的物品,提供個性化的推薦結(jié)果。
- 自然語言處理:在文本處理任務(wù)中,可以使用向量數(shù)據(jù)庫存儲文本向量,如詞向量、句向量等。基于相似性搜索,可以進行文本匹配、語義相似度計算等操作。
- 數(shù)據(jù)聚類和分類:向量數(shù)據(jù)庫可用于高維向量數(shù)據(jù)的聚類和分類分析。它可以幫助發(fā)現(xiàn)數(shù)據(jù)集中的聚類模式和類別,用于數(shù)據(jù)挖掘和機器學(xué)習(xí)任務(wù)。
- 檢索與推薦系統(tǒng):在電子商務(wù)和商品搜索中,向量數(shù)據(jù)庫可以存儲商品特征向量,以支持相似商品的搜索和推薦。它可以提供更準(zhǔn)確和個性化的搜索結(jié)果。
- 醫(yī)療和生物信息學(xué):向量數(shù)據(jù)庫可用于存儲基因表達(dá)向量、蛋白質(zhì)特征向量等生物信息學(xué)數(shù)據(jù)。它可以在基因組學(xué)、藥物研發(fā)等領(lǐng)域中幫助進行數(shù)據(jù)分析和研究。
- 視頻內(nèi)容分析:向量數(shù)據(jù)庫可用于存儲視頻特征向量,如視頻幀特征、視頻片段特征等。它可以用于視頻內(nèi)容搜索、視頻剪輯和視頻推薦等應(yīng)用。
2.3、向量相似度檢索
? ? 相似度檢索是指將目標(biāo)對象與數(shù)據(jù)庫中數(shù)據(jù)進行比對,并召回最相似的結(jié)果。同理,向量相似度檢索返回的是最相似的向量數(shù)據(jù)。
2.4、向量相似度檢索算法
- 余弦相似度(Cosine Similarity):余弦相似度是一種常用的衡量向量相似性的方法。它通過計算兩個向量之間的夾角余弦值來度量它們的相似程度。余弦相似度范圍在[-1, 1]之間,值越接近1表示兩個向量越相似。
- 歐氏距離(Euclidean Distance):歐氏距離是計算向量之間距離的一種常見方法。它衡量了兩個向量之間的幾何距離,即兩個向量之間的直線距離。歐氏距離越小表示兩個向量越相似。
- 曼哈頓距離(Manhattan Distance):曼哈頓距離是計算向量之間距離的一種度量方式。它衡量了兩個向量之間的城市街區(qū)距離,即通過水平和垂直方向移動所需的步數(shù)之和。
- Jaccard相似度(Jaccard Similarity):Jaccard相似度通常用于計算集合之間的相似性,但也可以應(yīng)用于特征向量的相似性計算。它通過計算兩個向量的交集與并集之間的比值來度量它們的相似程度。
- 漢明距離(Hamming Distance):漢明距離通常用于計算兩個等長字符串之間的距離,但也可應(yīng)用于二進制向量的相似性計算。它衡量了兩個向量之間在相應(yīng)位置上不同位的數(shù)量。
- 最近鄰搜索算法(Nearest Neighbor Search):最近鄰搜索算法通過計算向量之間的相似度或距離,找到與目標(biāo)向量最相似的鄰居向量。常用的最近鄰搜索算法包括暴力搜索、KD樹、球樹、LSH(局部敏感哈希)等。
2.5、Milvus
? ? 是一個開源的向量數(shù)據(jù)庫引擎,專門用于存儲和處理大規(guī)模高維向量數(shù)據(jù)。它提供了高效的向量索引和相似性搜索功能,使用戶能夠快速地進行向量數(shù)據(jù)的存儲、查詢和分析。
? ? Milvus的設(shè)計目標(biāo)是為了滿足現(xiàn)代應(yīng)用中對大規(guī)模向量數(shù)據(jù)的需求,例如人臉識別、圖像搜索、推薦系統(tǒng)等。它采用了向量空間模型和多種索引算法,包括倒排索引、近似最近鄰(Approximate Nearest Neighbor,ANN)等,以支持高效的相似性搜索。
? ? Milvus提供了易于使用的編程接口和豐富的功能,使用戶可以方便地插入、查詢和分析向量數(shù)據(jù)。它支持多種數(shù)據(jù)類型的向量,包括浮點型、整型等,也支持多種距離度量方法,如歐氏距離、余弦相似度等。
? ? Milvus還提供了分布式部署和橫向擴展的能力,可以在多臺機器上構(gòu)建高可用性和高性能的向量數(shù)據(jù)庫集群。它支持?jǐn)?shù)據(jù)的分片和負(fù)載均衡,可以處理大規(guī)模數(shù)據(jù)集和高并發(fā)查詢。
2.6、Milvus Lite
? ? 是Milvus向量數(shù)據(jù)庫的一個輕量級版本。旨在提供在資源受限的環(huán)境中快速、高效地進行向量存儲和相似性搜索的能力。
? ? 與完整版的Milvus相比,它具有以下特點:
- 輕量級:Milvus Lite具有較小的存儲占用和內(nèi)存消耗,適合在資源受限的設(shè)備上部署和運行。
- 快速部署:Milvus Lite提供了簡化的部署和配置過程,使其更易于在嵌入式設(shè)備和邊緣服務(wù)器上進行部署和集成。
- 高效的向量索引和搜索:盡管是輕量級版本,Milvus Lite仍然提供了高效的向量索引和相似性搜索功能,以支持快速的向量數(shù)據(jù)查詢。
- 離線模式:Milvus Lite支持在離線模式下進行向量索引和搜索,無需實時連接到遠(yuǎn)程服務(wù)器。
2.7、Attu
? ? 是Milvus 的高效開源管理工具。 它具有直觀的圖形用戶界面(GUI),使您可以輕松地與數(shù)據(jù)庫進行交互。
2.8、歸一化
? ? 是一種數(shù)據(jù)處理技術(shù),用于將不同尺度或范圍的數(shù)據(jù)轉(zhuǎn)換為統(tǒng)一的標(biāo)準(zhǔn)范圍,通常是0到1之間或者是-1到1之間。它是數(shù)據(jù)預(yù)處理的常見步驟之一,旨在消除不同特征之間的尺度差異,以便更好地比較和分析數(shù)據(jù)。
2.9、標(biāo)準(zhǔn)化
? ? 是一種數(shù)據(jù)處理技術(shù),用于將數(shù)據(jù)轉(zhuǎn)換為具有零均值和單位方差的標(biāo)準(zhǔn)分布。它是數(shù)據(jù)預(yù)處理的一種常見方法,旨在消除不同特征之間的尺度差異,使得數(shù)據(jù)更適合進行比較和分析。
三、使用方式
3.1、架構(gòu)示意圖
這里的Milvus Lite部署在內(nèi)網(wǎng),位于業(yè)務(wù)服務(wù)和AI服務(wù)的中間,作為AI服務(wù)的二級緩存(一級緩存為Redis),為AI服務(wù)減緩負(fù)載壓力。
3.2、安裝Milvus Lite
? ? ?1. 創(chuàng)建虛擬環(huán)境
? ? ? ? ?conda create --name milvus python=3.10
? ? ?2. 激活虛擬環(huán)境
? ? ? ??conda activate milvus
? ? ?3.? 安裝milvus包
? ? ? ??pip install milvus
3.3、編寫Milvus Lite服務(wù)端代碼
? ?此處將Milvus Lite作為 Python 模塊啟動
from milvus import default_server
def start_server():
default_server.start()
def stop_server():
default_server.stop()
if __name__ == '__main__':
with default_server:
start_server()
input("按下任意鍵繼續(xù)...")
3.4、啟動Milvus Lite服務(wù)
? ? python -u 上述代碼的文件名
? ??
? ? 啟動完成后,會監(jiān)聽19530端口
3.5、安裝Milvus客戶端管理工具
? ? 下載地址:Releases · zilliztech/attu · GitHub
3.6、登錄Milvus Lite服務(wù)端
? ? 注意根據(jù)實際情況調(diào)整IP和端口,默認(rèn)端口為19530
登錄進去,就能看到如下信息:
? ??
四、業(yè)務(wù)整合
業(yè)務(wù)數(shù)據(jù)需要提前初始化到向量數(shù)據(jù)庫中
4.1、連接milvus服務(wù)端
# 1. 連接向量數(shù)據(jù)庫 Milvus
def connect_db(host):
logging.info("start connecting to Milvus")
# Milvus Lite has already started, use default_server here.
connections.connect(host=host, port=19530,user='root',password='123456',)
logging.info("connected to Milvus")
4.2、創(chuàng)建集合
dim = 256
alias = 'default'
nlist = 65536
# 2. 創(chuàng)建數(shù)據(jù)集合 collection
def create_collection(collection_name):
isExist = has_collection(collection_name=collection_name, using=alias)
if isExist:
print(f'集合{collection_name}已經(jīng)存在')
return
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="keyword", dtype=DataType.FLOAT_VECTOR, dim=dim),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=4096)
]
schema = CollectionSchema(fields, "the collection of tb_test")
logging.info(f"Create collection {collection_name}")
tb_test = Collection(collection_name, schema, consistency_level="Strong")
return tb_test
PS:keyword的向量維度是256,高維向量可以提供更豐富的信息表示能力,能夠捕捉更多的特征和關(guān)系,從而提高模型的表達(dá)能力。
創(chuàng)建成功后:
4.3、插入數(shù)據(jù)
# 3. 插入數(shù)據(jù)實體 entities
def insert_data(collection_name,narray,content,isNormalize = True):
res = None
try:
# 獲得已存在集合對象
collection = Collection(name=collection_name, using=alias)
logging.info("Start inserting entities")
if isNormalize == True:
# 標(biāo)準(zhǔn)化處理
normalize_narray = pretreatment(narray)
print(normalize_narray)
# 補齊向量長度
padded_vector = narray_pad(normalize_narray, dim)
print(padded_vector)
else:
# 補齊向量長度
padded_vector = narray_pad(narray, dim)
# 打印補齊后的向量
logging.info(padded_vector.shape)
entities = [
padded_vector, # title
[content], # content
]
res = collection.insert(entities)
collection.flush()
finally:
return res
# 插入數(shù)據(jù)
narray = np.array([100220.0,102247.0,31905.0,40814.0,101009.0, 87335.0,8863.0,20.0,15.0,15.0,104745.0,100354.0,43815.0,103010.0,102233.0,100351.0,102482.0])
content = "標(biāo)題:青春之光青春是一首歌,悠揚而激昂;青春是一幅畫,斑斕而生動;青春是一部電影,感人至深。而在我心中,青春更是那個在奧運賽場上奔跑的劉翔。記得那是2004年的雅典奧運會,劉翔以12.91秒的成績打破了世界紀(jì)錄,成為中國田徑歷史上第一位獲得奧運金牌的運動員。那一刻,我被他的堅韌和毅力深深打動,也深深地感受到了青春的力量。劉翔的青春,充滿了挑戰(zhàn)和奮斗。他曾經(jīng)因為傷病困擾,一度想要放棄,但他沒有。他知道,只有堅持下去,才能實現(xiàn)自己的夢想。于是,他在痛苦中掙扎,用汗水和淚水澆灌著自己的青春。終于,他成功了,他站在了奧運的最高領(lǐng)獎臺上,成為了全中國的驕傲。劉翔的青春,充滿了激情和活力。他是中國田徑的一顆璀璨明星,他的每一次起跑都充滿力量,他的每一次跨欄都充滿速度。他的青春,就像一道閃電,照亮了整個賽場,也照亮了我們的心靈。劉翔的青春,充滿了希望和夢想。他的夢想是成為最好的自己,他的希望是為中國贏得更多的榮譽。他的青春,就像一盞明燈,指引著他前進的方向,也激勵著我們?nèi)プ非笞约旱膲粝?。青春,就是要有夢想,有希望,有勇氣去追逐。劉翔的青春,就是這樣,充滿了夢想、希望和勇氣。他的青春,是我們所有人的青春,是我們所有人追求夢想的動力。青春,是一場無悔的旅程,無論前方有多少困難和挫折,只要我們有夢想,有希望,有勇氣,就一定能夠到達(dá)我們的目的地。讓我們一起,像劉翔一樣,用自己的青春,去創(chuàng)造屬于我們自己的輝煌!"
# 調(diào)用方法
insert_data(collection_name,narray,content,True)
插入成功后:
PS:受限于本篇內(nèi)容較長,如何獲取文本向量以及如何進行標(biāo)準(zhǔn)化或歸一化處理,將在另外的文章中說明。
4.4、創(chuàng)建索引
# 4. 創(chuàng)建索引 index
def create_index(collection_name,index_column,index_name):
try:
collection = Collection(name=collection_name, using=alias)
# 給向量字段構(gòu)建索引,并指定索引類型,以及相似度度量方式
# nlist 表示簇的個數(shù),該參數(shù)可以將向量劃分成多個區(qū)域,有利于加快搜索
index_params = {
"metric_type": "IP",
"index_type": "IVF_FLAT",
"params": {"nlist": nlist}
}
collection.create_index(field_name=index_column, index_name=index_name, index_params=index_params)
finally:
if collection:
collection.release()
# 創(chuàng)建索引 index
collection_name = "tb_test"
index_column='keyword'
index_name='idx_keyword'
# 調(diào)用
create_index(collection_name, index_column, index_name)
創(chuàng)建成功后:
4.5、加載數(shù)據(jù)至緩存
def load_in_memory(collection_name):
collection = Collection(name=collection_name, using=alias)
# 將整個 collection 加載到內(nèi)存中,也可以只加載某個 Partition
collection.load()
return collection
# 加載集合到緩存
collection_name = "tb_test"
# 調(diào)用
load_in_memory(collection_name)
五、附帶說明
5.1、目前市面上成熟的向量數(shù)據(jù)庫產(chǎn)品有很多,結(jié)合實際效果,這里選擇Milvus作為項目解決方案。
5.2、其他Milvus Lite啟動方式
? ? #?通過 CLI 來啟動 Milvus Lite,執(zhí)行命令:milvus-server
? ? # 通過 CLI 以調(diào)試模式來啟動 Milvus Lite,執(zhí)行命令:milvus-server??--debug
5.3、milvus_cli管理工具
? ? # 安裝
? ? ??pip install milvus-cli
? ?# 登錄
? ? ?milvus_cli
? ?# 連接數(shù)據(jù)庫
? ? ?connect -uri http://127.0.0.1:19530
5.4、milvus_cli常用命令
創(chuàng)建數(shù)據(jù)庫
create database -db test
使用數(shù)據(jù)庫
use database -db test
查看數(shù)據(jù)庫
list databases
刪除數(shù)據(jù)庫
delete database -db test
創(chuàng)建collection
create collection -c car -f id:INT64:primary_field
-f vector:FLOAT_VECTOR:128
-f color:INT64:color
-f brand:INT64:brand
-p id -a
-level Strong
Options:
-c, --collection-name TEXT Collection name to specify alias.
-p, --schema-primary-field TEXT Primary field name.
-a, --schema-auto-id [Optional, Flag] - Enable auto id.
-desc, --schema-description TEXT [Optional] - Description details.
-d, --is-dynamic TEXT [Optional] - Collection schema supportsdynamic fields or not.
-level, --consistency-level TEXT [Optional] - Consistency level:Bounded,Session,Strong, Eventual .
-f, --schema-field TEXT [Multiple] - FieldSchema. Usage is "<Name>:<DataType>:<Dim(if vector) or Description>"
-s, --shards-num INTEGER [Optional] - Shards number
查看collection
list collections
刪除collection
delete collection -c tb_test
創(chuàng)建index
create index
Collection name (tb_test): tb_test
The name of the field to create an index for (vector): vector
Index name: vectorIndex
Default is ''
Index type (FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, ) []: IVF_FLAT
Default is ''
Index metric type (L2, IP, HAMMING, TANIMOTO,): L2
Index params nlist: 2
查看index
list indexes -c tb_test
查看partitions
list partitions -c tb_test
刪除partitions
delete partition -c tb_test -p new_partition
刪除entities
delete entities -c tb_test
加載
load collection -c tb_test
Options:
-c, --collection TEXT The name of collection to load.
-p, --partition TEXT [Optional, Multiple] - The name of partition to load.
--help Show this message and exit.
釋放
release collection -c tb_test
Options:
-c, --collection TEXT The name of collection to load.
-p, --partition TEXT [Optional, Multiple] - The name of partition to load.
--help
show
show collection -c tb_test
show index -c tb_test
show index_progress -c tb_test
show loading_progress -c tb_test
show partition -c tb_test
創(chuàng)建別名
create alias -c tb_test -A -a tb_test11
Options:
-c, --collection-name TEXT Collection name to be specified alias.
-a, --alias-name TEXT The alias of the collection.
-A, --alter [Optional, Flag] - Change an existing alias to
current collection.
創(chuàng)建用戶
create user -u root -p 123456
-u, --username TEXT The username of milvus user.
-p, --password TEXT The password of milvus user.
查看用戶
list users
查看版本
version
5.5、高維向量表示的優(yōu)劣
優(yōu)勢:文章來源:http://www.zghlxwxcb.cn/news/detail-826639.html
- 表示能力增強:高維向量可以提供更豐富的信息表示能力,能夠捕捉更多的特征和關(guān)系,從而提高模型的表達(dá)能力。
- 解決冗余信息:在高維空間中,冗余特征可能會被稀疏化,使得模型更容易識別和利用有效的特征。
- 處理復(fù)雜問題:某些復(fù)雜問題可能需要更高維度的向量來表示,以便更好地捕捉問題的復(fù)雜性和多樣性。
劣勢文章來源地址http://www.zghlxwxcb.cn/news/detail-826639.html
- 維度災(zāi)難:高維度數(shù)據(jù)可能導(dǎo)致維度災(zāi)難問題,即數(shù)據(jù)稀疏性增加,對于有限的訓(xùn)練數(shù)據(jù)而言,模型的泛化能力可能會受到影響。
- 計算復(fù)雜性增加:高維度數(shù)據(jù)需要更多的計算資源和時間來處理和分析,可能會增加計算的復(fù)雜性和開銷。
- 數(shù)據(jù)稀疏性:在高維空間中,數(shù)據(jù)點之間的距離變得更遠(yuǎn),可能會導(dǎo)致數(shù)據(jù)稀疏性增加,從而影響模型的準(zhǔn)確性和可靠性。
到了這里,關(guān)于開源模型應(yīng)用落地-工具使用篇-向量數(shù)據(jù)庫(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!