milvus-logo
LFAI
Home
  • Integrações
    • Engenharia do conhecimento

Open In Colab GitHub Repository

Criar RAG com Milvus e Cognee

O Cognee é uma plataforma que dá prioridade ao programador e que simplifica o desenvolvimento de aplicações de IA com pipelines ECL (Extract, Cognify, Load) modulares e dimensionáveis. Ao integrar-se perfeitamente com o Milvus, o Cognee permite a ligação e a recuperação eficientes de conversas, documentos e transcrições, reduzindo as alucinações e optimizando os custos operacionais.

Com um forte suporte para armazenamentos vectoriais como o Milvus, bases de dados de grafos e LLMs, o Cognee fornece uma estrutura flexível e personalizável para a criação de sistemas de geração aumentada de recuperação (RAG). Sua arquitetura pronta para produção garante maior precisão e eficiência para aplicativos alimentados por IA.

Neste tutorial, vamos mostrar-lhe como construir um pipeline RAG (Retrieval-Augmented Generation) com o Milvus e o Cognee.

$ pip install pymilvus git+https://github.com/topoteretes/cognee.git

Se estiver a utilizar o Google Colab, para ativar as dependências acabadas de instalar, poderá ter de reiniciar o tempo de execução (clique no menu "Tempo de execução" na parte superior do ecrã e selecione "Reiniciar sessão" no menu pendente).

Por predefinição, neste exemplo, é utilizado o OpenAI como LLM. É necessário preparar a chave api e defini-la na função config set_llm_api_key().

Para configurar o Milvus como base de dados vetorial, defina VECTOR_DB_PROVIDER para milvus e especifique VECTOR_DB_URL e VECTOR_DB_KEY. Uma vez que estamos a utilizar o Milvus Lite para armazenar dados nesta demonstração, apenas é necessário fornecer 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"

Quanto às variáveis de ambiente VECTOR_DB_URL e VECTOR_DB_KEY:

  • Definir o VECTOR_DB_URL como um arquivo local, por exemplo,./milvus.db, é o método mais conveniente, pois utiliza automaticamente o Milvus Lite para armazenar todos os dados neste arquivo.
  • Se tiver uma grande escala de dados, pode configurar um servidor Milvus mais eficiente em docker ou kubernetes. Nesta configuração, utilize o uri do servidor, por exemplo,http://localhost:19530, como o seu VECTOR_DB_URL.
  • Se pretender utilizar o Zilliz Cloud, o serviço de nuvem totalmente gerido para o Milvus, ajuste os endereços VECTOR_DB_URL e VECTOR_DB_KEY, que correspondem ao Public Endpoint e à chave Api no Zilliz Cloud.

Preparar os dados

Utilizamos as páginas de FAQ da Documentação do Milvus 2.4.x como conhecimento privado no nosso RAG, que é uma boa fonte de dados para um pipeline RAG simples.

Descarregue o ficheiro zip e extraia os documentos para a pasta 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

Carregamos todos os ficheiros markdown da pasta milvus_docs/en/faq. Para cada documento, utilizamos simplesmente "#" para separar o conteúdo do ficheiro, o que pode separar aproximadamente o conteúdo de cada parte principal do ficheiro 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 o RAG

Redefinição dos dados do Cognee

await cognee.prune.prune_data()
await cognee.prune.prune_system(metadata=True)

Com um quadro limpo pronto, podemos agora adicionar o nosso conjunto de dados e processá-lo num gráfico de conhecimento.

Adicionar dados e reconhecer

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 ...
# ...

O método add carrega o conjunto de dados (Milvus FAQs) no Cognee e o método cognify processa os dados para extrair entidades, relações e resumos, construindo um gráfico de conhecimento.

Consulta de resumos

Agora que os dados foram processados, vamos consultar o gráfico de conhecimento.

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 procura no gráfico de conhecimento um resumo relacionado com o texto da consulta e o candidato mais relacionado é impresso.

Consultar por partes

Os resumos oferecem informações de alto nível, mas para obter detalhes mais granulares, podemos consultar partes específicas de dados diretamente a partir do conjunto de dados processado. Esses pedaços são derivados dos dados originais que foram adicionados e analisados durante a criação do gráfico de conhecimento.

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)

Vamos formatá-los e exibi-los para facilitar a leitura!

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.

###

Nos passos anteriores, consultámos o conjunto de dados das FAQ do Milvus para obter resumos e partes específicas de dados. Embora isso tenha fornecido insights detalhados e informações granulares, o conjunto de dados era grande, o que dificultava a visualização clara das dependências no gráfico de conhecimento.

Para resolver este problema, vamos reiniciar o ambiente Cognee e trabalhar com um conjunto de dados mais pequeno e mais específico. Isto permitir-nos-á demonstrar melhor as relações e dependências extraídas durante o processo cognify. Ao simplificar os dados, podemos ver claramente como o Cognee organiza e estrutura as informações no gráfico de conhecimento.

Redefinir o Cognee

await cognee.prune.prune_data()
await cognee.prune.prune_system(metadata=True)

Adicionando o conjunto de dados focado

Aqui, um conjunto de dados menor com apenas uma linha de texto é adicionado e processado para garantir um gráfico de conhecimento focado e facilmente interpretável.

# 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()

Consulta de informações

Ao concentrarmo-nos neste conjunto de dados mais pequeno, podemos agora analisar claramente as relações e a estrutura do gráfico de conhecimento.

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

Este resultado representa os resultados de uma consulta do gráfico de conhecimento, mostrando as entidades (nós) e as suas relações (arestas) extraídas do conjunto de dados processado. Cada tupla inclui uma entidade de origem, um tipo de relação e uma entidade de destino, juntamente com metadados como IDs únicos, descrições e carimbos de data/hora. O gráfico destaca conceitos-chave e suas conexões semânticas, fornecendo uma compreensão estruturada do conjunto de dados.

Parabéns, aprendeu a utilização básica do cognee com o Milvus. Se quiser saber mais sobre a utilização avançada do cognee, consulte a sua página oficial.

Traduzido porDeepL

Tabela de conteúdos

Try Managed Milvus for Free

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

Get Started
Feedback

Esta página foi útil?