milvus-logo
LFAI
Home
  • Integraciones

Utilizar Milvus como almacén de vectores

Milvus es una base de datos que almacena, indexa y gestiona vectores de incrustación masiva generados por redes neuronales profundas y otros modelos de aprendizaje automático (ML).

Este cuaderno muestra cómo utilizar la funcionalidad relacionada con la base de datos de vectores Milvus.

Instalación de

Necesitará instalar langchain-milvus con pip install -qU langchain-milvus para utilizar esta integración.

%pip install -qU  langchain_milvus

La última versión de pymilvus viene con una base de datos vectorial local Milvus Lite, buena para la creación de prototipos. Si tiene una gran escala de datos, como más de un millón de documentos, le recomendamos que configure un servidor Milvus de mayor rendimiento en Docker o Kubernetes.

Credenciales

No se necesitan credenciales para utilizar el almacén vectorial Milvus.

Inicialización

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 los datos con Milvus Collections

Puede almacenar diferentes documentos no relacionados en diferentes colecciones dentro de la misma instancia Milvus para mantener el contexto

Así es como puede crear una nueva colección

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},
)

Y así es como se recupera esa colección almacenada

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

Gestionar el almacén de vectores

Una vez que haya creado su almacén de vectores, podemos interactuar con él añadiendo y eliminando diferentes elementos.

Añadir elementos al almacén vectorial

Podemos añadir elementos a nuestro almacén vectorial utilizando la función 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 elementos del almacén vectorial

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 el almacén vectorial

Una vez creado el almacén de vectores y añadidos los documentos pertinentes, lo más probable es que desee consultarlo durante la ejecución de su cadena o agente.

Consulta directa

Una simple búsqueda de similitud con filtrado de metadatos puede realizarse del siguiente modo:

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'}]

Búsqueda por similitud con puntuación

También puede realizar una búsqueda con puntuación:

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 obtener una lista completa de todas las opciones de búsqueda disponibles al utilizar el almacén vectorial Milvus, puede visitar la referencia API.

Consulta transformando en recuperador

También puede transformar el almacén de vectores en un recuperador para facilitar el uso en sus cadenas.

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.')]

Uso para la generación aumentada por recuperación

Para obtener guías sobre cómo utilizar este almacén de vectores para la generación aumentada por recuperación (RAG), consulte las siguientes secciones:

Recuperación por usuario

Cuando se crea una aplicación de recuperación, a menudo hay que crearla pensando en varios usuarios. Esto significa que puede estar almacenando datos no sólo para un usuario, sino para muchos usuarios diferentes, y no deberían poder ver los datos de los demás.

Milvus recomienda usar partition_key para implementar multi-tenancy, aquí hay un ejemplo.

La característica de Partition key ahora no está disponible en Milvus Lite, si desea utilizarla, necesita iniciar el servidor Milvus desde docker o 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 una búsqueda utilizando la clave de partición, debe incluir cualquiera de los siguientes elementos en la expresión booleana de la solicitud de búsqueda:

search_kwargs={"expr": '<partition_key> == "xxxx"'}

search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}

Sustituya <partition_key> por el nombre del campo designado como clave de partición.

Milvus cambia a una partición basada en la clave de partición especificada, filtra las entidades según la clave de partición y busca entre las 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'})]

Referencia API

Para una documentación detallada de todas las características y configuraciones de __ModuleName__VectorStore diríjase a la referencia API: https://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html

Traducido porDeepLogo

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?