Milvusをベクトルストアとして使う
Milvusは、ディープニューラルネットワークやその他の機械学習(ML)モデルによって生成された大量の埋め込みベクトルを保存、インデックス化、管理するデータベースです。
このノートブックでは、Milvusベクトルデータベースに関連する機能の使用方法を説明します。
セットアップ
このインテグレーションを使用するには、langchain-milvus
とpip install -qU langchain-milvus
をインストールする必要があります。
%pip install -qU langchain_milvus
最新版のpymilvusにはローカルベクターデータベースMilvus Liteが付属しており、プロトタイピングに適しています。100万ドキュメントを超えるような大規模なデータをお持ちの場合は、dockerやkubernetes上でよりパフォーマンスの高いMilvusサーバーをセットアップすることをお勧めします。
認証情報
Milvus
ベクターストアを使用する際に認証情報は必要ありません。
初期化
import EmbeddingTabs from "@theme/EmbeddingTabs";
<EmbeddingTabs/>
# | output: false
# | echo: false
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
from langchain_milvus import Milvus
# The easiest way is to use Milvus Lite where everything is stored in a local file.
# If you have a Milvus server you can use the server URI such as "http://localhost:19530".
URI = "./milvus_example.db"
vector_store = Milvus(
embedding_function=embeddings,
connection_args={"uri": URI},
)
Milvus Collectionsを使ってデータを分割する。
同じMilvusインスタンス内で、関連性のない異なるドキュメントを異なるコレクションに格納し、コンテキストを維持することができます。
以下は新しいコレクションを作成する方法です。
from langchain_core.documents import Document
vector_store_saved = Milvus.from_documents(
[Document(page_content="foo!")],
embeddings,
collection_name="langchain_example",
connection_args={"uri": URI},
)
保存されたコレクションを取り出す方法は以下の通りです。
vector_store_loaded = Milvus(
embeddings,
connection_args={"uri": URI},
collection_name="langchain_example",
)
ベクターストアの管理
ベクターストアを作成したら、様々なアイテムを追加したり削除したりすることができます。
ベクターストアにアイテムを追加する
ベクターストアにアイテムを追加するには、add_documents
関数を使用します。
from uuid import uuid4
from langchain_core.documents import Document
document_1 = Document(
page_content="I had chocalate chip pancakes and scrambled eggs for breakfast this morning.",
metadata={"source": "tweet"},
)
document_2 = Document(
page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.",
metadata={"source": "news"},
)
document_3 = Document(
page_content="Building an exciting new project with LangChain - come check it out!",
metadata={"source": "tweet"},
)
document_4 = Document(
page_content="Robbers broke into the city bank and stole $1 million in cash.",
metadata={"source": "news"},
)
document_5 = Document(
page_content="Wow! That was an amazing movie. I can't wait to see it again.",
metadata={"source": "tweet"},
)
document_6 = Document(
page_content="Is the new iPhone worth the price? Read this review to find out.",
metadata={"source": "website"},
)
document_7 = Document(
page_content="The top 10 soccer players in the world right now.",
metadata={"source": "website"},
)
document_8 = Document(
page_content="LangGraph is the best framework for building stateful, agentic applications!",
metadata={"source": "tweet"},
)
document_9 = Document(
page_content="The stock market is down 500 points today due to fears of a recession.",
metadata={"source": "news"},
)
document_10 = Document(
page_content="I have a bad feeling I am going to get deleted :(",
metadata={"source": "tweet"},
)
documents = [
document_1,
document_2,
document_3,
document_4,
document_5,
document_6,
document_7,
document_8,
document_9,
document_10,
]
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
['b0248595-2a41-4f6b-9c25-3a24c1278bb3',
'fa642726-5329-4495-a072-187e948dd71f',
'9905001c-a4a3-455e-ab94-72d0ed11b476',
'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5',
'7508f7ff-c0c9-49ea-8189-634f8a0244d8',
'2e179609-3ff7-4c6a-9e05-08978903fe26',
'fab1f2ac-43e1-45f9-b81b-fc5d334c6508',
'1206d237-ee3a-484f-baf2-b5ac38eeb314',
'd43cbf9a-a772-4c40-993b-9439065fec01',
'25e667bb-6f09-4574-a368-661069301906']
ベクターストアからアイテムを削除する
vector_store.delete(ids=[uuids[-1]])
(insert count: 0, delete count: 1, upsert count: 0, timestamp: 0, success count: 0, err count: 0, cost: 0)
ベクターストアに問い合わせる
ベクターストアが作成され、関連ドキュメントが追加されると、チェーンやエージェントの実行中にベクターストアに問い合わせることができます。
直接問い合わせる
類似検索
メタデータをフィルタリングした単純な類似検索は、以下のように行うことができます:
results = vector_store.similarity_search(
"LangChain provides abstractions to make working with LLMs easy",
k=2,
filter={"source": "tweet"},
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
* Building an exciting new project with LangChain - come check it out! [{'pk': '9905001c-a4a3-455e-ab94-72d0ed11b476', 'source': 'tweet'}]
* LangGraph is the best framework for building stateful, agentic applications! [{'pk': '1206d237-ee3a-484f-baf2-b5ac38eeb314', 'source': 'tweet'}]
スコアによる類似検索
スコアによる検索も可能です:
results = vector_store.similarity_search_with_score(
"Will it be hot tomorrow?", k=1, filter={"source": "news"}
)
for res, score in results:
print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
* [SIM=21192.628906] bar [{'pk': '2', 'source': 'https://example.com'}]
Milvus
ベクトルストアを使用する際に利用可能なすべての検索オプションの一覧については、APIリファレンスを参照してください。
レトリバーに変換してクエリー
ベクターストアをレトリバーに変換して、チェーンで使いやすくすることもできます。
retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
retriever.invoke("Stealing from the bank is a crime", filter={"source": "news"})
[Document(metadata={'pk': 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5', 'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]
リトリーバー拡張生成の使い方
このベクターストアをRAG(retrieval-augmented generation)に使用する方法については、以下のセクションを参照してください:
ユーザーごとの検索
検索アプリを構築する場合、複数のユーザーを想定して構築しなければならないことがよくあります。つまり、1人のユーザーだけでなく、多くの異なるユーザーのデータを保存することになるかもしれません。
milvusはマルチテナントを実装するためにpartition_keyを使うことを推奨しています。
Partition keyの機能は現在Milvus Liteでは利用できないため、利用したい場合はdockerやkubernetesからMilvusサーバを起動する必要がある。
from langchain_core.documents import Document
docs = [
Document(page_content="i worked at kensho", metadata={"namespace": "harrison"}),
Document(page_content="i worked at facebook", metadata={"namespace": "ankush"}),
]
vectorstore = Milvus.from_documents(
docs,
embeddings,
connection_args={"uri": URI},
drop_old=True,
partition_key_field="namespace", # Use the "namespace" field as the partition key
)
パーティションキーを利用した検索を行うには、検索リクエストのブーリアン式に以下のいずれかを含める必要があります:
search_kwargs={"expr": '<partition_key> == "xxxx"'}
search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}
<partition_key>
をパーティション・キーとして指定されたフィールド名に置き換えてください。
milvusは、指定されたパーティション・キーに基づいてパーティションを変更し、パーティション・キーに従ってエンティティをフィルタリングし、フィルタリングされたエンティティを検索します。
# This will only get documents for Ankush
vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "ankush"'}).invoke(
"where did i work?"
)
[Document(page_content='i worked at facebook', metadata={'namespace': 'ankush'})]
# This will only get documents for Harrison
vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "harrison"'}).invoke(
"where did i work?"
)
[Document(page_content='i worked at kensho', metadata={'namespace': 'harrison'})]
APIリファレンス
ModuleName__VectorStoreのすべての機能と設定に関する詳細なドキュメントは、APIリファレンスhttps://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html。