Generazione aumentata di recupero: Crawling di siti web con Apify e salvataggio dei dati in Milvus per la risposta alle domande
Questa esercitazione spiega come effettuare il crawling di siti web utilizzando Website Content Crawler di Apify e salvare i dati nel database vettoriale Milvus/Zilliz per utilizzarli successivamente per rispondere alle domande.
Apify è una piattaforma di scraping e di estrazione di dati dal web che offre un mercato di app con oltre duemila strumenti cloud già pronti, noti come Attori. Questi strumenti sono ideali per casi d'uso come l'estrazione di dati strutturati da siti web di e-commerce, social media, motori di ricerca, mappe online e altro ancora.
Ad esempio, l'Attore Website Content Crawler è in grado di effettuare una scansione profonda dei siti web, di ripulire il loro HTML rimuovendo i cookie modali, il piè di pagina o la navigazione e di trasformare l'HTML in Markdown.
L'integrazione Apify per Milvus/Zilliz semplifica il caricamento dei dati dal web al database vettoriale.
Prima di iniziare
Prima di eseguire questo quaderno, assicuratevi di disporre di quanto segue:
un account Apify e APIFY_API_TOKEN.
un account OpenAI e OPENAI_API_KEY
un account Zilliz Cloud (un servizio cloud completamente gestito per Milvus).
L'URI e il Token del database Zilliz.
Installare le dipendenze
$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
Impostare le chiavi 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··········
Impostazione dell'URI, del token e del nome della raccolta di Milvus/Zilliz
Per configurare il client sono necessari l'URI e il Token di Milvus/Zilliz.
- Se si dispone di un server Milvus distribuito autonomamente su Docker o Kubernetes, utilizzare l'indirizzo e la porta del server come URI, ad esempio
http://localhost:19530
. Se si abilita la funzione di autenticazione su Milvus, utilizzare "<nome_utente>:<password>" come token, altrimenti lasciare il token come stringa vuota. - Se si utilizza Zilliz Cloud, il servizio cloud completamente gestito per Milvus, regolare
uri
etoken
, che corrispondono all'endpoint pubblico e alla chiave API di Zilliz Cloud.
Si noti che non è necessario che la raccolta esista in anticipo. Verrà creata automaticamente quando i dati verranno caricati nel database.
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··········
Utilizzo di Website Content Crawler per raschiare i contenuti testuali da Milvus.io
Utilizzeremo poi Website Content Crawler con l'SDK Apify Python. Inizieremo definendo l'actor_id e il run_input, quindi specificheremo le informazioni che saranno salvate nel database vettoriale.
actor_id="apify/website-content-crawler"
è l'identificatore di Website Content Crawler. Il comportamento del crawler può essere controllato completamente tramite i parametri run_input (vedere la pagina degli input per maggiori dettagli). In questo esempio, verrà effettuata la scansione della documentazione di Milvus, che non richiede il rendering in JavaScript. Per questo motivo, si imposta crawlerType=cheerio
, si definisce startUrls
e si limita il numero di pagine strisciate impostando 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)
Il Website Content Crawler effettuerà una scansione completa del sito fino a raggiungere il limite predefinito impostato da maxCrawlPages
. I dati raccolti saranno archiviati in Dataset
sulla piattaforma Apify. Per accedere a questi dati e analizzarli, è possibile utilizzare il codice defaultDatasetId
dataset_id = actor_call["defaultDatasetId"]
dataset_id
'P9dLFfeJAljlePWnz'
Il codice seguente recupera i dati di scraping da Apify Dataset
e visualizza il primo sito web scraped
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.'
Per caricare i dati nel database Milvus, utilizziamo l'integrazione Apify Milvus. Per prima cosa, dobbiamo impostare i parametri per il database Milvus. Quindi, si selezionano i campi (datasetFields
) che si desidera memorizzare nel database. Nell'esempio seguente, salviamo il 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",
}
Ora chiamiamo apify/milvus-integration
per memorizzare i dati.
actor_call = client.actor("apify/milvus-integration").call(
run_input=milvus_integration_inputs
)
Tutti i dati raccolti sono ora memorizzati nel database Milvus e sono pronti per essere recuperati e rispondere alle domande.
Recupero e pipeline generativa LLM
Successivamente, definiremo la pipeline di recupero e di arricchimento utilizzando Langchain. La pipeline funziona in due fasi:
- Vectorstore (Milvus): Langchain recupera i documenti rilevanti da Milvus facendo corrispondere gli embedding della query con gli embedding dei documenti memorizzati.
- Risposta LLM: I documenti recuperati forniscono un contesto al LLM (ad esempio, GPT-4) per generare una risposta informata.
Per maggiori dettagli sulla catena RAG, consultare la documentazione di 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 volta che abbiamo i dati nel database, possiamo iniziare a fare domande.
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.'
Conclusione
In questa esercitazione abbiamo dimostrato come effettuare il crawling dei contenuti di un sito web con Apify, memorizzare i dati in un database vettoriale Milvus e utilizzare una pipeline di retrieval-augmented per eseguire operazioni di risposta alle domande. Combinando le capacità di web scraping di Apify con Milvus/Zilliz per l'archiviazione vettoriale e Langchain per i modelli linguistici, è possibile costruire sistemi di recupero delle informazioni estremamente efficaci.
Per migliorare la raccolta e l'aggiornamento dei dati nel database, l'integrazione di Apify offre aggiornamenti incrementali, che aggiornano solo i dati nuovi o modificati in base alle checksum. Inoltre, può rimuovere automaticamente i dati obsoleti che non sono stati sottoposti a crawling entro un determinato periodo di tempo. Queste funzioni contribuiscono a mantenere ottimizzato il database dei vettori e a garantire che la pipeline di recupero sia efficiente e aggiornata con il minimo sforzo manuale.
Per ulteriori dettagli sull'integrazione Apify-Milvus, consultare la documentazione di Apify Milvus e il file README dell'integrazione.