milvus-logo
LFAI
Home
  • Intégrations
    • Sources de données

Génération améliorée par la recherche : Exploration de sites web avec Apify et enregistrement des données dans Milvus pour la réponse aux questions

Open In Colab

Ce tutoriel explique comment explorer des sites web à l'aide du Website Content Crawler d'Apify et enregistrer les données dans la base de données vectorielle Milvus/Zilliz afin de les utiliser ultérieurement pour répondre à des questions.

Apify est une plateforme de scraping web et d'extraction de données qui propose une place de marché d'applications avec plus de deux mille outils cloud prêts à l'emploi, connus sous le nom d'Acteurs. Ces outils sont idéaux pour des cas d'utilisation tels que l'extraction de données structurées à partir de sites web de commerce électronique, de médias sociaux, de moteurs de recherche, de cartes en ligne, etc.

Par exemple, l'acteur Website Content Crawler peut explorer en profondeur des sites web, nettoyer leur HTML en supprimant les cookies, le pied de page ou la navigation, puis transformer le HTML en Markdown.

L'intégration d'Apify pour Milvus/Zilliz permet de télécharger facilement des données du web vers la base de données vectorielle.

Avant de commencer

Avant d'exécuter ce notebook, assurez-vous que vous disposez des éléments suivants :

Installer les dépendances

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

Configuration des clés Apify et 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··········

Configurer l'URI Milvus/Zilliz, le jeton et le nom de la collection

Vous avez besoin de l'URI et du jeton de votre Milvus/Zilliz pour configurer le client.

  • Si vous avez un serveur Milvus auto-déployé sur Docker ou Kubernetes, utilisez l'adresse et le port du serveur comme uri, par exemplehttp://localhost:19530. Si vous activez la fonction d'authentification sur Milvus, utilisez "<votre_nom_d'utilisateur>:<votre_mot_de_passe>" comme jeton, sinon laissez le jeton comme chaîne vide.
  • Si vous utilisez Zilliz Cloud, le service en nuage entièrement géré pour Milvus, ajustez les valeurs uri et token, qui correspondent au point de terminaison public et à la clé API dans Zilliz Cloud.

Notez que la collection ne doit pas nécessairement exister au préalable. Elle sera automatiquement créée lorsque les données seront téléchargées dans la base de données.

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··········

Utilisation du Website Content Crawler pour extraire le contenu textuel de Milvus.io

Ensuite, nous allons utiliser le Website Content Crawler avec le SDK Apify Python. Nous commencerons par définir actor_id et run_input, puis nous spécifierons les informations qui seront enregistrées dans la base de données vectorielle.

Le actor_id="apify/website-content-crawler" est l'identifiant du Website Content Crawler. Le comportement du crawler peut être entièrement contrôlé via les paramètres run_input (voir la page input pour plus de détails). Dans cet exemple, nous allons explorer la documentation Milvus, qui ne nécessite pas de rendu JavaScript. Par conséquent, nous définissons crawlerType=cheerio, startUrls et nous limitons le nombre de pages explorées en définissant 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)

Le Website Content Crawler va explorer le site en profondeur jusqu'à ce qu'il atteigne la limite prédéfinie par maxCrawlPages. Les données extraites seront stockées dans un site Dataset sur la plateforme Apify. Pour accéder à ces données et les analyser, vous pouvez utiliser la fonction de récupération de données. defaultDatasetId

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

Le code suivant récupère les données extraites de la plate-forme Apify Dataset et affiche le premier site web extrait.

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

Pour télécharger les données dans la base de données Milvus, nous utilisons l'intégration Milvus d'Apify. Tout d'abord, nous devons définir les paramètres de la base de données Milvus. Ensuite, nous sélectionnons les champs (datasetFields) que nous voulons stocker dans la base de données. Dans l'exemple ci-dessous, nous enregistrons le champ text et 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",
}

Nous allons maintenant appeler apify/milvus-integration pour stocker les données.

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

Toutes les données extraites sont maintenant stockées dans la base de données Milvus et sont prêtes à être extraites et à faire l'objet de réponses aux questions.

Récupération et pipeline génératif LLM

Ensuite, nous allons définir le pipeline d'extraction-augmentation à l'aide de Langchain. Le pipeline fonctionne en deux étapes :

  • Vectorstore (Milvus) : Langchain récupère les documents pertinents de Milvus en faisant correspondre les enchâssements de la requête avec les enchâssements des documents stockés.
  • Réponse LLM : Les documents récupérés fournissent un contexte au LLM (par exemple, GPT-4) pour générer une réponse éclairée.

Pour plus de détails sur la chaîne RAG, veuillez vous référer à la documentation 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()
)

Une fois que nous avons les données dans la base de données, nous pouvons commencer à poser des questions.


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

Conclusion

Dans ce tutoriel, nous avons montré comment explorer le contenu d'un site Web à l'aide d'Apify, stocker les données dans une base de données vectorielles Milvus et utiliser un pipeline augmenté par extraction pour effectuer des tâches de réponse à des questions. En combinant les capacités de scraping web d'Apify avec Milvus/Zilliz pour le stockage vectoriel et Langchain pour les modèles de langage, vous pouvez construire des systèmes de recherche d'informations très efficaces.

Pour améliorer la collecte et la mise à jour des données dans la base de données, l'intégration d'Apify propose des mises à jour incrémentielles, qui ne mettent à jour que les données nouvelles ou modifiées sur la base des sommes de contrôle. En outre, elle peut supprimer automatiquement les données obsolètes qui n'ont pas été explorées dans un délai donné. Ces fonctionnalités permettent d'optimiser votre base de données vectorielles et de garantir que votre pipeline d'extraction reste efficace et à jour avec un minimum d'efforts manuels.

Pour plus de détails sur l'intégration Apify-Milvus, veuillez vous référer à la documentation Apify Milvus et au fichier README de l'intégration.