🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI
Home
  • Integrações

Utilizar o Milvus como um armazém de vectores LangChain

Este caderno mostra como utilizar a funcionalidade relacionada com o Milvus como um armazenamento vetorial LangChain.

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 no kubernetes.

Inicialização

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 Milvus para manter o contexto

Veja como pode criar uma nova coleção de armazenamento vetorial a partir de documentos:

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 eis como pode recuperar essa coleção armazenada

vector_store_loaded = Milvus(
    embeddings,
    connection_args={"uri": URI},
    collection_name="langchain_example",
)

Gerir o armazenamento vetorial

Depois de ter criado o seu repositório 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,
    expr='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, expr='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 armazenamento de vectores para geração aumentada por recuperação (RAG), consulte este guia RAG.

Recuperação por usuário

Ao criar uma aplicação de recuperação, é frequente ter de a criar 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 poder 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://python.langchain.com/api_reference/milvus/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html

Try Managed Milvus for Free

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

Get Started
Feedback

Esta página foi útil?