LLMs模型實戰教程
文章來源:https://zhuanlan.zhihu.com/p/641516393
Kevin
一、介紹
隨著基礎模型的興起,向量數據庫的受歡迎程度也飆升。事實上,在大型語言模型環境中,向量數據庫也很有用。
在機器學習領域,我們經常處理的是向量嵌入。向量嵌入是通過特定的機器學習模型運行對象的特征,將對象的上下文信息投射到潛在空間中來創建的。
為了在使用向量嵌入時能夠表現得特別好,創建向量數據庫是必要的。這方面的工作包括存儲、更新和檢索向量。當我們談論檢索時,通常是指檢索與查詢最相似的向量,這些向量與嵌入到同一潛在空間并傳遞到向量數據庫中。這個檢索過程被稱為近似最近鄰。
嵌入是由人工智能模型生成的,并且由于它們包含大量屬性或特征,因此管理它們的表示可能很困難。在人工智能和機器學習的背景下,這些特征代表數據的許多元素,所有這些元素對于理解模式、相關性和底層結構都是必要的。
因此,我們需要專門為管理此類信息而開發的數據庫。像Chroma-DB這樣的向量數據庫能夠滿足這一需求,因為它們提供了經過優化的嵌入式存儲和查詢功能,并且具備典型數據庫所不具備的獨立向量索引特性。此外,向量數據庫還具備處理向量嵌入的專門能力,這是傳統基于標量的數據庫所不具備的。
PostgreSQL是一個強大的對象關系數據庫系統,可在開源許可下使用。它已經積極開發了超過35年,這使得它在可靠性、穩健性和性能方面建立了良好的聲譽。好消息是,除了外部擴展之外,PostgreSQL還支持向量。
一些流行的向量數據庫包括:Pinecone、Weviate、Chroma、Milvus、Faiss。盡管Redis、Cassandra等數據庫并非向量數據庫,但越來越多的數據庫提供商開始提供ANN搜索功能。
二、什么是向量數據庫
向量數據庫是一種專門用于存儲、管理和搜索向量數據的數據庫。它以向量的形式存儲數據,其中向量是抽象實體(如圖像、音頻文件、文本等)的數學表示。通過存儲數據向量并使用向量之間的相似度度量,向量數據庫可以實現高效、準確的數據搜索和分析。
下面顯示了一個非常簡單的示例。雖然頂部的兩個句子的含義非常相似,但底部的句子卻截然不同。向量數據庫能夠將這些句子編碼為向量,然后找到接近的句子 - 這意味著它們是相似的。
請記住,在實際應用中,我們擁有的維度遠不止 2 個維度 - OpenAI 嵌入目前使用大約 1500 個維度來進行有意義的語言矢量化。
向量數據庫的核心特點如下:
1)、向量表示:向量數據庫將復雜的數據類型轉換為向量表示,使得高維數據能夠以多維空間中的點的形式表示。這種表示不僅具有高計算效率,還簡化了數據點之間的比較和關聯過程。
2)、基于相似性的搜索:向量數據庫擅長根據向量表示來搜索與給定查詢相似的數據項。它們使用歐氏距離、余弦相似度或曼哈頓距離等相似性度量來確定多維空間中數據點之間的接近程度,從而找到最相關和最相似的結果。
3)、可擴展性:向量數據庫被設計成能夠處理大規模的數據集,并且在數據集大小增長時能夠保持高搜索精度和響應時間。此外,它們通常提供并行處理和分布式計算的機制,以滿足不斷增長的數據需求。
4)、與機器學習和人工智能兼容:隨著人工智能和機器學習應用的迅速增長,向量數據庫的采用也在增加。將復雜數據轉換為向量表示可以與這些算法無縫集成,從而獲得規模化的有價值洞見和預測。
總之,向量數據庫利用向量數據的特性,提供高效、準確的搜索和分析功能。它們在處理高維數據和進行相似性搜索方面具有優勢,并且與機器學習和人工智能應用的兼容性使其在各個領域中變得越來越重要。
三、向量數據庫的應用場景
向量數據庫具有多種應用場景,以下是其中一些突出的應用領域:
自然語言處理(NLP):向量數據庫可以有效處理詞嵌入或文檔向量,促進語義搜索和文本分析。它們可以用于文檔分類、情感分析、關鍵詞提取等任務,幫助組織理解來自社交媒體、論壇、客戶互動等數據源的大量文本數據。
圖像搜索和識別:圖像數據庫受益于向量數據庫的向量表示和基于相似性的搜索功能。通過識別高維數據的相似性和模式,它們可以有效處理反向圖像搜索、對象檢測、人臉識別等任務。
推薦系統:強大的推薦引擎是現代電子商務和內容平臺的關鍵組成部分之一。通過使用向量數據庫,這些系統可以分析用戶偏好和內容特征,實時生成個性化且高度相關的推薦。
異常檢測和欺詐預防:特定領域的數據點(如金融交易或用戶行為)可以轉換為向量表示,進行實時分析。基于相似性的搜索功能可以快速識別異常模式或潛在欺詐,幫助組織減少風險。
基因組研究:在基因組學領域,研究人員處理復雜的生物數據,并經常需要識別相似的基因序列或結構。向量數據庫的強大搜索功能可以加速這一過程,更準確地進行關鍵發現和進展。
多媒體內容管理:向量數據庫可以通過將音頻和視頻轉換為向量表示來處理各種內容。這種能力使得內容搜索和分析變得更加普遍,實現了基于相似性、模式識別或自動內容標記的媒體無縫檢索。
除了上述應用領域,向量數據庫在許多其他行業和領域中也有廣泛的應用。隨著對向量數據庫潛力認識的增加,其在數據管理和分析方面的采用和探索將繼續推動創新和發展。
四、PostgreSQL 向量擴展-pgvector
pgvector 是一個基于 PostgreSQL 的擴展,為用戶提供了一套強大的功能,用于高效地存儲、查詢和處理向量數據。它具有以下特點:
直接集成:pgvector 可以作為擴展直接添加到現有的 PostgreSQL 環境中,方便新用戶和長期用戶獲得矢量數據庫的好處,無需進行重大系統更改。
支持多種距離度量:pgvector 內置支持多種距離度量,包括歐幾里德距離、余弦距離和曼哈頓距離。這樣的多功能性使得可以根據具體應用需求進行高度定制的基于相似性的搜索和分析。
索引支持:pgvector 擴展為矢量數據提供高效的索引選項,例如 k-最近鄰 (k-NN) 搜索。即使數據集大小增長,用戶也可以實現快速查詢執行,并保持較高的搜索準確性。
易于查詢語言訪問:作為 PostgreSQL 的擴展,pgvector 使用熟悉的 SQL 查詢語法進行向量操作。這簡化了具有 SQL 知識和經驗的用戶使用矢量數據庫的過程,并避免了學習新的語言或系統。
積極的開發和支持:pgvector 經常更新,以確保與最新的 PostgreSQL 版本和功能兼容,并且開發者社區致力于增強其功能。用戶可以期待一個受到良好支持的解決方案,滿足其矢量數據的需求。
穩健性和安全性:通過與 PostgreSQL 的集成,pgvector 繼承了相同級別的穩健性和安全性功能,使用戶能夠安全地存儲和管理其矢量數據。
總之,pgvector 是一個功能強大的 PostgreSQL 擴展,為用戶提供了高效、靈活和可靠的方式來處理向量數據。它的直接集成、多種距離度量支持、索引支持和易于訪問的查詢語言使其成為處理矢量數據的理想選擇。
4.1、如何使用 pgvector
在數據庫服務器上安裝 pgvector
cd /tmp
git clone --branch v0.4.2 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # 可能需要sudo
在您的數據庫中,運行此命令以啟用擴展
CREATE EXTENSION IF NOT EXISTS vector;
創建一個存儲向量的表
CREATE TABLE items (id bigserial PRIMARY KEY, name, features vector(3));
添加數據的工作原理如下
INSERT INTO items (features) VALUES (‘[1,2,3]’), (‘[4,5,6]’);
由于 pgvector 構建在 postgres 之上,因此許多 PG DML 可用。例如。要更新插入,您可以運行
INSERT INTO items (id, features) VALUES (1, ‘[1,2,3]’), (2, ‘[4,5,6]’)
2ON CONFLICT (id) DO UPDATE SET features = EXCLUDED.features;
4.2、pgvector 查詢運算符
在 pgvector 中,可以使用各種查詢運算符對矢量數據進行不同的操作。這些運算符主要用于計算向量之間的相似度或距離,其中一些運算符使用不同的距離度量。以下是一些常用的 pgvector 查詢運算符:
<->:該運算符計算兩個向量之間的歐幾里德距離。歐幾里德距離是多維空間中向量表示的點之間的直線距離。較小的歐幾里德距離表示向量之間的相似性較大,因此該運算符在查找和排序相似項目時非常有用。
SELECT id, name, features, features <-> ‘[0.45, 0.4, 0.85]’ as distance
2FROM items
3ORDER BY features <-> ‘[0.45, 0.4, 0.85]’;
<=>:該運算符計算兩個向量之間的余弦相似度。余弦相似度比較兩個向量的方向而不是它們的大小。余弦相似度的范圍在 -1 到 1 之間,1 表示向量相同,0 表示無關,-1 表示向量指向相反方向。
SELECT id, name, features, features <=> ‘[0.45, 0.4, 0.85]’ as similarity
2FROM items
3ORDER BY features <=> ‘[0.45, 0.4, 0.85]’ DESC;
<#>:該運算符計算兩個向量之間的曼哈頓距離(也稱為 L1 距離或城市街區距離)。曼哈頓距離是每個維度對應坐標差的絕對值之和。相對于歐幾里德距離而言,曼哈頓距離更加強調沿著維度的較小移動。
SELECT id, name, features, features <#> ‘[0.45, 0.4, 0.85]’ as distance
2FROM items
3ORDER BY features <#> ‘[0.45, 0.4, 0.85]’;p
在選擇適當的運算符時,您應該考慮您的應用需求和數據特性。這可能涉及保持相對距離、強調大小或方向以及關注特定維度等因素。請注意,根據您的數據和用例,運算符的選擇可能會對搜索結果的質量以及最終應用程序的有效性產生重大影響。
4.3、pgvector索引
在 pgvector 中,可以通過添加索引來使用近似最近鄰搜索,以提高查詢性能。以下是一些關于 pgvector 索引的建議:
1)、在表中有一定數量的數據后創建索引:在創建索引之前,確保表中有足夠的數據,以便索引能夠提供更好的查詢性能。
2)、選擇適當數量的列表:可以根據表的大小來選擇適當數量的列表。一般來說,可以使用表的行數除以 1000(最多 1M 行)和平方根(rows)(超過 1M 行)作為起點。
3)、指定適當的探針數量:在執行查詢時,可以指定適當的探針數量來平衡查詢速度和召回率。一般來說,可以使用列表數量除以 10(最多 1M 行)和平方根(lists)(超過 1M 行)作為起點。
這些建議可以幫助您在近似最近鄰搜索中獲得良好的準確性和性能。請注意,具體的索引配置可能需要根據您的數據和查詢需求進行調整,以達到最佳性能。
BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT …
COMMIT;
為您要使用的每個距離函數添加一個索引。
L2距離
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
內積
CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);
余弦距離
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
五、總結
在這篇文章中,我們探討了矢量數據庫在管理高維數據和其在各個行業中的應用中的重要性。我們介紹了 pgvector,這是一個功能強大的 PostgreSQL 擴展,支持矢量數據的存儲和搜索,并提供了一個易于訪問的矢量數據庫解決方案。通過實用指南,我們演示了如何使用 pgvector 創建表、插入數據和查詢相似項。此外,我們還討論了 pgvector 中用于計算相似性度量的不同查詢運算符,如歐幾里得距離、余弦相似度和曼哈頓距離。
通過使用 pgvector,我們可以輕松地處理高維數據,并根據具體需求進行相似性搜索和分析。pgvector 的直接集成、索引支持和易于查詢的語言使其成為處理矢量數據的理想選擇。無論是新用戶還是長期用戶,都可以從中獲得矢量數據庫的好處,而無需進行重大系統改動。
在選擇適當的查詢運算符和索引配置時,我們應該考慮數據特性、查詢需求以及平衡準確性和性能的要求。通過合理地配置和使用 pgvector,我們可以獲得高效、準確且可靠的矢量數據解決方案,滿足不同行業和應用的需求。
項目地址:https://github.com/pgvector/pgvector
發布于 2023-07-04 23:33?IP 屬地廣東