Milvus를 벡터 저장소로 사용하기
Milvus는 심층 신경망 및 기타 머신 러닝(ML) 모델에서 생성된 대규모 임베딩 벡터를 저장, 색인화 및 관리하는 데이터베이스입니다.
이 노트북에서는 Milvus 벡터 데이터베이스와 관련된 기능을 사용하는 방법을 보여드립니다.
설치
이 통합 기능을 사용하려면 pip install -qU langchain-milvus
과 함께 langchain-milvus
을 설치해야 합니다.
%pip install -qU langchain_milvus
최신 버전의 pymilvus에는 프로토타이핑에 좋은 로컬 벡터 데이터베이스 Milvus Lite가 함께 제공됩니다. 백만 개 이상의 문서와 같은 대규모 데이터가 있는 경우에는 도커 또는 쿠버네티스에서 더 성능이 뛰어난 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 컬렉션으로 데이터 구획화하기
서로 관련이 없는 다른 문서를 동일한 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)에 사용하는 방법에 대한 가이드는 다음 섹션을 참조하세요:
사용자별 검색
검색 앱을 구축할 때는 여러 사용자를 염두에 두고 앱을 구축해야 하는 경우가 많습니다. 즉, 한 명의 사용자뿐만 아니라 여러 사용자를 위해 데이터를 저장할 수 있으며 서로의 데이터를 볼 수 없어야 합니다.
Milvus는 멀티 테넌시를 구현하기 위해 partition_key를 사용할 것을 권장하며, 그 예는 다음과 같습니다.
현재 Milvus Lite에서는 파티션 키 기능을 사용할 수 없으며, 이를 사용하려면 도커 또는 쿠버네티스에서 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>
을 파티션 키로 지정된 필드의 이름으로 바꾸세요.
밀버스는 지정된 파티션 키를 기준으로 파티션으로 변경하고, 파티션 키에 따라 엔티티를 필터링하며, 필터링된 엔티티 중에서 검색을 수행합니다.
# 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)를 참조하세요.