Retrieval-Augmented Generation: Rastrear sitios web con Apify y guardar datos en Milvus para responder preguntas
Este tutorial explica cómo rastrear sitios web utilizando el Website Content Crawler de Apify y guardar los datos en la base de datos vectorial Milvus/Zilliz para utilizarlos posteriormente en la respuesta a preguntas.
Apify es una plataforma de web scraping y extracción de datos que ofrece un mercado de aplicaciones con más de dos mil herramientas en la nube listas para usar, conocidas como Actores. Estas herramientas son ideales para casos de uso como la extracción de datos estructurados de sitios web de comercio electrónico, redes sociales, motores de búsqueda, mapas en línea, etc.
Por ejemplo, el actor Website Content Crawler puede rastrear sitios web en profundidad, limpiar su HTML eliminando un modal de cookies, el pie de página o la navegación y, a continuación, transformar el HTML en Markdown.
La integración de Apify para Milvus/Zilliz facilita la carga de datos desde la web a la base de datos vectorial.
Antes de empezar
Antes de ejecutar este cuaderno, asegúrate de que tienes lo siguiente
una cuenta Apify y APIFY_API_TOKEN.
una cuenta OpenAI y OPENAI_API_KEY
Una cuenta de Zilliz Cloud (un servicio en la nube totalmente gestionado para Milvus).
El URI y el Token de la base de datos de Zilliz
Instalar dependencias
$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
Configurar las claves Apify y 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 el URI de Milvus/Zilliz, el token y el nombre de la colección
Necesitas el URI y el Token de tu Milvus/Zilliz para configurar el cliente.
- Si tiene un servidor Milvus autodesplegado en Docker o Kubernetes, utilice la dirección del servidor y el puerto como su uri, por ejemplo
http://localhost:19530
. Si habilita la función de autenticación en Milvus, utilice "<su_nombre_de_usuario>:<su_contraseña>" como token, de lo contrario deje el token como cadena vacía. - Si utiliza Zilliz Cloud, el servicio en la nube totalmente gestionado para Milvus, ajuste
uri
ytoken
, que corresponden al punto final público y a la clave API en Zilliz Cloud.
Tenga en cuenta que no es necesario que la colección exista de antemano. Se creará automáticamente cuando los datos se carguen en la base de datos.
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··········
Uso de Website Content Crawler para extraer contenido de texto de Milvus.io
A continuación, utilizaremos el Website Content Crawler con el Apify Python SDK. Empezaremos definiendo el actor_id y run_input, y luego especificaremos la información que se guardará en la base de datos vectorial.
actor_id="apify/website-content-crawler"
es el identificador del rastreador de contenido web. El comportamiento del rastreador puede controlarse completamente mediante los parámetros run_input (consulte la página input para obtener más detalles). En este ejemplo, rastrearemos la documentación de Milvus, que no requiere la renderización de JavaScript. Por lo tanto, configuramos crawlerType=cheerio
, definimos startUrls
, y limitamos el número de páginas rastreadas configurando 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)
El rastreador de contenido del sitio web rastreará minuciosamente el sitio hasta alcanzar el límite predefinido en maxCrawlPages
. Los datos rastreados se almacenarán en Dataset
en la plataforma Apify. Para acceder a estos datos y analizarlos, puede utilizar el código defaultDatasetId
dataset_id = actor_call["defaultDatasetId"]
dataset_id
'P9dLFfeJAljlePWnz'
El siguiente código obtiene los datos raspados de Apify Dataset
y muestra el primer sitio web raspado.
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 cargar los datos en la base de datos Milvus, utilizamos la integración Milvus de Apify. En primer lugar, tenemos que configurar el parámetro para la base de datos Milvus. A continuación, seleccionamos los campos (datasetFields
) que queremos almacenar en la base de datos. En el siguiente ejemplo, estamos guardando el campo text
y 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",
}
Ahora, llamaremos a apify/milvus-integration
para almacenar los datos.
actor_call = client.actor("apify/milvus-integration").call(
run_input=milvus_integration_inputs
)
Todos los datos raspados están ahora almacenados en la base de datos Milvus y están listos para su recuperación y para responder a las preguntas.
Recuperación y proceso generativo LLM
A continuación, definiremos la canalización de la recuperación mediante Langchain. La cadena funciona en dos etapas:
- Vectorstore (Milvus): Langchain recupera los documentos relevantes de Milvus comparando las incrustaciones de la consulta con las incrustaciones de los documentos almacenados.
- Respuesta LLM: Los documentos recuperados proporcionan contexto para que el LLM (por ejemplo, GPT-4) genere una respuesta fundamentada.
Para más detalles sobre la cadena RAG, consulte la documentación de 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()
)
Una vez que tenemos los datos en la base de datos, podemos empezar a hacer preguntas
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.'
Conclusión
En este tutorial, hemos demostrado cómo rastrear el contenido de un sitio web utilizando Apify, almacenar los datos en una base de datos vectorial Milvus y utilizar una cadena de recuperación aumentada para realizar tareas de respuesta a preguntas. Combinando las capacidades de rastreo web de Apify con Milvus/Zilliz para el almacenamiento vectorial y Langchain para los modelos lingüísticos, se pueden construir sistemas de recuperación de información altamente eficaces.
Para mejorar la recopilación de datos y las actualizaciones en la base de datos, la integración de Apify ofrece actualizaciones incrementales, que actualizan sólo los datos nuevos o modificados basándose en las sumas de comprobación. Además, puede eliminar automáticamente los datos obsoletos que no se hayan rastreado en un tiempo determinado. Estas funciones ayudan a mantener optimizada su base de datos vectorial y garantizan que su canalización aumentada de recuperación siga siendo eficiente y esté actualizada con un esfuerzo manual mínimo.
Para más detalles sobre la integración Apify-Milvus, consulte la documentación de Apify Milvus y el archivo README de integración.