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
Búsqueda por similitud
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:
- Tutoriales: trabajar con conocimiento externo
- Cómo hacerlo: Preguntas y respuestas con RAG
- Documentos conceptuales de recuperación
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