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]]
)

ID: 一意の ID です。 SQL とは異なり、自動インクリメントがないので、自分で指定する必要があることに注意してください
Documents: 埋め込みの生成に使用されるテキスト データを挿入するために使用されます。テキストを指定すると、埋め込みが自動的に作成されます。または、埋め込みを直接指定してテキストを別の場所に保存することもできます。
埋め込み: これらは類似性検索を実行するために使用されるため、私の意見では、データベースの最も重要な部分です。
メタデータ: これは、追加のコンテキストのためにデータベースに追加する可能性のある追加データを関連付けるために使用されます。

コレクションの基本が明確になったので、CRUD 操作に進み、データベースにクエリを実行する方法を見てみましょう。

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(... , ..., ...)
    

一般的な使用例:

次のように 3 つのフィルターをすべて組み合わせることができます:

  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。