發佈日期:

圖形資料庫的概念入門

本文為此視頻的學習筆記

關聯式資料庫的核心概念 – ACID

ACID 是一個用來描述資料庫事務正確性的術語,它代表了原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)四個關鍵特性:

  1. 原子性(Atomicity):保證事務中的所有操作要麼全部完成,要麼全部不完成,不會出現只執行了部分操作的情況。如果任何一部分的事務失敗,整個事務將被回滾,資料庫狀態不會改變。
  2. 一致性(Consistency):事務必須使資料庫從一個一致的狀態轉變到另一個一致的狀態。也就是說,事務完成後,所有的資料庫規則都必須應用,保證資料庫的正確性和完整性。
  3. 隔離性(Isolation):確保並行運行的事務彼此隔離,防止事務間的相互干擾。即使事務是同時執行的,每個事務也應該獨立於其他事務,就像它是系統中唯一運行的事務一樣。
  4. 持久性(Durability):一旦事務被提交,它對於資料庫的改變就是永久的,即使系統發生故障也不會丟失事務執行的結果。

ACID 特性是許多關係型資料庫管理系統(RDBMS)的基礎,是它們能夠提供可靠事務處理的關鍵所在。

NoSQL:資料庫技術的演進

以前,我們使用關係型數據庫管理系統(RDBMS)來存儲數據。這種方法雖然在當時是最先進的技術,但其存在許多缺點:

  • 難以理解和查找數據:數據存儲的方式使得查找和理解數據變得困難。
  • 難以索引和消除不一致性:儘管ACID特性保障了數據的一致性,但實現起來相當困難。

隨著技術的進步,我們開始在關係型資料庫中使用表格的形式來存儲數據。這些表格使得數據更容易被人類讀懂,但一旦為了去重和保持一致性而標準化數據,就會出現以下問題:

  • 數據標準化帶來的挑戰:標準化數據涉及大量自動生成的數字外鍵,這讓數據變得難以理解和維護。
  • 聯接查詢的複雜性:需要使用復雜的聯接查詢才能查找到所需的數據。

關係型資料庫的優勢與限制

關係型資料庫的一個顯著優勢是支持ACID特性,這保證了數據一旦提交,後續查詢都能訪問到這些數據。然而,這也帶來了一些挑戰:

  • 高查找成本:為了加快查找速度,我們需要添加索引。但如果進行多次聯接操作,每次聯接都需要進行索引查找,尤其當涉及多個表格時(例如20個),查找成本會非常高。
  • 數據量增加的挑戰:隨著數據量的增長,查找成本只會越來越高。

NoSQL技術的崛起

過去十年,雲計算的出現使情況變得更加複雜。數據量爆炸性增長,我們面臨的挑戰是如何存儲這些海量數據,並使其易於查詢。傳統的關係型資料庫已經難以應對這種規模的數據,這促使了NoSQL技術的革新。

NoSQL技術的發展目的是為了更快地查詢更多的數據,這其中需要做出一些權衡,比如放棄ACID的某些要求。畢竟,在處理數以百萬計的交易時,偶爾丟失一兩筆交易可能是可以接受的。

現代資料庫的用戶接口

為了提高開發者與大數據互動的便利性,我們需要發明或普及不同的用戶接口。其中最簡單的一種是鍵值接口:

鍵值接口:用一個鍵來存儲值,之後可以用這個鍵來獲取值,但這些值對資料庫來說是不透明的,毫無意義。

如果希望資料庫能根據內容來索引和查詢這些值,文檔資料庫就派上用場了:

文檔資料庫:讓你既可以用鍵來查找文檔,也可以基於文檔的內容來進行查找,這些內容都是為了快速檢索而被索引的。

圖形資料庫入門:掌握數據關係與提升查詢效率

1. 圖形資料庫的概念

圖形資料庫主要是用來存儲和操作由節點(實體)和邊(關係)組成的圖形結構數據。與傳統的關係型資料庫不同,圖形資料庫專注於實體之間的關係,這使得它們在處理複雜且相互連接的數據時更為有效。例如,社交網絡分析、推薦系統、欺詐檢測等場景,都能從圖形資料庫的結構中獲益。

2. 數據的存儲與查詢方式

圖形資料庫將數據以圖的形式存儲,其中每個節點表示一個實體,每條邊表示實體之間的某種關係。這種存儲方式不僅反映了真實世界的結構,而且使得查詢和分析數據關係變得直觀且高效。開發者可以直接利用這些關係來快速獲取複雜的查詢結果,而無需執行繁瑣的表連接操作。

3. ACID支持與數據完整性

雖然NoSQL資料庫在處理大量數據時提供了極大的靈活性和擴展性,但對於需要嚴格事務管理和數據完整性保證的應用,這可能是一個挑戰。圖形資料庫如Neo4j在這方面做出了調整,它提供了對ACID事務的支持,使得開發者在維護數據完整性的同時,也能享受NoSQL帶來的其他好處。

4. 從關係型資料庫到圖形資料庫的遷移

將現有的關係型資料庫數據遷移到圖形資料庫看似一個巨大的挑戰,但實際上這是一個直觀且簡單的過程。這種遷移不僅可以提供一個更直觀的數據模型,還能提高查詢的速度和數據處理的靈活性,特別是在業務需求迅速變化的今天,這一點尤為重要。

圖形資料庫的特性及應用案例

在評估資料庫時,開發者通常會考量以下三個主要目標:

1. 直觀性

直觀性意味著以邏輯方式創建和維護數據,減少從代碼到資料庫調用的轉換摩擦,以及業務人員描述應用需求與開發人員滿足這些需求之間的轉換。轉換減少等於提升生產力。在圖形資料庫中,白板模型即是物理模型。你在白板上繪製的數據模型將以完全相同的方式在磁盤上表示,這樣可以大大降低理解和實施上的難度。

2. 速度

速度不僅關乎開發速度,這是由於其更直觀而自然實現的,也關乎執行速度,以及你能多快為應用提供結果以實現實時決策。例如 eBay,他們的應用程式比之前使用 MySQL 解決方案快了數千倍。這支持了產品的實時交付,而 eBay 並不孤單,許多客戶主要因為我們能提供的性能優勢而選擇我們。過去無法實現的業務邏輯現在成為可能,過去需要批處理的流程現在可以實時進行。

3. 敏捷性

敏捷性是開發者在評估資料庫時考慮的第三個特性。敏捷性是速度的另一種衡量。你的代碼能多快、多容易適應業務變化?在 Neo4j 中,我們提供了一個自然適應的 schema optional 數據模型。你可以加入一些約束以維護數據完整性,但也具有隨時添加和刪除數據的靈活性。需要新的節點或關聯?你只需創建它們。需要在現有節點或關聯上存儲更多屬性?只需添加它們。就這麼簡單。不再有 schema 遷移讓你夜不能寐。

發佈日期:

Neo4j圖形資料庫介紹

官方資訊

官方網站: https://neo4j.com/

GitHub: https://github.com/neo4j/neo4j

什麼是Neo4j?

圖形資料庫是一種非關係型的資料庫,以圖形的方式存儲和處理數據。在圖形資料庫中,數據結構主要由節點(Node)和邊(Edge)組成,其中節點代表實體,邊則代表實體間的關係。這種資料庫尤其適合解決複雜的連接問題,例如社交網絡分析、推薦系統和欺詐檢測等。

Neo4j是目前最受歡迎的圖形資料庫之一,它提供了強大的數據建模能力和高效的查詢性能。作為一款專門處理連接數據的數據庫,Neo4j從設計之初就針對數據及其關係進行了優化。作為一種原生圖形數據庫,Neo4j在結構上與其他數據存儲方式大不相同。所謂「原生」意味著每一個數據記錄或節點都包含了直接指向其相連節點的指針,這些直接指針稱為關係。節點中已包含了查找下一個節點所需的所有信息,這就構成了一個連接的圖形,即所謂的原生存儲層。

由於這個設計原理,Neo4j在查詢時不需要計算數據之間的關係,因為這些連接已經存在於數據庫中。這使得對密集連接數據的查詢速度比其他數據庫快數個量級。其他數據庫沒有保存記錄之間的直接指針,它們需要通過搜索一個稱為索引的單獨數據結構來計算連接,這一查找過程需要反复執行以找到每一個連接,不僅耗時而且隨著數據量和查詢複雜度的增加,速度會呈指數級下降,這使它們在處理關係密集型查詢時的速度遠不及Neo4j。

甚麼是圖形數據庫

圖形數據庫將數據以圖的形式表示,這裡的「圖」是數學上的概念,即由節點通過邊連接。在Neo4j中,這些邊被稱為關係。這種表示方式讓客戶能夠實現傳統數據庫無法達到的洞察,因為傳統數據庫通常只將數據表示為行和列。這些新的洞察促使企業能夠做出更多基於數據的決策。

圖形數據庫可以解決三種類型的問題:旅程問題、複雜模式匹配和圖形算法應用。例如,在供應鏈管理中,從產品的來源追踪到消費者的餐盤;或者在零售行業中,通過知識圖形來支持對話代理,讓顧客能夠查詢產品成分等信息。

四種NoSQL 非關聯性資料庫

NoSQL 非關聯性資料庫例子
鍵-值資料庫Hadoop HBase
記憶體資料庫Redis
文件資料庫Mongodb
圖形資料庫Neo4j

主要功能及應用

(一)社交網路圖譜

Neo4j 可以進行複雜關係的查詢,讓使用者或其資料作為節點,使用者與資料的關係作為結點間的連結。

舉例來說,Neo4j 儲存公司、員工資料,便可進行查詢員工與公司的關係、員工與員工的關係、公司與其他類似公司的關係或與員工其他公司的關聯。

(二)企業網路圖譜

相較於單純的工商資訊查詢,藉由 Neo4j 的企業資訊查詢,可以更全面的了解企業資訊。

舉例來說,想了解一家企業的資訊,涵蓋了公司設立資訊、產品資訊、相關聯性資訊等等,利用 Neo4j 就可以查詢到相關聯的關係人資訊,如合作夥伴、客戶、投資人、供應商資料等等,藉由圖資料查詢可以層層挖掘資料,了解其中的複雜關係。

(三)金融產業應用:反洗錢的模型與反欺詐多維關聯分析場景

藉由 Neo4j 可以清楚知道有洗錢疑慮的網絡,相關的帳號、交易時間、手機 IMEI 碼等等,再進一步可進行關聯性的分析。

Neo4j的操作介面

在 neo4j 的數據模型中,您可以看到有許多節點,這些節點是名詞,例如人物、地點、物品等。這些節點之間還可以設置屬性,就像標籤一樣。更重要的是,節點之間可以有關係,並且在 neo4j 中,這些關係是一等公民,意味著它們與節點本身一樣重要。您可以為這些關係添加不同的屬性,甚至是地理空間信息或日期時間信息。

專為圖形設計的查詢語言——Cypher

neo4j 開發了一種專為圖形設計的查詢語言——Cypher。這種語言基於模式匹配,適合處理高度連接的數據問題。相比於傳統的 SQL,Cypher 提供了更靈活的查詢方式,使得用戶可以更容易地查找和分析網絡和圖形中的模式。

MATCH (p:Person)<-[:ACTED_IN]->(m:Movie)
WHERE m.title = "雲圖"
RETURN p

作為一個例子,假如您在探索如何通過遊戲推薦來了解用戶,使用 Cypher 可以讓這一過程非常直觀而有效。這種強大的數據模型和查詢語言的組合,讓 neo4j 在多個應用領域,如推薦系統、詐騙檢測和網絡管理等,展現出極大的潛力。

發佈日期:

FlashAttention介紹

官方資訊

Github: https://github.com/Dao-AILab/flash-attention

論文文檔: https://arxiv.org/abs/2205.14135

此存儲庫提供了以下論文中 FlashAttention 和 FlashAttention-2 的官方實現。可讓我們在建模時有更快的注意力,更好的並行度和工作分區。下面為一張概念示意圖:

官方所做的效能提升試驗結果如下:

甚麼是Flash Attention

Flash Attention 是一種注意力算法,旨在提高基於 Transformer 的模型的效率,使其能夠處理更長的序列長度並更快地進行訓練和推理。它通過減少計算量和內存使用來實現這一點。Flash Attention 是一種快速且內存高效的精確注意力機制,其設計考慮了IO(輸入輸出)的特性。

這項技術的關鍵點

快速 (Fast)

  • 訓練BERT-large(序列長度512)比MLPerf 1.1中的訓練速度記錄快15%。
  • 訓練GPT-2(序列長度1K)比HuggingFace和Megatron-LM的基準實現快3倍。
  • 在long-range arena(序列長度1K-4K)中,比基準速度快2.4倍。

高效內存使用 (Memory-efficient)

  • 傳統的注意力機制內存訪問量是O(N²),而Flash Attention的內存訪問量是亞二次方/線性的。

精確 (Exact)

  • 這不是近似算法(例如稀疏或低秩矩陣方法),其結果與原始方法完全相同。

IO感知 (IO-aware)

  • 與原始的注意力計算方法相比,Flash Attention考慮了硬件(特別是GPU)的特性,而不是將其當作黑盒來處理。

使用Flash Attention

可以通過以下兩種方式來實現:

  • 切片和重新計算:Flash Attention 將序列分成較小的塊,並在每個塊上計算注意力。這可以減少計算量,因為每個塊的注意力矩陣都小得多。此外,Flash Attention 還會重新利用中間計算結果,以進一步減少計算量。
  • 稀疏表示:Flash Attention 使用稀疏表示來表示注意力矩陣。這意味著只存儲非零元素,從而減少內存使用量。

安裝/使用Flash Attention

系統要求:

  • CUDA 11.6 及更高版本。
  • PyTorch 1.12 及更高版本。
  • Linux系統。此功能有可能於 v2.3.2版本之後開始支持 Windows,但 Windows 編譯仍然需要更多的測試。

我們推薦 Nvidia 的 Pytorch 容器,它具有安裝 FlashAttention 所需的所有工具。

在使用Flash Attention要先安裝:

  1. PyTorch。
  2. 安裝  pip install packaging 
  3. 確保已安裝並且 ninja 工作正常(例如, ninja --version 然後 echo $? 應返回退出代碼 0)。如果不是(有時 ninja --version 然後 echo $? 返回非零退出代碼),請卸載然後重新安裝 ninja ( pip uninstall -y ninja && pip install ninja )。如果沒有 ninja ,編譯可能需要很長時間(2 小時),因為它不使用多個 CPU 內核。 ninja 在 3 核機器上編譯需要 5-64 分鐘。
  4. 然後:
pip install flash-attn --no-build-isolation

如果您的電腦的 RAM 小於 96GB 且 CPU 內核眾多, ninja 則可能會運行過多的並行編譯作業,從而耗盡 RAM 量。要限制並行編譯作業的數量,可以設置環境變數 MAX_JOBS :

MAX_JOBS=4 pip install flash-attn --no-build-isolation

使用範例

from flash_attn import flash_attn_qkvpacked_func, flash_attn_func

flash_attn_qkvpacked_func(qkv, dropout_p=0.0, softmax_scale=None, causal=False,
                          window_size=(-1, -1), alibi_slopes=None, deterministic=False):
"""dropout_p should be set to 0.0 during evaluation
If Q, K, V are already stacked into 1 tensor, this function will be faster than
calling flash_attn_func on Q, K, V since the backward pass avoids explicit concatenation
of the gradients of Q, K, V.
If window_size != (-1, -1), implements sliding window local attention. Query at position i
will only attend to keys between [i - window_size[0], i + window_size[1]] inclusive.
Arguments:
    qkv: (batch_size, seqlen, 3, nheads, headdim)
    dropout_p: float. Dropout probability.
    softmax_scale: float. The scaling of QK^T before applying softmax.
        Default to 1 / sqrt(headdim).
    causal: bool. Whether to apply causal attention mask (e.g., for auto-regressive modeling).
    window_size: (left, right). If not (-1, -1), implements sliding window local attention.
    alibi_slopes: (nheads,) or (batch_size, nheads), fp32. A bias of (-alibi_slope * |i - j|) is added to
        the attention score of query i and key j.
    deterministic: bool. Whether to use the deterministic implementation of the backward pass,
        which is slightly slower and uses more memory. The forward pass is always deterministic.
Return:
    out: (batch_size, seqlen, nheads, headdim).
"""
發佈日期:

向量搜尋資料庫的比較

ChromaDB介紹

官方文件: https://docs.trychroma.com/getting-started

GitHub: https://github.com/chroma-core/chroma

Chroma是一個新的AI原生開源嵌入式資料庫,非常輕量且易用。 Chroma是開源嵌入式資料庫,它使知識、事實​​和技能可插入,從而輕鬆建立LLM應用程式。它可以運行在記憶體中(可保存在磁碟中),也可做為資料庫伺服器來使用(這和傳統資料庫類似)。

基本使用範例

import chromadb

# 建立客戶端
# 記憶體模式
# client = chromadb.Client()

# 持久模式,資料保存在磁碟
client = chromadb.PersistentClient(path="./chromac")

# Docker客戶端模式
# chroma_client = chromadb.HttpClient(host="localhost", port=8000)

# 遍歷所有集合
collections = client.list_collections()
print("現有的集合:", collections)

# 建立新集合
collection = client.create_collection("testname")

# 取得集合
collection = client.get_collection("testname")

# 建立或取得集合
collection = client.get_or_create_collection("testname")

# 刪除集合
client.delete_collection("testname")

# 建立或取得集合(帶有嵌入函數)
def embedding_function(doc):
    # 定義你的嵌入函數
    return [0.1, 0.2, 0.3]

collection = client.get_or_create_collection(name="my_collection2", embedding_function=embedding_function)

# 取得集合中最新的5條資料
latest_documents = collection.peek()
print("最新的資料:", latest_documents)

# 新增資料
collection.add(
    documents=[
        "2022年2月2號,美國國防部宣布:將向歐洲增派部隊,應對俄烏邊境地區的緊張局勢。",
        "2月17號,烏克蘭軍方稱:東部民間武裝向政府軍控制區發動砲擊,而東部民間武裝則指責烏政府軍先動用了重型武器發動襲擊,烏東地區緊張局勢持續升級。"
    ],
    metadatas=[
        {"source": "my_source"},
        {"source": "my_source"}
    ],
    ids=["id1", "id2"]
)

# 改變資料(更新或新增)
collection.upsert(
    ids=["id1"],
    documents=["更新後的文檔內容"],
    metadatas=[{"source": "updated_source"}]
)

# 刪除資料
collection.delete(ids=["id1", "id2"])

# 查詢資料
results = collection.query(
    query_texts=["俄烏戰爭發生在哪天?"],
    n_results=2
)
print("查詢結果:", results)

Elasticsearch Vector Store

Elasticsearch 是一個非常強大和靈活的搜索和分析引擎。雖然它的主要用例圍繞全文搜索,但它的用途足夠廣泛,可以用於各種其他功能。其中一個引起許多開發人員和數據科學家注意的功能是使用 Elasticsearch 作為向量資料庫。隨著 dense_vector 數據類型的出現和利用該 script_score 函數的能力,Elasticsearch 的功能已經擴展到促進向量相似性搜索。

Elasticsearch 與專用向量搜索庫相比的優點

使用 Elasticsearch 作為向量資料庫的不可否認的優勢之一是其內置功能,可以過濾對特定數據子集的查詢。當您想要縮小搜索空間範圍或應用程式需要上下文感知向量搜索時,此功能非常有用。相比之下,雖然其他專用的向量搜索庫(如 ChromaDB 和 Faiss)為純向量搜索提供了無可挑剔的速度和效率,但它們缺乏 Elasticsearch 中的全功能查詢功能。例如,ChromaDB 確實允許查詢元數據,但它僅限於字元串的精確匹配。此限制有時會妨礙複雜搜索方案中所需的靈活性和粒度。

將 Elasticsearch 豐富的查詢環境與向量相似度搜索相結合,意味著使用者可以兩全其美:基於向量的精確結果,並通過使用細緻入微的上下文感知篩檢程式對這些搜索進行分層的能力來增強。這種合併使 Elasticsearch 成為需要深度和廣度的開發人員的有力選擇。

Elasticsearch 與專用向量搜索庫的缺點

Elasticsearch 憑藉其廣泛的工具集和適應性,在搜尋引擎領域為自己開闢了一席之地。然而,當與 Faiss 和 ChromaDB 等專門的向量搜索庫相比時,它在某些領域暴露了它的局限性。

近似最近鄰和分層可導航小世界技術

對於Elasticsearch的OpenSearch版本7來說,它缺乏對近似最近鄰(ANN)算法和分層可導航小世界(HNSW)技術的內置支持。這些先進的方法對於提高在廣泛數據集中的搜索速度至關重要。利用它們,搜索速度可以大大加快,而準確性只有很小的權衡。

Faiss 和 ChromaDB

Faiss 和 ChromaDB 將這些策略作為核心技術,展示了快速導航廣闊向量空間的天生能力。他們在該領域的實力使其在圍繞廣泛數據集並需要快速結果的應用中具有優勢。

使用過濾器來緩解

對於Elasticsearch愛好者來說,一切並不黯淡。該系統固有的靈活性提供了一種對策。通過熟練地將過濾器應用於查詢,可以減少Elasticsearch中的搜索空間。這種減少在一定程度上可以平衡因缺乏ANN和HNSW支持而造成的效率差距。此類過濾器使Elasticsearch能夠關注相關數據子集,從而使搜索過程更易於管理和更快速。

Faiss Vector Store

官方網站: https://faiss.ai/index.html

Faiss 是一個用於高效相似性搜索和密集向量聚類的庫。它包含搜索任何大小的向量集的演算法,直到可能不適合 RAM 的向量集。它還包含用於評估和參數調整的支援代碼。Faiss 基於多年的研究,實現了多種先進的技術,使其在大規模向量數據搜索中具有顯著優勢。以下是 Faiss 的主要優點:

Faiss 向量資料庫的優點在於其能夠快速在大量數據中找到匹配項,節省存儲空間,同時保持搜索的準確性。它通過多層次的方法和高效索引技術顯著提高搜索速度,並利用 GPU 進行加速,使得大規模數據的搜索更加高效且穩定。這些特性使得 Faiss 非常適合需要快速檢索大量資料的應用。

  1. 非詳盡搜索:基於 “Video google: A text retrieval approach to object matching in videos.” 的倒排文件技術,使得在大型數據集中進行非詳盡搜索成為可能,避免了全量掃描,提高了搜索效率。
  2. 產品量化 (PQ):來自 “Product quantization for nearest neighbor search” 的產品量化方法,是一種高維向量的有損壓縮技術,能在壓縮域中進行相對準確的重建和距離計算,減少存儲和計算成本。
  3. 三級量化 (IVFADC-R):從 “Searching in one billion vectors: re-rank with source coding” 引入的三級量化方法,進一步提高了搜索效率。
  4. 倒排多重索引:基於 “The inverted multi-index” 的技術,大大提高了倒排索引的速度,適用於快速且精度要求不高的操作。
  5. 優化產品量化 (OPQ):來自 “Optimized product quantization” 的技術,通過向量空間的線性變換,使索引更為高效。
  6. GPU 加速:在 “Billion-scale similarity search with GPUs” 中描述的 GPU 實現和快速 k 選擇,使得在大規模相似性搜索中能充分利用 GPU 的計算能力。
  7. 分層可導航小世界 (HNSW):使用 “Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs” 的 HNSW 索引方法,提供高效而穩健的近似最近鄰搜索。
  8. 二進位多索引哈希:基於 “Fast Search in Hamming Space with Multi-Index Hashing” 的二進位多索引哈希方法,提高了哈希空間中的搜索速度。
  9. 基於圖的索引 (NSG):從 “Fast Approximate Nearest Neighbor Search With The Navigating Spreading-out Graph” 引入的 NSG 方法,進一步提高了近似最近鄰搜索的效率。
  10. 殘差量化器:來自 “Improved Residual Vector Quantization for High-dimensional Approximate Nearest Neighbor Search” 的殘差量化器技術,改進了高維度近似最近鄰搜索的性能。

Redis Vector Store

官方介紹: https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/

大多數具有 Web 服務背景的開發人員可能都熟悉 Redis。從本質上講,Redis 是一個開源鍵值存儲,可以用作緩存、消息代理和資料庫。開發人員之所以選擇 Redis,是因為它速度快,擁有龐大的用戶端庫生態系統,並且已被各大企業部署多年。

RediSearch 是一個 Redis 模組,為 Redis 提供查詢、二級索引、全文搜索和向量搜索。要使用 RediSearch,首先要在 Redis 數據上聲明索引。然後,可以使用 RediSearch 用戶端查詢該數據。有關 RediSearch 功能集的詳細資訊,請參閱 README 或 RediSearch 文檔。

Redis向量資料庫支援2種向量索引類型,分別是暴力搜尋的FLAT以及近似搜尋HNSW,同時也提供餘弦距離、內積距離和歐幾里德距離3種距離運算,另外還支援範圍搜尋,以及可以添加組合過濾器和語義搜尋的混合搜尋,並提供JSON物件支援。

發佈日期:

雲端現有的相似性搜尋資料庫研究

AWS DocDB

官方網頁: https://aws.amazon.com/tw/documentdb/

Amazon DocumentDB (with MongoDB compatibility) 是一種完全托管的 NoSQL 資料庫服務,可讓開發人員輕鬆地設置、操作和擴展 MongoDB 兼容的資料庫。它提供以下功能:

  • MongoDB 兼容性:Amazon DocumentDB 與 MongoDB 兼容,因此您可以使用相同的工具、驅動程序和應用程序來管理和查詢您的數據。
  • 完全託管:Amazon DocumentDB 是一種完全託管的服務,因此您無需管理基礎架構。
  • 可擴展性:Amazon DocumentDB 可根據需要進行擴展,因此您可以隨著數據增長而擴展資料庫。
  • 高可用性:Amazon DocumentDB 提供高可用性,因此您的數據始終可用。
  • 安全性:Amazon DocumentDB 提供多種安全功能,可幫助保護您的數據。

Amazon DocumentDB 適用於各種應用,包括:

  • 內容管理:Amazon DocumentDB 可用於存儲和管理內容管理系統 (CMS) 的內容。
  • 移動應用:Amazon DocumentDB 可用於存儲和管理移動應用程序的數據。
  • 實時大數據分析:Amazon DocumentDB 可用於實時分析大數據。

Alibaba Cloud OpenSearch Vector Store介紹

官方介紹: https://www.alibabacloud.com/help/en/open-search/vector-search-edition/introduction-to-vector-search-edition

OpenSearch Vector Search Edition是阿裡巴巴集團開發的一款大規模分散式搜尋引擎。OpenSearch Vector Search Edition 為整個阿裡巴巴集團提供搜索服務,包括淘寶、天貓、菜鳥、優酷以及為中國大陸以外地區的客戶提供的其他電子商務平臺。OpenSearch Vector Search Edition 也是阿裡雲 OpenSearch 的基礎引擎。經過多年的發展,OpenSearch Vector Search Edition已經滿足了高可用、高時效、性價比等業務需求。OpenSearch Vector Search Edition 還提供自動化運維系統,您可以根據業務特性構建自定義搜索服務。

OpenSearch Vector Search Edition 的優勢

  • Stability 穩定性
    OpenSearch Vector Search Edition 的底層是使用 C++ 程式設計語言開發的。經過十餘年的發展,OpenSearch Vector Search Edition為各類核心業務系統提供了穩定的搜索服務。OpenSearch 向量搜索版適用於對穩定性要求高的核心搜索場景。
  • Efficiency 效率
    OpenSearch Vector Search Edition 是一個分散式搜尋引擎,允許您檢索大量數據。OpenSearch Vector Search Edition 支援實時數據更新。數據更新秒級即可生效。因此,OpenSearch Vector Search Edition 適用於時間敏感的查詢和搜索場景。
  • Cost-effectiveness 成本效益
    OpenSearch Vector Search Edition 支持多種策略進行索引壓縮和多值索引載入測試,能夠經濟高效地滿足查詢需求。

Amazon Neptune – Neptune Analytics vector store

介紹影片

影片文字節錄

您可以通過將數據形狀轉換為嵌入(即向量)來回答有關數據的複雜問題。使用向量搜索索引可以回答有關數據的上下文及其與其他數據的相似性和連接的問題。

借助 Neptune Analytics 中的向量相似性搜索,您可以輕鬆構建機器學習 (ML) 增強搜尋體驗和生成式人工智慧 (GenAI) 應用程式。它還為您提供了更低的總體擁有成本和更簡單的管理開銷,因為您不再需要管理單獨的數據存儲、構建管道或擔心保持數據存儲同步。您可以在 Neptune Analytics 中使用向量相似性搜索,通過將針對特定域上下文的圖形查詢與從 LLMs Amazon Bedrock 託管、GraphStorm 中的圖形神經網路 (GNN) 或其他來源導入的嵌入的低延遲、最近鄰相似性搜尋結果的結果集成來增強您的LLMs功能。

例如,生物資訊學研究人員對將現有的血壓藥物重新用於其他可治療疾病感興趣,他們希望在內部知識圖譜上使用向量相似性搜索來找到蛋白質相互作用網路中的模式。或者一家大型在線圖書零售商可能需要使用已知的盜版材料來快速識別類似的媒體,並結合知識圖譜來識別欺騙性清單行為的模式並找到惡意賣家。

在這兩種情況下,在構建解決方案時,對知識圖譜進行向量搜索可以提高準確性和速度。它使用當今可用的工具減少了運營開銷和複雜性。

更多API參考: https://docs.aws.amazon.com/neptune-analytics/latest/apiref/Welcome.html

發佈日期:

使用Docker來運行Ollama

為什麼要使用Docker來運行Ollama

使用 Docker 來運行 Ollama 可以提供許多優點,包括簡化設置、可移植性、隔離、資源管理、可擴展性和可重複性。可以把Ollama變成一個API服務,提供其他的應用程式直接使用API的方式來呼叫Ollama,並運行不同的本地端模型。而把Ollama變為一個Docker服務,更可以在多台機器上分發 Ollama 模型。這對於需要在高可用性環境中運行 Ollama 的情況非常有用。

以下為Ollama的API手冊

https://github.com/ollama/ollama/blob/main/docs/api.md

利用Docker來運行服務的狀況

以下是一些使用 Docker 運行 Ollama 的具體示例:

  • 在您的本地機器上開發和測試 Ollama 模型: Docker 允許您在本地機器上設置一個隔離的環境來開發和測試 Ollama 模型。這可以幫助您確保模型在部署到生產環境之前按預期工作。
  • 在生產環境中部署 Ollama 模型: Docker 可用於在生產環境中部署 Ollama 模型。您可以使用 Docker 映像來創建和管理 Ollama 服務器,這些服務器可以提供對模型的 API 訪問。
  • 在多台機器上分發 Ollama 模型: Docker 可用於在多台機器上分發 Ollama 模型。這對於需要在高可用性環境中運行 Ollama 的情況非常有用。

其中最重要好處的會是第三點,當我們把本地端LLM視為一個API服務,便可以對此服務做平衡負載,並根據使用量來增加機器,擴張服務的Scale,讓整體服務具備有良好的擴充性。

安裝Ollama Docker image

官方網站: https://hub.docker.com/r/ollama/ollama

Ollama 使得在本地啟動和運行大型語言模型變得容易。

僅 CPU

docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

Nvidia GPU 

安裝 NVIDIA Container Toolkit⁠.

使用 Apt 安裝

Configure the repository 配置存儲庫

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
    | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
    | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
    | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update

安裝 NVIDIA Container Toolkit 軟體包

sudo apt-get install -y nvidia-container-toolkit

使用 Yum 或 Dnf 安裝

配置存儲庫

curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo \
    | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

安裝 NVIDIA Container Toolkit 軟體包

sudo yum install -y nvidia-container-toolkit

配置 Docker 以使用 Nvidia 驅動程式

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

啟動容器

docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

AMD GPU

要使用帶有 AMD GPU 的 Docker 執行 Llama,請使用標籤 rocm 和以下命令:

docker run -d --device /dev/kfd --device /dev/dri -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama:rocm

在本地運行模型

docker exec -it ollama ollama run llama3

延伸閱讀

發佈日期:

Ollama – 本地端運行的LLM服務

Ollama 介紹

Ollama 是一個開源軟體,讓使用者可以在自己的硬體上運行、創建和分享大型語言模型 (LLM) 服務。它提供了一個易於使用的平台,讓用戶無需複雜的設定即可利用 LLM 的功能。

Ollama 的主要優點包括:

  • 本地端運行: Ollama 允許用戶在本地端運行 LLM,這可以保護敏感數據隱私,並降低對網路連接的依賴性。
  • 易於使用: Ollama 提供了命令行介面 (CLI) 和 Python SDK,使 Ollama 易於設置、使用和自定義。
  • 彈性: Ollama 支持多種 LLM 模型,包括 Llama 2 和 Mistral。它還允許用戶從其他格式導入模型並設置運行參數。
  • 可擴展: Ollama 是一個開源項目,鼓勵用戶貢獻和擴展其功能。

Ollama 可用於各種任務,包括:

  • 文字生成: Ollama 可以生成文字、翻譯語言、編寫不同類型的創意內容,並以信息豐富的方式回答您的問題。
  • 文字處理: Ollama 可以用於各種文字處理任務,例如摘要、問答和情感分析。
  • 代碼生成: Ollama 可以生成代碼、翻譯程式碼並以信息豐富的方式回答您的編碼問題。

Ollama的優點

Ollama與LM Studio相似,都是可以於本地端運行、比較多個大語言模型的工具,並且也都是開源軟體

功能 Ollama LM Studio
原生功能集基本豐富
用戶界面可使用Command line豐富易操作的視窗介面
開源性
支持的操作系統 Windows、macOS、Linux Windows、macOS
擴展性可使用API的方式呼叫較偏向本地端應用程式面
Ollama與LM Studio的比較

Ollama本身其實是完全可以使用command line去執行的服務,因為這樣的特性,Ollama非常容易可以與其他的服務集成,因為它可以變成一個API的服務,讓其他服務去用API的方式來呼叫這個地端模型,也因此,我們會可以在伺服器上面,利用Ollama,使我們的線上服務串接到多個不同的地端LLM模型

以下為一個使用curl來呼叫地端模型的範例

curl http://localhost:11434/api/chat -d '{
  "model": "llama3",
  "messages": [
    { "role": "user", "content": "why is the sky blue?" }
  ]
}'

安裝Ollama

curl -fsSL https://ollama.com/install.sh | sh

使用Ollama

用下面的指令來使用Llama3模型

ollama run llama3

設定大語言模型的腳色及回覆指導

Ollama 庫中的模型可以通過提示進行自定義。例如,要自定義 llama3 模型:

ollama pull llama3

建立 Modelfile :

FROM llama3

# set the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1

# set the system message
SYSTEM """
You are Mario from Super Mario Bros. Answer as Mario, the assistant, only.
"""

接下來,創建並運行模型:

ollama create mario -f ./Modelfile
ollama run mario
>>> hi
Hello! It's your friend Mario.

ollama create 用於從 Modelfile 建立模型。

ollama create mymodel -f ./Modelfile

刪除模型

ollama rm llama3

複製模型

ollama cp llama3 my-model

啟動 Ollama

ollama serve 當您想要在不運行桌面應用程式的情況下啟動 Ollama 時使用。

關閉Ollama

systemctl stop ollama

重新啟動Ollama

sudo systemctl restart ollama

API 應用程式介面

生成完成: 使用提供的模型為給定提示生成回應。這是一個流式處理終結點,因此將有一系列回應。最終回應物件將包括來自請求的統計資訊和其他數據。

產生要求(流式處理)

POST /api/chat

呼叫範例

curl http://localhost:11434/api/chat -d '{
  "model": "llama3",
  "prompt": "Why is the sky blue?"
}'

回應範例

{
  "model": "llama3",
  "created_at": "2023-08-04T08:52:19.385406455-07:00",
  "response": "The",
  "done": false
}

要求(無流式處理)

Request 請求

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "Why is the sky blue?"
}'

Response 回應

返回 JSON 物件流:

{
  "model": "llama3",
  "created_at": "2023-08-04T08:52:19.385406455-07:00",
  "response": "The",
  "done": false
}

可使用的模型列表

ModelParametersSizeDownload
Llama 38B4.7GBollama run llama3
Llama 370B40GBollama run llama3:70b
Phi 3 Mini3.8B2.3GBollama run phi3
Phi 3 Medium14B7.9GBollama run phi3:medium
Gemma 29B5.5GBollama run gemma2
Gemma 227B16GBollama run gemma2:27b
Mistral7B4.1GBollama run mistral
Moondream 21.4B829MBollama run moondream
Neural Chat7B4.1GBollama run neural-chat
Starling7B4.1GBollama run starling-lm
Code Llama7B3.8GBollama run codellama
Llama 2 Uncensored7B3.8GBollama run llama2-uncensored
LLaVA7B4.5GBollama run llava
Solar10.7B6.1GBollama run solar
發佈日期:

使PostgreSQL支持向量相似度搜尋

安裝相關套件pgvector

套件Github頁面

https://github.com/pgvector/pgvector

pgvector可做到Postgres 的開源向量相似度搜索,將向量與其他數據一起存儲。

支援:

  • 精確和近似最近鄰搜索
  • 單精度(single-precision)、半精度(half-precision)、二進位(binary)和稀疏向量(sparse vectors)
  • L2 距離(L2 distance)、內積(inner product)、餘弦距離(cosine distance)、L1 距離(L1 distance)、漢明距離(Hamming distance)和 Jaccard 距離(Jaccard distance)
  • 具有 Postgres 用戶端的任何語言
  • 支持 ACID 合規性、時間點恢復、JOIN 和 Postgres 的所有其他強大功能

Linux安裝

cd /tmp
git clone --branch v0.7.2 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # may need sudo

Windows安裝

首先安裝VisualStudioSetup,此為下載連結: https://visualstudio.microsoft.com/downloads/

接著至少勾選這些套件

執行C的編譯環境

call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"

使用nmake編譯檔案

set "PGROOT=C:\Program Files\PostgreSQL\16"
cd %TEMP%
git clone --branch v0.7.2 https://github.com/pgvector/pgvector.git
cd pgvector
nmake /F Makefile.win
nmake /F Makefile.win install

建立可儲存的向量的資料欄位

pgvector的資料格式為vector(1536),後面的(1536)代表長度,此為OpenAI的embedding長度

以下為一個建立表格的SQL範例

CREATE TABLE IF NOT EXISTS public.test_example
(
    id character varying(255) COLLATE pg_catalog."default" NOT NULL,
    embeddings vector(1536),
    CONSTRAINT test_example_pkey PRIMARY KEY (id)
)

在Object Explorer按右鍵選擇,Query Tool可開啟SQL輸入介面,要瀏覽現有資料庫表格列表可至Schemas->Tables瀏覽

新增資料至資料表

以下為一個範例

import psycopg2
df = pd.read_csv('./data.csv')
def convert_embedding(embedding_str):
    return list(map(float, embedding_str.split(',')))

df["embeddings"] = df["embeddings"].apply(literal_eval)

row = df.iloc[0]
sql = """
    INSERT INTO fare_info (
        id, embeddings 
    ) VALUES (
        %s, %s
    )
"""

conn = psycopg2.connect(dbname="myDB", user="myUser", password="xxxxxx")
cursor = conn.cursor()
cursor.execute(sql, (row['id'],row['embeddings']))
conn.commit()

並行搜索的擴展套件AnalyticDB 

AnalyticDB 是阿里巴巴雲推出的云原生數據倉庫,它基於 PostgreSQL 開發,並進行了一些增強,以提高性能和可擴展性。AnalyticDB 也支持 pgvector,但它具有以下一些增強功能:

  • 分布式向量搜索:AnalyticDB 可以將向量數據分佈在多個節點上,並並行處理向量搜索查詢。這使得它能夠比基於單機 PostgreSQL 的 pgvector 更快地處理大型向量數據集。
  • 向量壓縮:AnalyticDB 支持向量壓縮,這可以減少向量數據的存儲空間。
  • 向量索引:AnalyticDB 支持向量索引,這可以提高向量搜索查詢的性能。

總而言之,AnalyticDB 中的 pgvector 與 PostgreSQL 中的 pgvector 相同,但它具有以下一些增強功能:

  • 分布式向量搜索
  • 向量壓縮
  • 向量索引

這些增強功能使 AnalyticDB 更加適合處理大型向量數據集。

發佈日期:

如何設定與操作PostgreSQL

了解安裝的PostgreSQL的相關資訊

像我是使用CentOS,因此我可以用下面的指令來得知現在系統中PostgreSQL的運行狀況

sudo systemctl status postgresql-13
● postgresql-13.service - PostgreSQL 13 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-13.service; enabled; vend>
   Active: active (running) since Sat 2024-06-08 22:48:41 UTC; 2 weeks 1 days a>
     Docs: https://www.postgresql.org/docs/13/static/
 Main PID: 3264201 (postmaster)
    Tasks: 8 (limit: 23678)
   Memory: 27.6M
   CGroup: /system.slice/postgresql-13.service
           ├─3264201 /usr/pgsql-13/bin/postmaster -D /var/lib/pgsql/13/data/
           ├─3264202 postgres: logger
           ├─3264204 postgres: checkpointer
           ├─3264205 postgres: background writer
           ├─3264206 postgres: walwriter
           ├─3264207 postgres: autovacuum launcher
           ├─3264208 postgres: stats collector
           └─3264209 postgres: logical replication launcher

Warning: Journal has been rotated since unit was started. Log output is incompl>

從回覆的資料可以看出,設定檔的資料會在/var/lib/pgsql/13/data/,接著就搜尋裡面的設定檔*.conf

[root@aia16 13]# find /var/lib/pgsql/13 -name *.conf
/var/lib/pgsql/13/data/postgresql.conf
/var/lib/pgsql/13/data/postgresql.auto.conf
/var/lib/pgsql/13/data/pg_hba.conf
/var/lib/pgsql/13/data/pg_ident.conf

允許非本機的連線

PostgreSQL 默認配置只允許本地連接(即 localhost127.0.0.1),這是出於安全考量。要允許遠程連接,需要修改 PostgreSQL 的配置文件並設置適當的防火牆規則。以下是允許遠程連接的步驟:

1. 修改 postgresql.conf 文件,打開 postgresql.conf 文件,找到 listen_addresses 配置項,將其設置為 ' * ' 以允許所有地址連接,或者指定特定的 IP 地址。例如:

listen_addresses = '*'

修改 pg_hba.conf 文件,添加允許遠程連接的規則。

host    all             all             0.0.0.0/0               md5

如果你只想允許特定的 IP 地址範圍,例如 192.168.1.0/24,可以這樣設置:

host    all             all             192.168.1.0/24          md5

接著重啟PostgreSQL

sudo systemctl restart postgresql

發佈日期:

Tesseract – Google開源的光學文字辨識系統

關於Tesseract

Tesseract 是一個開源的光學字符識別(OCR)引擎,能夠將圖像中的文本轉換為可編輯的文本。它由 Google 維護和開發,支持多種語言和字符集。

GitHub位置: https://github.com/tesseract-ocr/tesseract

Tesseract 4 添加了一個新的基於神經網路 (LSTM) 的 OCR 引擎,該引擎專注於行識別,但仍然支援 Tesseract 3 的傳統 Tesseract OCR 引擎,該引擎通過識別字元模式來工作。使用舊版 OCR 引擎模式 (–oem 0) 啟用與 Tesseract 3 的相容性。它還需要支援舊引擎的 traineddata 檔,例如來自 tessdata 儲存庫的檔。

Tesseract 支援 unicode (UTF-8),可以「開箱即用」地識別 100 多種語言。支援多種圖像格式,包括 PNG、JPEG 和 TIFF。支援各種輸出格式:純文本、hOCR (HTML)、PDF、不可見文本 PDF、TSV、ALTO 和 PAGE。

主要功能和特點

  1. 多語言支持: Tesseract 支持超過 100 種語言,包括繁體中文。
  2. 高準確度: Tesseract 在文本識別方面具有較高的準確度,特別是經過適當的預處理後。
  3. 易於集成: Tesseract 可以與多種編程語言和工具集成,例如 Python、C++、Java 等,方便開發者在不同的應用場景中使用。
  4. 開源和免費: Tesseract 是開源軟件,可以自由使用和修改。

安裝 Tesseract

需要安裝兩個部分:引擎本身和語言的 traineddata。超過 130 種語言和超過 35 種腳本的軟體包也可以直接從 Linux 發行版獲得。語言 traineddata 包稱為“tesseract-ocr-langcode”和“tesseract-ocr-script-scriptcode”,其中 langcode 是三個字母的語言代碼, scriptcode 是四個字母的腳本代碼。

安裝教學: https://tesseract-ocr.github.io/tessdoc/InstallationOpenSuse.html

以 root 身份運行以下命令:(CentOS7)

yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/
sudo rpm --import https://build.opensuse.org/projects/home:Alexander_Pozdnyakov/public_key
yum update
yum install tesseract 
yum install tesseract-langpack-deu

使用方式

  • 從發佈頁面下載AppImage
  • 開啟終端應用程式
  • 流覽到 AppImage 的位置
  • 使 AppImage 可執行:$ chmod a+x tesseract*.AppImage
  • 執行它:./tesseract*.AppImage -l eng page.tif page.txt

安裝 pytesseract

pytesseract 是一個 Python 包裝器,用於調用 Tesseract OCR 引擎。

pip install pytesseract
pip install pillow

使用 Tesseract 進行 OCR

from PIL import Image
import pytesseract

# 設定 tesseract 執行檔的路徑
pytesseract.pytesseract.tesseract_cmd = r'/usr/local/bin/tesseract'  # 替換為你的 tesseract 安裝路徑

# 打開圖像文件
image = Image.open('example.png')

# 使用 Tesseract 進行 OCR
text = pytesseract.image_to_string(image, lang='chi_tra')  # 使用繁體中文語言包
print(text)