Retrieval-erweiterte Generierung: Crawlen von Websites mit Apify und Speichern der Daten in Milvus zur Beantwortung von Fragen
In diesem Tutorial wird erklärt, wie man Websites mit dem Website Content Crawler von Apify crawlt und die Daten in der Vektordatenbank Milvus/Zilliz speichert, um sie später zur Beantwortung von Fragen zu verwenden.
Apify ist eine Plattform für Web-Scraping und Datenextraktion, die einen App-Marktplatz mit über zweitausend vorgefertigten Cloud-Tools, den so genannten Actors, bietet. Diese Tools sind ideal für Anwendungsfälle wie die Extraktion strukturierter Daten aus E-Commerce-Websites, sozialen Medien, Suchmaschinen, Online-Karten und mehr.
Der Website Content Crawler Actor kann beispielsweise Websites tiefgehend crawlen, ihr HTML bereinigen, indem er ein Cookie-Modal, eine Fußzeile oder die Navigation entfernt, und dann das HTML in Markdown umwandeln.
Die Apify-Integration für Milvus/Zilliz macht es einfach, Daten aus dem Web in die Vektordatenbank hochzuladen.
Bevor Sie beginnen
Bevor Sie dieses Notebook ausführen, stellen Sie sicher, dass Sie Folgendes haben:
ein Apify-Konto und APIFY_API_TOKEN.
ein OpenAI-Konto und den OPENAI_API_KEY
Ein Zilliz Cloud-Konto (ein vollständig verwalteter Cloud-Service für Milvus).
Die Zilliz-Datenbank URI und Token
Abhängigkeiten installieren
$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
Apify und Open API Schlüssel einrichten
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··········
Einrichten von Milvus/Zilliz URI, Token und Sammlungsname
Sie benötigen die URI und das Token Ihres Milvus/Zilliz, um den Client einzurichten.
- Wenn Sie den Milvus-Server selbst auf Docker oder Kubernetes installiert haben, verwenden Sie die Serveradresse und den Port als URI, z. B.
http://localhost:19530
. Wenn Sie die Authentifizierungsfunktion auf Milvus aktivieren, verwenden Sie "<Ihr_Benutzername>:<Ihr_Passwort>" als Token, andernfalls lassen Sie das Token als leere Zeichenfolge. - Wenn Sie Zilliz Cloud, den vollständig verwalteten Cloud-Dienst für Milvus, verwenden, passen Sie
uri
undtoken
an, die dem öffentlichen Endpunkt und dem API-Schlüssel in Zilliz Cloud entsprechen.
Beachten Sie, dass die Sammlung nicht vorher existieren muss. Sie wird automatisch erstellt, wenn die Daten in die Datenbank hochgeladen werden.
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··········
Verwendung des Website Content Crawlers zum Scrapen von Textinhalten von Milvus.io
Als nächstes werden wir den Website Content Crawler mit dem Apify Python SDK verwenden. Wir beginnen mit der Definition von actor_id und run_input und geben dann die Informationen an, die in der Vektordatenbank gespeichert werden sollen.
Die actor_id="apify/website-content-crawler"
ist der Bezeichner für den Website Content Crawler. Das Verhalten des Crawlers kann vollständig über die run_input-Parameter gesteuert werden (weitere Einzelheiten finden Sie auf der Input-Seite ). In diesem Beispiel wird die Milvus-Dokumentation gecrawlt, für die kein JavaScript-Rendering erforderlich ist. Daher setzen wir crawlerType=cheerio
, definieren startUrls
, und begrenzen die Anzahl der gecrawlten Seiten durch die Einstellung 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)
Der Website Content Crawler wird die Website gründlich crawlen, bis er die vordefinierte Grenze erreicht, die durch maxCrawlPages
festgelegt wurde. Die gecrawlten Daten werden in einem Dataset
auf der Apify-Plattform gespeichert. Um auf diese Daten zuzugreifen und sie zu analysieren, können Sie den defaultDatasetId
dataset_id = actor_call["defaultDatasetId"]
dataset_id
'P9dLFfeJAljlePWnz'
Der folgende Code holt die gescrapten Daten von der Apify-Plattform Dataset
und zeigt die erste gescrapte Website an
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.'
Um Daten in die Milvus-Datenbank hochzuladen, verwenden wir die Apify Milvus-Integration. Zunächst müssen wir die Parameter für die Milvus-Datenbank einrichten. Anschließend wählen wir die Felder (datasetFields
) aus, die wir in der Datenbank speichern möchten. Im folgenden Beispiel speichern wir das Feld text
und 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",
}
Nun rufen wir die apify/milvus-integration
auf, um die Daten zu speichern.
actor_call = client.actor("apify/milvus-integration").call(
run_input=milvus_integration_inputs
)
Alle gescrapten Daten sind nun in der Milvus-Datenbank gespeichert und stehen zum Abruf und zur Beantwortung von Fragen bereit
Abfrage und generative LLM-Pipeline
Als Nächstes definieren wir die Pipeline für die Datenabfrage mit Hilfe von Langchain. Die Pipeline arbeitet in zwei Stufen:
- Vectorstore (Milvus): Langchain ruft relevante Dokumente aus Milvus ab, indem es die Einbettungen der Anfrage mit den gespeicherten Dokumenteneinbettungen abgleicht.
- LLM-Antwort: Die abgerufenen Dokumente liefern den Kontext für den LLM (z. B. GPT-4), um eine fundierte Antwort zu generieren.
Weitere Einzelheiten über die RAG-Kette finden Sie in der Langchain-Dokumentation.
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()
)
Sobald wir die Daten in der Datenbank haben, können wir anfangen, Fragen zu stellen
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.'
Schlussfolgerung
In diesem Tutorial haben wir gezeigt, wie man Website-Inhalte mit Apify crawlt, die Daten in einer Milvus-Vektor-Datenbank speichert und eine Retrieval-erweiterte Pipeline zur Durchführung von Frage-Antwort-Aufgaben verwendet. Durch die Kombination der Web-Scraping-Fähigkeiten von Apify mit Milvus/Zilliz für die Vektorspeicherung und Langchain für Sprachmodelle können Sie hocheffektive Information-Retrieval-Systeme aufbauen.
Um die Datenerfassung und -aktualisierung in der Datenbank zu verbessern, bietet die Apify-Integration inkrementelle Updates, bei denen nur neue oder geänderte Daten auf Basis von Prüfsummen aktualisiert werden. Außerdem können veraltete Daten, die nicht innerhalb eines bestimmten Zeitraums gecrawlt wurden, automatisch entfernt werden. Diese Funktionen tragen dazu bei, Ihre Vektordatenbank zu optimieren und sicherzustellen, dass Ihre Retrieval-erweiterte Pipeline mit minimalem manuellen Aufwand effizient und aktuell bleibt.
Weitere Details zur Apify-Milvus-Integration finden Sie in der Apify-Milvus-Dokumentation und in der README-Datei zur Integration.