milvus-logo
LFAI
Home
  • Integrações
    • Fontes de dados

Geração Aumentada por Recuperação: Rastreando sites da Web com o Apify e salvando dados no Milvus para resposta a perguntas

Open In Colab

Este tutorial explica como rastrear sites usando o rastreador de conteúdo de site da Apify e salvar os dados no banco de dados de vetores Milvus/Zilliz para serem usados posteriormente para responder a perguntas.

A Apify é uma plataforma de raspagem da Web e de extração de dados que oferece um mercado de aplicações com mais de duas mil ferramentas de nuvem prontas a utilizar, conhecidas como Actors. Estas ferramentas são ideais para casos de utilização como a extração de dados estruturados de sítios Web de comércio eletrónico, redes sociais, motores de busca, mapas online e muito mais.

Por exemplo, o Website Content Crawler Ator pode rastrear profundamente websites, limpar o seu HTML removendo um modal de cookies, rodapé ou navegação, e depois transformar o HTML em Markdown.

A integração do Apify para o Milvus/Zilliz facilita o carregamento de dados da Web para a base de dados vetorial.

Antes de começar

Antes de executar este bloco de notas, certifique-se de que tem o seguinte

Instalar dependências

$ pip install --upgrade --quiet  apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0

Configurar chaves Apify e Open API

import os
from getpass import getpass

os.environ["APIFY_API_TOKEN"] = getpass("Enter YOUR APIFY_API_TOKEN")
os.environ["OPENAI_API_KEY"] = getpass("Enter YOUR OPENAI_API_KEY")
Enter YOUR APIFY_API_TOKEN··········
Enter YOUR OPENAI_API_KEY··········

Configurar o URI, o token e o nome da coleção do Milvus/Zilliz

Precisa do URI e do Token do seu Milvus/Zilliz para configurar o cliente.

  • Se você tiver um servidor Milvus auto-implantado no Docker ou Kubernetes, use o endereço e a porta do servidor como seu uri, por exemplo,http://localhost:19530. Se você habilitar o recurso de autenticação no Milvus, use "<seu_nome_de_usuário>:<sua_senha>" como o token, caso contrário, deixe o token como string vazia.
  • Se utilizar o Zilliz Cloud, o serviço de nuvem totalmente gerido para o Milvus, ajuste uri e token, que correspondem ao Public Endpoint e à chave API no Zilliz Cloud.

Note que a coleção não precisa de existir previamente. Ela será criada automaticamente quando os dados forem carregados na base de dados.

os.environ["MILVUS_URI"] = getpass("Enter YOUR MILVUS_URI")
os.environ["MILVUS_TOKEN"] = getpass("Enter YOUR MILVUS_TOKEN")

MILVUS_COLLECTION_NAME = "apify"
Enter YOUR MILVUS_URI··········
Enter YOUR MILVUS_TOKEN··········

Utilizar o Website Content Crawler para extrair conteúdo de texto do Milvus.io

De seguida, vamos utilizar o Website Content Crawler com o Apify Python SDK. Começaremos por definir o actor_id e o run_input e, em seguida, especificaremos as informações que serão guardadas na base de dados vetorial.

O actor_id="apify/website-content-crawler" é o identificador do rastreador de conteúdo do site. O comportamento do rastreador pode ser totalmente controlado por meio dos parâmetros run_input (consulte a página de entrada para obter mais detalhes). Neste exemplo, vamos rastrear a documentação do Milvus, que não requer a renderização de JavaScript. Portanto, definimos crawlerType=cheerio, definimos startUrls e limitamos o número de páginas rastreadas definindo maxCrawlPages=10.

from apify_client import ApifyClient

client = ApifyClient(os.getenv("APIFY_API_TOKEN"))

actor_id = "apify/website-content-crawler"
run_input = {
    "crawlerType": "cheerio",
    "maxCrawlPages": 10,
    "startUrls": [{"url": "https://milvus.io/"}, {"url": "https://zilliz.com/"}],
}

actor_call = client.actor(actor_id).call(run_input=run_input)

O rastreador de conteúdo de site rastreará completamente o site até atingir o limite predefinido definido por maxCrawlPages. Os dados recolhidos serão armazenados em Dataset na plataforma Apify. Para aceder e analisar estes dados, pode utilizar o defaultDatasetId

dataset_id = actor_call["defaultDatasetId"]
dataset_id
'P9dLFfeJAljlePWnz'

O código seguinte vai buscar os dados recolhidos ao Apify Dataset e apresenta o primeiro sítio Web recolhido

item = client.dataset(dataset_id).list_items(limit=1).items
item[0].get("text")
'The High-Performance Vector Database Built for Scale\nStart running Milvus in seconds\nfrom pymilvus import MilvusClient client = MilvusClient("milvus_demo.db") client.create_collection( collection_name="demo_collection", dimension=5 )\nDeployment Options to Match Your Unique Journey\nMilvus Lite\nLightweight, easy to start\nVectorDB-as-a-library runs in notebooks/ laptops with a pip install\nBest for learning and prototyping\nMilvus Standalone\nRobust, single-machine deployment\nComplete vector database for production or testing\nIdeal for datasets with up to millions of vectors\nMilvus Distributed\nScalable, enterprise-grade solution\nHighly reliable and distributed vector database with comprehensive toolkit\nScale horizontally to handle billions of vectors\nZilliz Cloud\nFully managed with minimal operations\nAvailable in both serverless and dedicated cluster\nSaaS and BYOC options for different security and compliance requirements\nTry Free\nLearn more about different Milvus deployment models\nLoved by GenAI developers\nBased on our research, Milvus was selected as the vector database of choice (over Chroma and Pinecone). Milvus is an open-source vector database designed specifically for similarity search on massive datasets of high-dimensional vectors.\nWith its focus on efficient vector similarity search, Milvus empowers you to build robust and scalable image retrieval systems. Whether you’re managing a personal photo library or developing a commercial image search application, Milvus offers a powerful foundation for unlocking the hidden potential within your image collections.\nBhargav Mankad\nSenior Solution Architect\nMilvus is a powerful vector database tailored for processing and searching extensive vector data. It stands out for its high performance and scalability, rendering it perfect for machine learning, deep learning, similarity search tasks, and recommendation systems.\nIgor Gorbenko\nBig Data Architect\nStart building your GenAI app now\nGuided with notebooks developed by us and our community\nRAG\nTry Now\nImage Search\nTry Now\nMultimodal Search\nTry Now\nUnstructured Data Meetups\nJoin a Community of Passionate Developers and Engineers Dedicated to Gen AI.\nRSVP now\nWhy Developers Prefer Milvus for Vector Databases\nScale as needed\nElastic scaling to tens of billions of vectors with distributed architecture.\nBlazing fast\nRetrieve data quickly and accurately with Global Index, regardless of scale.\nReusable Code\nWrite once, and deploy with one line of code into the production environment.\nFeature-rich\nMetadata filtering, hybrid search, multi-vector and more.\nWant to learn more about Milvus? View our documentation\nJoin the community of developers building GenAI apps with Milvus, now with over 25 million downloads\nGet Milvus Updates\nSubscribe to get updates on the latest Milvus releases, tutorials and training from Zilliz, the creator and key maintainer of Milvus.'

Para carregar dados na base de dados do Milvus, utilizamos a integração do Apify Milvus. Em primeiro lugar, temos de configurar o parâmetro para a base de dados Milvus. Em seguida, seleccionamos os campos (datasetFields) que pretendemos armazenar na base de dados. No exemplo abaixo, estamos a guardar o campo text e metadata.title.

milvus_integration_inputs = {
    "milvusUri": os.getenv("MILVUS_URI"),
    "milvusToken": os.getenv("MILVUS_TOKEN"),
    "milvusCollectionName": MILVUS_COLLECTION_NAME,
    "datasetFields": ["text", "metadata.title"],
    "datasetId": actor_call["defaultDatasetId"],
    "performChunking": True,
    "embeddingsApiKey": os.getenv("OPENAI_API_KEY"),
    "embeddingsProvider": "OpenAI",
}

Agora, vamos chamar o apify/milvus-integration para armazenar os dados

actor_call = client.actor("apify/milvus-integration").call(
    run_input=milvus_integration_inputs
)

Todos os dados recolhidos estão agora armazenados na base de dados Milvus e estão prontos para serem recuperados e para responder a perguntas

Recuperação e pipeline generativo LLM

De seguida, vamos definir o pipeline de recuperação-aumentado utilizando Langchain. O pipeline funciona em duas fases:

  • Vectorstore (Milvus): A Langchain recupera documentos relevantes do Milvus fazendo corresponder os embeddings da consulta com os embeddings dos documentos armazenados.
  • Resposta LLM: Os documentos recuperados fornecem o contexto para que o LLM (por exemplo, GPT-4) gere uma resposta informada.

Para mais pormenores sobre a cadeia RAG, consulte a documentação da Langchain.

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_milvus.vectorstores import Milvus
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

vectorstore = Milvus(
    connection_args={
        "uri": os.getenv("MILVUS_URI"),
        "token": os.getenv("MILVUS_TOKEN"),
    },
    embedding_function=embeddings,
    collection_name=MILVUS_COLLECTION_NAME,
)

prompt = PromptTemplate(
    input_variables=["context", "question"],
    template="Use the following pieces of retrieved context to answer the question. If you don't know the answer, "
    "just say that you don't know. \nQuestion: {question} \nContext: {context} \nAnswer:",
)


def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)


rag_chain = (
    {
        "context": vectorstore.as_retriever() | format_docs,
        "question": RunnablePassthrough(),
    }
    | prompt
    | ChatOpenAI(model="gpt-4o-mini")
    | StrOutputParser()
)

Quando tivermos os dados na base de dados, podemos começar a fazer perguntas


question = "What is Milvus database?"

rag_chain.invoke(question)
'Milvus is an open-source vector database specifically designed for billion-scale vector similarity search. It facilitates efficient management and querying of vector data, which is essential for applications involving unstructured data, such as AI and machine learning. Milvus allows users to perform operations like CRUD (Create, Read, Update, Delete) and vector searches, making it a powerful tool for handling large datasets.'

Conclusão

Neste tutorial, demonstramos como rastrear o conteúdo de um site usando o Apify, armazenar os dados em um banco de dados de vetor Milvus e usar um pipeline aumentado por recuperação para executar tarefas de resposta a perguntas. Ao combinar as capacidades de raspagem da Web do Apify com o Milvus/Zilliz para armazenamento de vectores e o Langchain para modelos de linguagem, pode criar sistemas de recuperação de informações altamente eficazes.

Para melhorar a recolha de dados e as actualizações na base de dados, a integração do Apify oferece actualizações incrementais, que actualizam apenas dados novos ou modificados com base em somas de verificação. Além disso, pode remover automaticamente dados desactualizados que não tenham sido rastreados num determinado período de tempo. Estas funcionalidades ajudam a manter a sua base de dados de vectores optimizada e asseguram que o seu pipeline aumentado por recuperação permanece eficiente e atualizado com um esforço manual mínimo.

Para obter mais detalhes sobre a integração do Apify-Milvus, consulte a documentação do Apify Milvus e o ficheiro README da integração.