Utilizar o Milvus como um armazenamento de vectores
O Milvus é um banco de dados que armazena, indexa e gerencia vetores de incorporação maciça gerados por redes neurais profundas e outros modelos de aprendizado de máquina (ML).
Este notebook mostra como usar a funcionalidade relacionada ao banco de dados de vetores do Milvus.
Configuração
É necessário instalar langchain-milvus
com pip install -qU langchain-milvus
para utilizar esta integração.
%pip install -qU langchain_milvus
A versão mais recente do pymilvus vem com uma base de dados vetorial local Milvus Lite, boa para prototipagem. Se tiver uma grande escala de dados, como mais de um milhão de documentos, recomendamos a configuração de um servidor Milvus de maior desempenho no docker ou kubernetes.
Credenciais
Não são necessárias credenciais para utilizar o armazenamento vetorial Milvus
.
Inicialização
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},
)
Compartimentar os dados com Milvus Collections
Você pode armazenar diferentes documentos não relacionados em diferentes coleções dentro da mesma instância do Milvus para manter o contexto
Eis como pode criar uma nova coleção
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},
)
E aqui está como pode recuperar essa coleção armazenada
vector_store_loaded = Milvus(
embeddings,
connection_args={"uri": URI},
collection_name="langchain_example",
)
Gerir o armazenamento de vectores
Depois de ter criado o seu armazenamento de vectores, podemos interagir com ele adicionando e eliminando diferentes itens.
Adicionar itens ao repositório de vectores
Podemos adicionar itens ao nosso repositório de vectores utilizando a função 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']
Eliminar itens do repositório de vectores
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)
Consultar o repositório de vectores
Depois de o seu repositório de vectores ter sido criado e os documentos relevantes terem sido adicionados, é muito provável que pretenda consultá-lo durante a execução da sua cadeia ou agente.
Consultar diretamente
Pesquisa por semelhança
A realização de uma pesquisa de semelhanças simples com filtragem de metadados pode ser efectuada da seguinte forma:
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'}]
Pesquisa de similaridade com pontuação
Também é possível pesquisar com pontuação:
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'}]
Para obter uma lista completa de todas as opções de pesquisa disponíveis ao utilizar o repositório de vectores Milvus
, pode visitar a referência da API.
Consulta por transformação em retriever
Também pode transformar o armazenamento de vectores num recuperador para facilitar a utilização nas suas cadeias.
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.')]
Utilização para geração aumentada por recuperação
Para obter guias sobre como utilizar este repositório de vectores para a geração aumentada por recuperação (RAG), consulte as secções seguintes:
- Tutoriais: trabalhar com conhecimento externo
- Como fazer: Perguntas e respostas com RAG
- Documentos conceptuais de recuperação
Recuperação por utilizador
Ao construir uma aplicação de recuperação, é frequente ter de a construir tendo em conta vários utilizadores. Isto significa que pode estar a armazenar dados não apenas para um utilizador, mas para muitos utilizadores diferentes, e estes não devem ser capazes de ver os dados uns dos outros.
Milvus recomenda o uso de partition_key para implementar multi-tenancy, aqui está um exemplo.
A funcionalidade de Partition key não está agora disponível no Milvus Lite, se a quiser utilizar, tem de iniciar o servidor Milvus a partir de docker ou kubernetes.
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
)
Para realizar uma pesquisa usando a chave de partição, você deve incluir um dos seguintes itens na expressão booleana da solicitação de pesquisa:
search_kwargs={"expr": '<partition_key> == "xxxx"'}
search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}
Substituir <partition_key>
pelo nome do campo que é designado como a chave de partição.
O Milvus muda para uma partição com base na chave de partição especificada, filtra entidades de acordo com a chave de partição e pesquisa entre as entidades filtradas.
# 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'})]
Referência da API
Para obter documentação detalhada de todas as funcionalidades e configurações do __ModuleName__VectorStore, consulte a referência da API: https://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html