見出し画像

ChromaDB セマンティック検索

前回、

セマンティック検索ができていないことにきづいて、
公式docがセマンティック検索ができるといっているモデルがあったので
試してみました

import chromadb
from chromadb.utils import embedding_functions

# 選択したモデルを使用して埋め込み関数を作成
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="multi-qa-MiniLM-L6-cos-v1")

# Chromaクライアントを作成
chroma_client = chromadb.Client()

# コレクションの作成時に埋め込み関数を指定
collection = chroma_client.create_collection(name="my_collection", embedding_function=sentence_transformer_ef)

# ドキュメントの追加
collection.add(
    documents=["bengal", "bulldog", "sausage"],
    metadatas=[{"source": "cat"}, {"source": "dog"}, {"source": "food"}],
    ids=["id1", "id2", "id3"]
)

# クエリの実行
results = collection.query(
    query_texts=["hotdog"],
    n_results=3
)

print(results)

multi-qa-MiniLM-L6-cos-v1というモデルを使ってみます。
ドキュメントを一つ増やしていてsausage、
クエリはhotdogです。
文字列だけみるとbulldogの方が近そうですが
意味的にはsausageのほうがhotdogに近いはず。
結果

{'ids': [['id3', 'id2', 'id1']], 'distances': [[1.1697618961334229, 1.3224105834960938, 1.5199581384658813]], 'metadatas': [[{'source': 'food'}, {'source': 'dog'}, {'source': 'cat'}]], 'embeddings': None, 'documents': [['sausage', 'bulldog', 'bengal']], 'uris': None, 'data': None}

おお。
ちゃんとsausageの方が距離が近くでています。
良い感じです
次はクエリをcatにしてみます。

# クエリの実行
results = collection.query(
    query_texts=["cat"],
    n_results=3
)

結果

{'ids': [['id2', 'id1', 'id3']], 'distances': [[1.3627203702926636, 1.4854635000228882, 1.4922412633895874]], 'metadatas': [[{'source': 'dog'}, {'source': 'cat'}, {'source': 'food'}]], 'embeddings': None, 'documents': [['bulldog', 'bengal', 'sausage']], 'uris': None, 'data': None}

bulldogのほうがbengalより近くなってしまいました…。
続く。

この記事が気に入ったらサポートをしてみませんか?