首頁 >後端開發 >Python教學 >適用於 SQL 思維的 ChromaDB

適用於 SQL 思維的 ChromaDB

Linda Hamilton
Linda Hamilton原創
2024-12-10 01:02:10645瀏覽

ChromaDB for the SQL Mind

您好,Chroma DB 是一個向量資料庫,對於使用 GenAI 應用程式非常有用。在本文中,我將探討如何透過查看 MySQL 中的類似關係來在 Chroma DB 上執行查詢。

模式

與 SQL 不同,您無法定義自己的架構。在 Chroma 中,您會得到固定的列,每個列都有自己的用途:

import chromadb

#setiing up the client
client = chromadb.Client() 
collection = client.create_collection(name="name")

collection.add(
    documents = ["str1","str2","str3",...]
    ids = [1,2,3,....]
    metadatas=[{"chapter": "3", "verse": "16"},{"chapter":"3", "verse":"5"}, ..]           
    embeddings = [[1,2,3], [3,4,5], [5,6,7]]
)

Ids:它們是唯一的 id。請注意,您需要自己提供它們,與 sql 不同,沒有自動增量
文件: 用於插入用於產生嵌入的文字資料。您可以提供文本,它會自動建立嵌入。或者您可以直接提供嵌入並將文字儲存在其他位置。
嵌入: 在我看來,它們是資料庫中最重要的部分,因為它們用於執行相似性搜尋。
元資料:這用於關聯您可能想要新增到資料庫中以獲得任何額外上下文的任何其他資料。

現在集合的基礎知識已經清楚了,讓我們繼續進行 CRUD 操作,我們將了解如何查詢資料庫。

增刪改查操作

注意:集合就像 Chroma 中的表格

要建立集合,我們可以使用 create_collection() 並根據需要執行我們的操作,但如果集合已經建立並且我們需要再次引用它,我們必須使用 get_collection() 否則我們會收到錯誤。

Create Table tablename 
#Create a collection
collection = client.create_collection(name="name")

#If a collection is already made and you need to use it again the use
collection = client.get_collection(name="name")
Insert into tablename
Values(... , ..., ...)
collection.add(
    ids = [1]
    documents = ["some text"]
    metadatas = [{"key":"value"}]
    embeddings = [[1,2,3]]
)

要更新插入的數據或刪除數據,我們可以使用以下命令

collection.update(
    ids = [2]
    documents = ["some text"]
    metadatas = [{"key":"value"}]
    embeddings = [[1,2,3]]            
)

# If the id does not exist update will do nothing. to add data if id does not exist use
collection.upsert(
    ids = [2]
    documents = ["some text"]
    metadatas = [{"key":"value"}]
    embeddings = [[1,2,3]]            
)

# To delete data use delete and refrence the document or id or the feild
collection.delete(
    documents = ["some text"]         
)

# Or you can delete from a bunch of ids using where that will apply filter on metadata
collection.delete(
    ids=["id1", "id2", "id3",...],
    where={"chapter": "20"}
)

查詢

現在我們將看看某些查詢的樣子

Select * from tablename

Select * from tablename limit value

Select Documents, Metadata from tablename
collection.get()

collection.get(limit = val)

collection.get(include = ["documents","metadata"])

雖然 get() 用於獲取大量表以進行更高級的查詢,但您需要使用查詢方法

Select A,B from table
limit val
collection.query(
    n_results = val #limit
    includes = [A,B] 
)

現在我們有3種可能的方法來過濾資料:相似性搜尋(向量資料庫主要用於什麼),元資料過濾器和文件過濾器

相似性搜尋

我們可以根據文字或嵌入進行搜尋並獲得最相似的輸出

collection.query(query_texts=["string"])

collection.query(query_embeddings=[[1,2,3]])

ChromaDB 中,where 和 where_document 參數用於在查詢期間過濾 結果。這些篩選器可讓您根據元資料或特定文件內容優化相似性搜尋。

按元資料過濾

where 參數可讓您根據關聯的元資料過濾文件。元資料通常是您在文件插入期間提供的鍵值對的字典。

按類別、作者或日期等元資料過濾文件。

import chromadb

#setiing up the client
client = chromadb.Client() 
collection = client.create_collection(name="name")

collection.add(
    documents = ["str1","str2","str3",...]
    ids = [1,2,3,....]
    metadatas=[{"chapter": "3", "verse": "16"},{"chapter":"3", "verse":"5"}, ..]           
    embeddings = [[1,2,3], [3,4,5], [5,6,7]]
)
Create Table tablename 

按文檔內容過濾

where_document 參數允許直接根據文件內容進行過濾。

僅檢索包含特定關鍵字的文件。

#Create a collection
collection = client.create_collection(name="name")

#If a collection is already made and you need to use it again the use
collection = client.get_collection(name="name")

重點:

  • 使用 $contains、$startsWith 或 $endsWith 等運算子。
    • $contains:符合包含子字串的文件。
    • $startsWith:符合以子字串開頭的文件。
    • $endsWith:符合以子字串結尾的文件。
  • 例如:

    Insert into tablename
    Values(... , ..., ...)
    

常見用例:

我們可以像這樣組合所有三個過濾器:

  1. 在特定類別中搜尋

    collection.add(
        ids = [1]
        documents = ["some text"]
        metadatas = [{"key":"value"}]
        embeddings = [[1,2,3]]
    )
    
  2. 搜尋包含特定術語的文件:

    collection.update(
        ids = [2]
        documents = ["some text"]
        metadatas = [{"key":"value"}]
        embeddings = [[1,2,3]]            
    )
    
    # If the id does not exist update will do nothing. to add data if id does not exist use
    collection.upsert(
        ids = [2]
        documents = ["some text"]
        metadatas = [{"key":"value"}]
        embeddings = [[1,2,3]]            
    )
    
    # To delete data use delete and refrence the document or id or the feild
    collection.delete(
        documents = ["some text"]         
    )
    
    # Or you can delete from a bunch of ids using where that will apply filter on metadata
    collection.delete(
        ids=["id1", "id2", "id3",...],
        where={"chapter": "20"}
    )
    
  3. 組合元資料與文件內容過濾器:

    Select * from tablename
    
    Select * from tablename limit value
    
    Select Documents, Metadata from tablename
    

這些過濾器提高了相似性搜尋的精確度,使 ChromaDB 成為目標文件檢索的強大工具。

結論

我寫這篇文章是因為我覺得該文件在嘗試製作自己的程式時還有很多不足之處,我希望這會有所幫助!

感謝您的閱讀,如果您喜歡這篇文章,請按讚和分享。另外,如果您是軟體架構新手並且想了解更多信息,我將開始一個基於小組的隊列,我將親自與您和一個小組一起工作,教您有關軟體架構和設計原理的所有知識。如果您有興趣,可以填寫下面的表格。 https://forms.gle/SUAxrzRyvbnV8uCGA

以上是適用於 SQL 思維的 ChromaDB的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn