前言
以前我曾疑惑,對于非結構化的內容,如一張圖片或一段視頻,如何實現搜索呢?圖片或視頻作為二進制文件,我們如何將其轉化為可搜索的數據并存儲起來,然后在搜索時將其還原呢?
后來我發現,實際上我們可以將非結構化的內容轉化為結構化的內容,然后進行存儲。這樣,我們就可以對其進行搜索了。如何實現這一轉化呢?向量化是非結構化內容轉化為結構化內容的關鍵。
向量在數學和物理中表示大小和方向。它由一組有序的數值組成,比如[0.2123, 0.23, 0.213]
。這些數值代表了向量在每個坐標軸上的分量。在AI中,向量可以用來表示任何事物,如圖像、視頻、音頻、文本等。向量是數據科學中最重要的概念之一,它幫助我們將非結構化數據轉換為結構化數據,以便進行分析和處理。
我們可以使用多維度向量來表述某個對象或事物的屬性或特征,然后再借助一些向量檢索的方法,如內積(IP),歐式距離(L2)或者余弦相似度(COSINE)算法來進行搜索。常用的圖片搜索、短視頻搜索以及推薦系統都是基于向量進行的。那么這些向量是如何存儲的呢?存儲向量的數據庫與傳統的數據庫有什么區別呢?今天我要給大家介紹的是一款存儲向量的數據庫——騰訊云向量數據庫(Tencent Cloud VectorDB)。
向量數據庫
向量數據庫是一種專門用于存儲和檢索高維向量的數據庫,適用于處理圖像、視頻、音頻、文本等非結構化數據。隨著非結構化數據搜索需求的不斷增長,向量數據庫在近年來得到了廣泛應用。騰訊云向量數據庫(Tencent Cloud VectorDB)是一種全托管的自研企業級分布式數據庫服務,專為存儲、檢索、分析多維向量數據而設計。
與傳統數據庫不同,向量數據庫借助向量檢索技術,通過計算向量間的相似度來進行數據檢索。這種檢索方式在處理非結構化數據時具有顯著的優勢,可以更加準確地匹配用戶的查詢需求。騰訊云向量數據庫(Tencent Cloud VectorDB)采用了先進的向量檢索技術,并針對多維向量數據進行了優化,以提供高效、準確的檢索服務。下面讓我們詳細了解一下它的組成和特征。
邏輯層級
要了解Tencent Cloud VectorDB,就要先了解它的邏輯層級,邏輯層級代表了它存儲數據的結構,它具有三個邏輯層級,分別是Database、Collection、Document。一個數據庫實例可以存在多個database,這一點與傳統的數據庫一致,一個database可以存在多個collection, 這里的collection你可以簡單理解為mysql中的中一張表,由于向量數據庫不屬于SQL數據庫,在創建表時,自然也與傳統SQL數據庫不一樣,下面會講解如何創建collection。 一個collection可以存在多個document,document就類似是一張表的多條記錄,行。
下面的圖片解釋了Tencent Cloud VectorDB的邏輯層級。
索引
邏輯層級代表了數據的層級結構,而向量索引則是用于快速搜索的基礎。
Tencent Cloud VectorDB目前支持多種索引類型,分別是用于快速查找特定行的主鍵索引Primary Key Index,和用于快速查找相似向量的向量索引Vector Index(向量索引又分為FLAT,HNSW,IVF 系列,詳情描述可以查閱官方文檔),以及建立在標量字段的Filter索引 Filter Index。
基于向量的相似度算法
邏輯層級是數據的存儲層級,而索引是為了加快數據的搜索,那么對于向量的搜索Tencent Cloud VectorDB又支持那些算法那?
目前支持了比較主流的三種算法分別是內積(IP),歐式距離(L2),余弦相似度(COSINE)
(注意:在創建 Collection 時,就需指定向量的索引類型(如 HNSW 等)與 相似度計算方法,而不是搜索時。)
內積(IP):
全稱為 Inner Product,內積也稱點積,計算結果是一個數。它計算兩個向量之間的點積(內積),其計算公式如下所示:
歐式距離(L2):
歐式距離(L2)全稱為 Euclidean distance,指歐幾里得距離。它計算兩個向量點在空間中的直線距離。其計算公式如下所示:
余弦相似度(COSINE):
余弦相似度(Cosine Similarity)算法,是一種常用的文本相似度計算方法。它通過計算兩個向量在多維空間中的夾角余弦值來衡量它們的相似程度。其計算公式如下所示:
需要注意的是 向量索引與相似算法是 影響搜索結果的準確性的兩大因素,我們在Collection時要根據具體的數據和業務選擇合適的索引和算法。
騰訊云向量數據庫的申請,實例管理
通過上面的概念介紹和名稱解釋,你是不是已經迫不及待地想要體驗一下Tencent Cloud VectorDB。那么下面就跟著我一起來體驗一下Tencent Cloud VectorDB的功能吧。
申請使用
你可以官方的內測申請,來申請使用Tencent Cloud VectorDB。試用期間費用都是免費的,包括數據存儲,Embedding Token的消耗,外網訪問。內測期間,免費試用時長1個月。
內測資格發放后,登錄騰訊云控制臺,進入向量數據庫實例列表
你會看到有一條實例已經創建。
如果沒有的話,嘗試切換其他區域。
使用的實例,規格是:基礎型 1 核 1 GB,總磁盤容量20GB。默認不開啟外網。
如要開啟外網功能,點擊實例列表中的 外網:開啟按鈕。然后填入0.0.0.0/0
。注意生產環境不建議這樣填。
實例監控
點擊實例ID或者名,除了可以查看實例的詳情,還會看到實例的實時監控。
如下:
監控的類型有很多,CPU使用率,內存使用率,硬盤空間使用率,磁盤空間使用量,
網絡監控包括網絡流入瀏覽,網絡流出流量。
請求監控,響應監控。
監控的還是比較全面的。
數據庫可視化管理,DMC的使用
Tencent Cloud VectorDB是使用DMC 向量數據庫客戶端進行可視化管理,它提供鏈接數據庫實例,創建Database,創建Collection,以及增刪改查Document等一系列常規操作。
你可以實例詳情的 登錄按鈕進入到DMC的登錄頁面
進入登錄頁面后,你需要正確選擇數據庫實例所在的區域,并填入賬號和密碼。
賬號與密碼從 秘鑰管理 處可以獲取。如下圖:使用API時也需要使用這兩個參數,請妥善保管,謹防泄露。
登錄DMC可以查看到數據庫實例下的 Database與Collection,如下圖:(默認是空的)
點擊以下圖標可以進行新建database。
在新建database時,需要輸入database的名稱。
點擊database旁邊的加號,進行新建集合
在新建集合時,需要特別注意是的開啟Embedding選項,在開啟Embedding選項后,會必須填入一個原始文本字段,該字段在存入數據時會使用用戶選擇的Embedding 模型進行向量化(但用戶看到的還是原始文本)。如下圖:
由于Collection相當于一張表,那么這個代表著一張表,只有一個字段可以使用Embedding 模型進行向量化。
另外值得注意的是,在創建索引時,向量索引只能創建一個,而且默認已經創建好,用戶可以修改索引類型,相似性方法。
在創建Collection時,只需要創建索引字段即可,非索引字段可以不用創建。類mysql的數據庫,在創建表時,需要定義表中存在的字段和類型。但是Tencent Cloud VectorDB不需要,
向量數據庫字段(Field)具備 Schemaless 特性。即不需要預先定義模式,便可以將任意數量和類型的字段添加到Document 中。使用時,僅需關注需要構建索引的字段。字段的類型也有隨意變更。
執行查詢任務時,直接點擊某一個Collection
在精確查詢時,直接點擊執行,可以查詢出10條記錄。
要使用相似度查詢的話,需要輸如一個文本,該文本將從被Embedding 的字段中搜索。使用匹配的相似度算法。
數據的插入和更新
在DMC中插入數據需要點擊某個集合,打開操作窗,并選中插入/替換
這是一個插入的示例
{"database": "fizz1120","collection": "product_article","buildIndex": true,"documents": [{"id": "f001","name": "tom"},{"id": "f002","name": "fizz"}]
}
json中需要包含database,collection和documents 三個重要是屬性。
插入數據、如果 ID 已存在會覆蓋原始數據,此外在插入數據時,如果你在創建collection時打開了Embedding ,那么documents中的每個記錄都需要配置該字段,否則無法插入成功。如下圖:
配置text字段后,就能夠正常插入值
由于document中字段是不必一直的,所以你可以配置成這樣子
{"database": "fizz1120","collection": "product_article","buildIndex": true,"documents": [{"id": "f001","name": "tom","text": "白日依山盡","time": "2023年11月21日09:56:38","updatetime": "2023年11月21日09:56:38","address": "中國深圳",},{"id": "f002","name": "fizz","text": "黃河入海流"}]
}
性能測試,測試騰訊向量數據庫的查詢處理能力
為了驗證騰訊騰訊云向量數據庫(Tencent Cloud VectorDB)的查詢能力,我們使用開源工具 ann-benchmark 對騰訊向量數據庫進行了性能測試后,得到了很多詳細的數據。
衡量一個數據庫的查詢能力,一個重要的指標就是吞吐量QPS,它是指系統在單位時間內能夠處理的查詢請求數量,是衡量系統查詢處理能力的重要指標。我們測試了不同維度的 QPS 數據、不同召回率下的 QPS 數據、不同數據規模的 QPS 數據。
最終得出的測試結論:
數據集128維與768維某開源向量數據庫與騰訊云向量數據庫的 QPS 對比測試數據,如下所示。通過如下對比視圖,可看出騰訊云的 QPS 性能具有顯著優勢。通過該項測試,可得出如下結論:
- 在不同維度的數據集下,HNSW 索引都可以達到99%以上的召回率。
- 在數據量相同的情況下,隨著向量維度的增加,檢索時資源開銷增加,騰訊云向量數據庫 QPS 會有所降低。
- 同一數據集,與某開源自建向量數據庫對比,騰訊云向量數據庫的 QPS 有36%到279%的提升。對比視圖,如下所示。
針對不同召回率下的 QPS 對比,測試結果是 - 同一數據集,召回率要求越高,即 ef 參數(指定尋找節點鄰居遍歷的范圍)設置越大時,QPS越低。 不同召回率 QPS 的對比視圖,如下所示。
- 同一數據集,在其他配置不變的情況下,若需提高召回率,可適當增加查詢參數 ef。
向量數據庫如何增強企業知識庫搜索?
上面介紹完騰訊云向量數據庫(Tencent Cloud VectorDB)的性能后,相信大家一定迫不及待想要在實踐一下,看下它在日常搜索中的表現。那么下面我就帶領大家以企業知識庫的場景實踐一下。
在騰訊云向量數據庫的產品資料中有關于大模型知識庫的場景方案,這里也給大家簡單介紹一下。
騰訊云向量數據庫可以和大語言模型 LLM 配合使用。企業的私域數據在經過文本分割、向量化后,可以存儲在騰訊云向量數據庫中,構建起企業專屬的外部知識庫,從而在后續的檢索任務中,為大模型提供提示信息,輔助大模型生成更加準確的答案。
流程比較復雜,我簡單描述一下使用神經網絡將知識庫分割,一條條的記錄。然后使用向量化模型進行向量化,存入到向量數據庫中。最后通過API來向外提供檢索,查詢。
知識庫處理
本次實踐我們暫未使用大模型語言LLM,更加注重向量數據庫的使用。
使用的知識庫就是 騰訊云向量數據庫的知識文檔。
為了降低難度和節約時間,我們只解析一頁文檔。即騰訊云向量數據庫的介紹
數據庫建模,創建Collection,創建索引,指定搜索算法
我們先創建相應的集合用于保存文檔數據。集合配置參數如下:
需要向量化的字段為text,主鍵為id。使用的向量化模型為bge-base-zh,這也是推薦使用的模型。另外相似算法使用的是COSINE。
建好模后,我們來處理知識庫的原始數據,將我們知識庫的文本內容以txt文件保存下來(目前圖片無法進行向量化保存),保存下來后,我們需要將內容進行拆分,分割成一小段,一小段,可以以逗號,句號,和換行符進行分割。最后我們組裝成這樣的數據結構。
[{"id" : "001","time": "2023-10-27","author": "騰訊云","link": "https://cloud.tencent.com/document/product/1709/94945","text": "本頁面旨在通過回答幾個問題來讓您大致了解騰訊云向量數據庫(Tencent Cloud VectorDB)"},{"id" : "002","time": "2023-10-27","author": "騰訊云","link": "https://cloud.tencent.com/document/product/1709/94945","text": "讀完本頁后,您將了解騰訊云向量數據庫是什么、它是如何工作的、關鍵概念、為什么使用騰訊云向量數據庫、支持的索引和指標、架構和相關連接方式"},{"id" : "003","time": "2023-10-27","author": "騰訊云","link": "https://cloud.tencent.com/document/product/1709/94945#54308cd9-4ab5-433c-b6dc-bdacd59183e7","text": "騰訊云向量數據庫是什么?"},{"id" : "004","time": "2023-10-27","author": "騰訊云","link": "https://cloud.tencent.com/document/product/1709/94945#54308cd9-4ab5-433c-b6dc-bdacd59183e7","text": "騰訊云向量數據庫是一款全托管的自研企業級分布式數據庫服務,專用于存儲、檢索、分析多維向量數據。"},{"id" : "005","time": "2023-10-27","author": "騰訊云","link": "https://cloud.tencent.com/document/product/1709/94945#54308cd9-4ab5-433c-b6dc-bdacd59183e7","text": "該數據庫支持多種索引類型和相似度計算方法,單索引支持10億級向量規模,可支持百萬級 QPS 及毫秒級查詢延遲。"},{"id" : "006","time": "2023-10-27","author": "騰訊云","link": "https://cloud.tencent.com/document/product/1709/94945#54308cd9-4ab5-433c-b6dc-bdacd59183e7","text": "騰訊云向量數據庫不僅能為大模型提供外部知識庫,提高大模型回答的準確性,還可廣泛應用于推薦系統、NLP 服務、計算機視覺、智能客服等 AI 領域"}
]
- id 主鍵
- time 文檔撰寫時間
- author 作者
- link 文檔片段的錨點
- text 需要向量化的原始文檔文本
插入數據
一篇文章我們大概能夠分割出100多條記錄。然后將這些記錄,一次性插入到向量數據庫中。
本次實踐我們使用 HTTP 協議進行數據寫入和查詢等操作,編程語言是用Nodejs。
以下是向向量數據庫批量插入文檔的核心代碼
批量插入文檔
const axios = require('axios')
const documents = require('./documents') // 存放記錄的js文件
const account = '' // 數據庫賬號
const apiKey = '' // 數據庫秘鑰
const databaseLink = '' // 數據庫外網地址
const headers = {Authorization: `Bearer account=${account}&api_key=${apiKey}`,
}async function insertDoc(documents) {try {const sendData = {database: 'fizz1120',collection: 'product_article',buildIndex: true,documents,}const response = await axios.post(`${databaseLink}/document/upsert`, sendData, headers)console.log('插入成功', response.statusText)} catch (error) {console.error(`請求遇到問題: ${error.message}`)}
}insertDoc(documents)
腳本運行成功后,控制臺會打印出插入成功的字樣。
然后我們在DMC中對某個集合查看詳情,
可以看到,文檔已經被插入了數據庫,目前文檔數位101。
數據查詢
數據查詢我們使用的是相似度匹配的查詢方式,接口為/document/search
,用于查找與給定查詢向量相似的向量。
有幾個必填參數,
database: 指定要查詢的Database名稱。
collection: 指定要查詢的Collection名稱。
如果有個關鍵詞,你可以這個傳入
"search": {"embeddingItems": ["騰訊云向量數據庫是什么?"],"limit": 3,
}
下面是搜索的核心代碼
// 檢索方法
async function searchDom(keyword) {const sendData = {database: 'fizz1120',collection: 'product_article',search: {embeddingItems: [keyword],limit: 5,retrieveVector: false,},}try {const { data } = await axios({method: 'post',url: `${databaseLink}/document/search`,data: sendData,headers,})console.log(data.documents)} catch (error) {console.log(error.message, '111')}
}searchDom('騰訊云向量數據庫是什么?')
返回結果如下:
由于我們查詢參數limit設置了5,所以結果返回了5條。
除了limit,還有一些參數可以控制我們的查詢結果
- vectors 表示要查詢的向量列表。
- documentIds 待查詢的文檔 ID 列表。數組元素數量最大為20
- embeddingItems 輸入文本信息,用于檢索與該文本信息相似的數據。注意 vectors 、 documentIds、embeddingItems 三個字段,只需配置其中一個即可
- params 索引類型不同,檢索時,所需配置的參數不同。
- filter 使用創建 Collection 指定的 Filter 索引的字段設置查詢過濾表達式
- retrieveVector 標識是否需要返回檢索結果的向量值。
- outputFields 指定需要輸出的字段。若不設置,將返回所有字段。
至此,我們的企業知識庫的文檔處理,批量插入,相似度查詢,就全部做完了。
總結
目前騰訊云向量數據庫(Tencent Cloud VectorDB)只支持文本向量化寫入,對于音視頻和圖片等非文本,非結構化數據還不支持。但從目前的情況來看在查詢和使用上,它已經是一款非常優秀的產品。無論是配套的API支持,還是產品概念,文檔。抑或是使用的便捷,都做的非常好。
騰訊云向量數據庫作為一種專門存儲和檢索向量數據的服務提供給用戶, 在高性能、高可用、大規模、低成本、簡單易用、穩定可靠、智能運維等方面體現出顯著優勢。
產品建議和意見
1:使用DMC時,在使用插入時,如果該集合開啟了embedding,并填寫了一個字段,那么在插入時必須要有這個字段,需要在插入時給出的示例能夠包含該字段。
2:在DMC中,希望能夠提供一個查看所有Document的的視圖
類似下圖
3:建議數據庫權限劃分更加細一下,能夠將讀寫的權限分離。目前一個密鑰能夠完成所有的增刪改查。
4:創建集合的頁面不太美觀,第一次使用該功能,非常的迷茫,不清楚填入的
相關鏈接
騰訊云向量數據庫
DMC數據庫管理