Construir RAG con Milvus y Cognee
Cognee es una plataforma "developer-first" que agiliza el desarrollo de aplicaciones de IA con pipelines ECL (Extract, Cognify, Load) escalables y modulares. Al integrarse perfectamente con Milvus, Cognee permite una conexión y recuperación eficientes de conversaciones, documentos y transcripciones, reduciendo las alucinaciones y optimizando los costes operativos.
Con un sólido soporte para almacenes vectoriales como Milvus, bases de datos de grafos y LLM, Cognee proporciona un marco flexible y personalizable para construir sistemas de generación aumentada de recuperación (RAG). Su arquitectura lista para la producción garantiza una mayor precisión y eficiencia para las aplicaciones impulsadas por IA.
En este tutorial, le mostraremos cómo construir una canalización RAG (Retrieval-Augmented Generation) con Milvus y Cognee.
$ pip install pymilvus git+https://github.com/topoteretes/cognee.git
Si estás utilizando Google Colab, para habilitar las dependencias que acabas de instalar, es posible que tengas que reiniciar el tiempo de ejecución (haz clic en el menú "Tiempo de ejecución" en la parte superior de la pantalla, y selecciona "Reiniciar sesión" en el menú desplegable).
Por defecto, utiliza OpenAI como LLM en este ejemplo. Debe preparar la clave api, y establecerla en la función config set_llm_api_key()
.
Para configurar Milvus como la base de datos vectorial, establezca el VECTOR_DB_PROVIDER
a milvus
y especifique el VECTOR_DB_URL
y VECTOR_DB_KEY
. Dado que en esta demo utilizamos Milvus Lite para almacenar datos, sólo es necesario proporcionar VECTOR_DB_URL
.
import os
import cognee
cognee.config.set_llm_api_key("YOUR_OPENAI_API_KEY")
os.environ["VECTOR_DB_PROVIDER"] = "milvus"
os.environ["VECTOR_DB_URL"] = "./milvus.db"
En cuanto a las variables de entorno VECTOR_DB_URL
y VECTOR_DB_KEY
:
- Establecer
VECTOR_DB_URL
como un archivo local, por ejemplo./milvus.db
, es el método más conveniente, ya que utiliza automáticamente Milvus Lite para almacenar todos los datos en este archivo. - Si tiene una gran escala de datos, puede configurar un servidor Milvus de mayor rendimiento en docker o kubernetes. En esta configuración, por favor utilice la uri del servidor, por ejemplo
http://localhost:19530
, como suVECTOR_DB_URL
. - Si desea utilizar Zilliz Cloud, el servicio en la nube totalmente gestionado para Milvus, ajuste
VECTOR_DB_URL
yVECTOR_DB_KEY
, que corresponden al punto final público y a la clave Api en Zilliz Cloud.
Preparar los datos
Utilizamos las páginas de preguntas frecuentes de la Documentación de Milvus 2.4.x como conocimiento privado en nuestra RAG, que es una buena fuente de datos para una canalización RAG sencilla.
Descargamos el archivo zip y extraemos los documentos a la carpeta milvus_docs
.
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
Cargamos todos los archivos markdown de la carpeta milvus_docs/en/faq
. Para cada documento, simplemente utilizamos "# " para separar el contenido del archivo, lo que puede separar aproximadamente el contenido de cada parte principal del archivo markdown.
from glob import glob
text_lines = []
for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
with open(file_path, "r") as file:
file_text = file.read()
text_lines += file_text.split("# ")
Construir RAG
Restablecer los datos de Cognee
await cognee.prune.prune_data()
await cognee.prune.prune_system(metadata=True)
Con una pizarra limpia lista, ahora podemos añadir nuestro conjunto de datos y procesarlo en un gráfico de conocimiento.
Añadir datos y Cognee
await cognee.add(data=text_lines, dataset_name="milvus_faq")
await cognee.cognify()
# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\n\nYes. When ...
# ...
El método add
carga el conjunto de datos (Milvus FAQs) en Cognee y el método cognify
procesa los datos para extraer entidades, relaciones y resúmenes, construyendo un grafo de conocimiento.
Consulta de resúmenes
Una vez procesados los datos, vamos a consultar el grafo de conocimiento.
from cognee.api.v1.search import SearchType
query_text = "How is data stored in milvus?"
search_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)
print(search_results[0])
{'id': 'de5c6713-e079-5d0b-b11d-e9bacd1e0d73', 'text': 'Milvus stores two data types: inserted data and metadata.'}
Esta consulta busca en el grafo de conocimiento un resumen relacionado con el texto de la consulta, y se imprime el candidato más relacionado.
Consulta de fragmentos
Los resúmenes ofrecen información de alto nivel, pero para obtener detalles más detallados, podemos consultar fragmentos específicos de datos directamente desde el conjunto de datos procesado. Estos fragmentos se derivan de los datos originales que se añadieron y analizaron durante la creación del gráfico de conocimiento.
from cognee.api.v1.search import SearchType
query_text = "How is data stored in milvus?"
search_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)
Formateémoslos y visualicémoslos para facilitar su lectura.
def format_and_print(data):
print("ID:", data["id"])
print("\nText:\n")
paragraphs = data["text"].split("\n\n")
for paragraph in paragraphs:
print(paragraph.strip())
print()
format_and_print(search_results[0])
ID: 4be01c4b-9ee5-541c-9b85-297883934ab3
Text:
Where does Milvus store data?
Milvus deals with two types of data, inserted data and metadata.
Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).
Metadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.
###
En los pasos anteriores, consultamos el conjunto de datos de preguntas frecuentes de Milvus para obtener resúmenes y fragmentos específicos de datos. Aunque esto proporcionó información detallada y granular, el conjunto de datos era grande, lo que dificultaba la visualización clara de las dependencias dentro del gráfico de conocimiento.
Para solucionar este problema, reiniciaremos el entorno Cognee y trabajaremos con un conjunto de datos más pequeño y específico. Esto nos permitirá demostrar mejor las relaciones y dependencias extraídas durante el proceso de Cognee. Al simplificar los datos, podemos ver claramente cómo Cognee organiza y estructura la información en el grafo de conocimiento.
Reiniciar Cognee
await cognee.prune.prune_data()
await cognee.prune.prune_system(metadata=True)
Añadir el conjunto de datos focalizado
Aquí, un conjunto de datos más pequeño con sólo una línea de texto es añadido y procesado para asegurar un grafo de conocimiento enfocado y fácilmente interpretable.
# We only use one line of text as the dataset, which simplifies the output later
text = """
Natural language processing (NLP) is an interdisciplinary
subfield of computer science and information retrieval.
"""
await cognee.add(text)
await cognee.cognify()
Búsqueda de información
Al centrarnos en este conjunto de datos más pequeño, podemos analizar claramente las relaciones y la estructura del gráfico de conocimiento.
query_text = "Tell me about NLP"
search_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)
for result_text in search_results:
print(result_text)
# Example output:
# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})
# (...)
#
# It represents nodes and relationships in the knowledge graph:
# - The first element is the source node (e.g., 'natural language processing').
# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').
# - The third element is the target node (e.g., 'computer science').
Esta salida representa los resultados de una consulta del grafo de conocimiento, mostrando las entidades (nodos) y sus relaciones (aristas) extraídas del conjunto de datos procesado. Cada tupla incluye una entidad de origen, un tipo de relación y una entidad de destino, junto con metadatos como identificadores únicos, descripciones y marcas de tiempo. El gráfico destaca los conceptos clave y sus conexiones semánticas, proporcionando una comprensión estructurada del conjunto de datos.
Enhorabuena, ha aprendido el uso básico de cognee con Milvus. Si desea conocer el uso más avanzado de cognee, por favor consulte su página oficial .