利用 Azure DocumentDB 內建的向量資料庫,無縫連接基於 AI 的應用程式與 Azure DocumentDB 中儲存的資料。 這項整合可以包括您使用 Azure OpenAI 內嵌所建置的應用程式。 原生整合的向量資料庫能有效儲存、索引及查詢直接儲存在 Azure DocumentDB 中的高維向量資料,以及產生向量資料的原始資料。 它消除了將您的資料傳輸到替代向量儲存並產生額外費用的需要。
什麼是向量存放區?
向量儲存或向量資料庫是設計用於儲存和管理向量嵌入的資料庫,向量嵌入是高維空間中資料的數學表示。 在此空間中,每個維度各對應至資料的一個特徵,且有數萬個維度可用來代表複雜的資料。 向量在此空間中的位置代表其特性。 單字、片語或整份文件、影像、音訊和其他類型的資料,全都可以向量化。
向量存放區如何運作?
在向量儲存庫中,向量搜尋演算法被用來對嵌入向量進行索引和查詢。 一些著名的向量搜尋演算法包括分層可導航小世界 (HNSW)、倒置檔案 (IVF) 和 DiskANN。 向量搜尋是一種幫助您根據資料特性而非屬性欄位的完全匹配來尋找相似項目的方法。 此技術適用於搜尋類似文字、尋找相關影像、提出建議,甚至偵測異常這類應用程式。 其運作方式是利用內嵌 API 的機器學習模型,查詢您所建立的資料向量內嵌 (數字清單)。 內嵌 API 的範例包括 Azure OpenAI 內嵌 或 Azure 上的 Hugging Face。 向量搜尋會測量資料向量與查詢向量之間的距離。 最接近查詢向量的資料向量就是所找到語意最類似的資料向量。
在 Azure DocumentDB 整合的向量資料庫中,你可以將向量嵌入與原有資料一同儲存、索引並查詢。 此方法可讓您在複寫個別純向量資料庫中的資料時,無需支付額外的成本。 此外,此架構將向量嵌入與原始資料保持在一起,更有助於多模態資料操作,並提升資料一致性、規模與效能。
向量資料庫使用案例
向量資料庫被廣泛應用於人工智慧與資料分析的多個領域。 他們協助處理理解自然語言、辨識圖片與影片、建立推薦系統,以及驅動搜尋功能等任務。 你可以在分析型 AI 和生成式 AI 應用中找到它們。
例如,您可以使用向量資料庫:
- 根據內容、主題、情緒和樣式,識別類似的影像、文件和歌曲。
- 根據特性、特徵和使用者群組,識別類似的產品。
- 根據個人喜好推薦內容、產品或服務。
- 根據使用者群體的相似性推薦內容、產品或服務。
- 從大量選擇中找出最適合的潛在選項,以滿足複雜的要求。
- 識別與主要或正常模式不同的資料異常或詐騙活動。
- 為 AI 代理實作持久記憶體。
- 啟用檢索增強生成(RAG)。
整合向量資料庫與純向量資料庫
向量資料庫有兩種常見的實作類型:純向量資料庫與整合於 NoSQL 或關聯式資料庫中的向量資料庫。
純向量資料庫能有效儲存和管理向量嵌入及少量元資料。 它與嵌入來源資料是分開的。
整合於高效能 NoSQL 或關聯式資料庫中的向量資料庫,提供額外功能。 NoSQL 或關聯式資料庫中的整合式向量資料庫可以儲存、編製索引和查詢內嵌,以及對應的原始資料。 此方法可讓您在複寫個別純向量資料庫中的資料時,無需支付額外的成本。 此外,將向量嵌入與原始資料保持在一起,更有助於多模態資料操作,並提升資料一致性、規模與效能。
開放原始碼向量資料庫
當開發人員選取向量資料庫時,開放原始碼選項可提供許多優點。 開源 意味著軟體的原始碼是免費提供的,使用戶能夠根據自己的特定需求自訂資料庫。 這種靈活性對於受資料獨特監管要求約束的組織(例如金融服務業的公司)來說是有益的。
開放原始碼向量資料庫的另一個優點是其享有的強大社群支援。 作用中的使用者社群經常會為這些資料庫的開發做出貢獻、提供支援並分享最佳做法,從而促進創新。
有些人選擇開源向量資料庫,因為它們是「免費」的,也就是說取得或使用軟體都沒有費用。 另一種選擇是使用受控向量資料庫服務所提供的免費層級。 這些受控服務不僅可在特定的使用量限額內提供免費的存取,還能透過處理維護、更新與可擴縮性來簡化作業的負擔。 因此,透過使用免費的管理向量資料庫服務方案,您可以同時節省成本並降低管理負擔。 這種方式讓你能更專注於核心活動,而非資料庫管理。
選擇最佳開源向量資料庫
選擇最佳的開放原始碼向量資料庫需要考慮幾個因素。 資料庫的效能和可擴展性至關重要,因為它們會影響資料庫是否能夠處理您的特定工作負載需求。 具有有效的索引編製和查詢功能的資料庫通常會提供最佳的效能。 另一個因素是資料庫的社群支援和可用的文件。 強大的社群和豐富的文件可以提供寶貴的協助。 例如, DocumentDB 是一個受歡迎的開源向量資料庫:
最受歡迎的選項可能不是最適合你的選擇。 因此,您應該根據功能、支援的資料類型以及與您使用的現有工具和框架的兼容性來比較不同的選項。 您還應該記住開源向量資料庫的挑戰。
開放原始碼向量資料庫的挑戰
大多數開放原始碼向量資料庫,包括前面列出的資料庫,都是純向量資料庫。 換句話說,它們旨在僅儲存和管理向量內嵌以及少量中繼資料。 因為它們和原始資料是分開運作的,你需要在不同服務間移動資料。 這種複雜性增加了額外成本,使事情更複雜,也可能拖慢生產系統的速度。
它們也會帶來開放原始碼資料庫的一般挑戰:
- 設定:安裝、配置及操作資料庫需要深入的知識,尤其是複雜部署時。 在擴大作業時最佳化資源和組態需要密切的監視和調整。
- 維護:您必須自行管理更新、修補程式與維護。 光有機器學習專業知識是不夠的;你也必須具備豐富的資料庫管理經驗。
- 支援:與受控服務相比,官方支援可能有限,更依賴社群協助。
因此,雖然開放原始碼向量資料庫最初是免費的,但在擴大時會產生大量的成本。 擴大作業需要更多的硬體、熟練的 IT 人員和進階的基礎結構管理,從而導致硬體、人員和作業成本的費用增加。 儘管缺乏授權費用,但擴充開放原始碼向量資料庫仍可能帶來可觀的財務成本。
應對開放原始碼向量資料庫的挑戰
一個完全管理的向量資料庫,能整合進高效能的 NoSQL 或關聯式資料庫,避免了開源向量資料庫所帶來的額外成本與複雜性。 此類資料庫會將內嵌與相對應的原始資料一併儲存、建立索引並進行查詢。 此方法可讓您在複寫個別純向量資料庫中的資料時,無需支付額外的成本。 此外,將向量嵌入與原始資料保持一致,有助於多模態資料操作,並提升資料一致性、規模與效能。 同時,完全受控服務可協助開發人員避免設定、維護及依賴開放原始碼向量資料庫社群協助的麻煩。 此外,部分管理向量資料庫服務提供終身免費方案。
例如Azure DocumentDB中的整合向量資料庫。 這種架構讓開發者能像使用開源向量資料庫一樣省錢。 但與開源選項不同的是,服務提供者會幫你處理維護、更新和擴展。 升級快速且簡單,且在需要擴大營運時保持低總擁有成本(TCO)。 你也可以利用這項服務,方便地擴展已經在生產環境中的 MongoDB 應用程式。
執行向量相似性搜尋
Azure DocumentDB 提供強大的向量搜尋功能,讓您能在複雜資料集間進行高速相似性搜尋。 要在 Azure DocumentDB 中進行向量搜尋,首先需要建立向量索引。 雖然 Azure DocumentDB 提供多種選項,以下是根據資料集大小,幫助你開始的一般指引:
| IVF | HNSW | DiskANN (建議) | |
|---|---|---|---|
| 說明 | IVFFlat 索引會將向量分割成清單,然後搜尋最接近查詢向量的子集。 | HNSW 索引會建立多層圖形。 | DiskANN 是一種近似的鄰近搜尋演算法,專為任何規模的有效向量搜尋而設計。 |
| 關鍵權衡 |
優點: 更快的建置時間,降低記憶體使用量。 缺點: 較低的查詢效能(在速度與召回率之間的取捨方面)。 |
優點: 可以在空資料表上建立更好的查詢效能(在速度與召回率之間的取捨方面)。 缺點: 建置時間變慢,記憶體使用量較高。 |
優點: 在任何規模上有效率、高召回率、高輸送量、低延遲。 |
| 向量計數 | 低於 10,000 | 最高 50,000 | 至多 500,000+ |
| 建議的叢集層 | M10 或 M20 | M30 和更新版本 | M30 和更新版本 |
你可以在 M30 及以上等級使用 DiskANN 索引。 若要建立 DiskANN 索引,請將參數設定 "kind" 為 "vector-diskann" 遵循此範本:
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": <integer_value>,
"similarity": <string_value>,
"maxDegree" : <integer_value>,
"lBuild" : <integer_value>,
}
}
]
}
| 領域 | 類型 | Description |
|---|---|---|
index_name |
字串 | 索引的唯一名稱。 |
path_to_property |
字串 | 包含向量的屬性的路徑。 此路徑可以是最上層屬性或屬性的點標記法路徑。 向量必須是要編制索引並用於向量搜尋結果的 number[]。 使用其他類型(如 double[])的向量會阻止文件被索引。 非索引文件不會在向量搜尋的結果中傳回。 |
kind |
字串 | 要建立的向量索引類型。 選項為 vector-ivf、vector-hnsw 和 vector-diskann。 |
dimensions |
整數 | 向量相似度的維度數目。 DiskANN 支援最多 16,000 個維度(使用 乘積量化),未來計劃支援超過 40,000 個維度。 |
similarity |
字串 | 與索引搭配使用的相似度計量。 可能的選項是 COS (餘弦距離)、L2 (歐幾里得距離) 和 IP (內積)。 |
maxDegree |
整數 | 圖形中每個節點的邊緣數目上限。 此參數的範圍從 20 到 2048 (預設值為 32)。 較高 maxDegree 適用於具有高維度和/或高正確性需求的資料集。 |
lBuild |
整數 | 設定 DiskANN 索引建構期間評估的候選鄰近項目數目。 此參數的範圍從 10 到 500 (預設值為 50),可平衡正確性和計算額外負荷:較高的值可改善索引品質和正確性,但會增加建置時間 |
使用 DiskANN 執行向量搜尋
若要執行向量搜尋,請使用 $search 彙總管線階段,並使用 cosmosSearch 運算子進行查詢。 DiskANN 支援跨龐大資料集的高效能搜尋,並可 選 地利用地理空間或文字篩選等篩選功能。
{
"$search": {
"cosmosSearch": {
"path": "<path_to_property>",
"query": "<query_vector>",
"k": <num_results_to_return>,
"filter": {"$and": [
{ "<attribute_1>": { "$eq": <value> } },
{"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
]}
}
}
},
| 領域 | 類型 | Description |
|---|---|---|
lSearch |
整數 | 指定搜尋的動態候選清單大小。 預設值為 40,可設定範圍為 10 到 1000。 增加值可增強召回率,但可能會降低搜尋速度。 |
k |
整數 | 定義要傳回的搜尋結果數目。
k 值必須少於或等於 lSearch。 |
使用具有篩選功能的 DiskANN 索引範例
將向量新增至資料庫
若要搭配地理空間篩選使用向量搜尋,請新增包含向量內嵌和位置座標的文件。 您可以使用自己的模型、Azure OpenAI 內嵌或 Azure 上的 Hugging Face 等 API 來建立內嵌。
from pymongo import MongoClient
client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]
documents = [
{"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
{"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
{"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
{"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]
collection.insert_many(documents)
建立 DiskANN 向量索引
下列範例示範如何使用篩選功能來設定 DiskANN 向量索引。 此範例包括建立相似度搜尋的向量索引、新增具有向量與地理空間屬性的文件,以及索引欄位以進行更多篩選。
db.command({
"createIndexes": "testCollection",
"indexes": [
{
"name": "DiskANNVectorIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": 3,
"similarity": "COS",
"maxDegree": 32,
"lBuild": 64
}
},
{
"name": "is_open",
"key": {
"is_open": 1
}
},
{
"name": "locationIndex",
"key": {
"location": 1
}
}
]
})
此命令會在 contentVector 中的 exampleCollection 欄位上建立 DiskANN 向量索引,以啟用相似性搜尋。 其也會新增:
- 欄位上的索引
is_open,讓你可以根據企業是否營業來篩選結果。 - 依地理近接篩選之
location欄位上的地理空間索引。
執行向量搜尋
若要在特定地理半徑內尋找具有類似向量的文件,請指定相似性搜尋的 queryVector,並包含地理空間篩選。
query_vector = [0.52, 0.28, 0.12]
pipeline = [
{
"$search": {
"cosmosSearch": {
"path": "contentVector",
"vector": query_vector,
"k": 5,
"filter": {
"$and": [
{"is_open": {"$eq": 1}},
{"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
]
}
}
}
}
]
results = list(collection.aggregate(pipeline))
for result in results:
print(result)
在此範例中,向量相似性搜尋會根據指定的 k 相似性計量傳回最接近的 COS 向量,同時篩選結果以僅包含 100 英哩半徑內的營運中企業。
[
{
similarityScore: 0.9745354109084544,
document: {
_id: ObjectId("645acb54413be5502badff94"),
name: 'Eugenia Lopez',
bio: 'CEO of AdventureWorks',
is_open: 1,
location: [-118.9865, 34.0145],
contentVector: [0.52, 0.20, 0.23]
}
},
{
similarityScore: 0.9006955671333992,
document: {
_id: ObjectId("645acb54413be5502badff97"),
name: 'Rory Nguyen',
bio: 'President of Our Planet initiative',
is_open: 1,
location: [-119.7302, 34.4005],
contentVector: [0.91, 0.76, 0.83]
}
}
]
此結果顯示與 queryVector 最相似的文件;範圍限制在 100 英里內且為營業中的商家。 每個結果都包含相似度分數與元資料,展示 Azure DocumentDB 中的 DiskANN 如何支援結合向量與地理空間查詢,以提供豐富且位置敏感的搜尋體驗。
取得向量索引定義
若要從集合中擷取向量索引定義,請使用 listIndexes 命令:
db.exampleCollection.getIndexes();
在此範例中,會傳回 vectorIndex,其中包含已用來建立索引的所有 cosmosSearch 參數:
[
{ v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
{
v: 2,
key: { vectorContent: 'cosmosSearch' },
name: 'vectorSearchIndex',
cosmosSearch: {
kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
numLists: 3,
similarity: 'COS',
dimensions: 3
},
ns: 'test.exampleCollection'
}
]
篩選的向量搜尋
現在您可以使用任何支援的查詢篩選條件 (例如 $lt, $lte, $eq, $neq, $gte, $gt, $in, $nin 及 $regex)執行向量搜尋。
要使用預篩選,你首先需要在你想篩選的屬性上定義一個標準索引,除了你的向量索引之外。 以下是建立篩選索引的範例:
db.runCommand({
"createIndexes": "<collection_name>",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
一旦你的篩選索引就位,你可以直接把這個 "filter" 子句加入你的向量搜尋查詢中。 以下範例展示了如何篩選屬性"title"的值不在提供的清單中的結果:
db.exampleCollection.aggregate([
{
'$search': {
"cosmosSearch": {
"vector": "<query_vector>",
"path": <path_to_vector>,
"k": num_results,
"filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
},
"returnStoredSource": True }},
{'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);
這很重要
若要最佳化預先篩選向量搜尋的效能和準確性,請考慮調整向量索引參數。 針對 DiskANN 索引,增加 maxDegree 或 lBuild 可能會產生更好的結果。 針對 HNSW 索引,嘗試增加 m、efConstruction 或 efSearch 的值可以改善效能。 同樣地,對於 IVF 索引,微調 numLists 或 nProbes 可能會導致更令人滿意的結果。 使用資料測試您的特定配置以確保結果符合您的要求至關重要。 這些參數會影響索引結構和搜尋行為,而最佳值可能會根據您的數據特性和查詢模式而有所不同。
使用大型語言模型(LLM)協調工具
搭配使用向量資料庫與語意核心
使用 Semantic Kernel 來協調從 Azure DocumentDB 和你的大型語言模型(LLM)中取得的資訊。 更多資訊請參閱 GitHub 倉庫。
搭配使用向量資料庫與 LangChain
使用 LangChain 來協調 Azure DocumentDB 和你的大型語言模型(LLM)之間的資訊檢索流程。 欲了解更多資訊,請參閱 Azure DocumentDB 的 LangChain 整合。
使用作為語意快取與 LangChain
使用 LangChain 和 Azure DocumentDB 來協調語意快取,利用先前錄製的大型語言模型回應,這能幫你節省 LLM API 成本並降低回應延遲。 欲了解更多資訊,請參閱 LangChain 與 Azure DocumentDB 的整合。
功能和限制
- 支援的距離計量:L2 (歐幾里得)、內積和餘弦。
- 支援的索引編製方法:IVFFLAT、HNSW 和 DiskANN。
- 透過 DiskANN 和 乘積量化,您可以索引多達 16,000 個維度的向量。
- 使用 半精度 的 HNSW 或 IVF 可以對高達 4,000 個維度的向量進行索引。
- 沒有任何壓縮,索引的預設最大向量維度為 2,000。
- 索引作業只適用於每一路徑中的一個向量。
- 你只能在向量路徑上建立一個索引。
總結
本指南說明如何建立向量索引、新增含有向量資料的文件、執行相似性搜尋,以及取得索引定義。 透過我們整合的向量資料庫,您可以高效地在 Azure DocumentDB 中儲存、索引及查詢高維向量資料。 它可讓您透過向量內嵌來解除鎖定資料的完整潛力,並讓您能夠建置更精確、具效率且功能強大的應用程式。
相關內容
- .NET RAG 模式零售參考解決方案
- C# RAG 模式 - 整合 OpenAI 服務與 Cosmos
- Python RAG 模式 - Azure 產品聊天機器人
- Python 筆記本教學課程 - 透過 LangChain 進行向量資料庫整合
- Python 筆記本教學課程 - 透過 LangChain 進行 LLM 快取整合
- Python 與 LlamaIndex 的整合
- Python - 語意核心記憶體整合