milvus-logo
LFAI
Home
  • Integrações

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

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:

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

Traduzido porDeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Esta página foi útil?