Pengambilan-Penambahan Generasi: Merayapi Situs Web dengan Apify dan Menyimpan Data ke Milvus untuk Menjawab Pertanyaan
Tutorial ini menjelaskan cara merayapi situs web menggunakan Website Content Crawler dari Apify dan menyimpan datanya ke dalam basis data vektor Milvus/Zilliz untuk kemudian digunakan untuk menjawab pertanyaan.
Apify adalah platform web scraping dan ekstraksi data yang menawarkan pasar aplikasi dengan lebih dari dua ribu alat cloud siap pakai, yang dikenal sebagai Actors. Alat-alat ini ideal untuk kasus-kasus penggunaan seperti mengekstraksi data terstruktur dari situs web e-commerce, media sosial, mesin pencari, peta online, dan banyak lagi.
Misalnya, Aktor Perayap Konten Situs Web dapat merayapi situs web secara mendalam, membersihkan HTML-nya dengan menghapus modal cookie, footer, atau navigasi, dan kemudian mengubah HTML tersebut menjadi Penurunan Harga.
Integrasi Apify untuk Milvus/Zilliz memudahkan untuk mengunggah data dari web ke database vektor.
Sebelum memulai
Sebelum menjalankan buku catatan ini, pastikan Anda memiliki yang berikut ini:
akun Apify dan APIFY_API_TOKEN.
akun OpenAI dan OPENAI_API_KEY
Akun Zilliz Cloud (layanan cloud yang dikelola sepenuhnya untuk Milvus).
URI dan Token basis data Zilliz
Menginstal dependensi
$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
Menyiapkan kunci Apify dan 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··········
Menyiapkan URI, token, dan nama koleksi Milvus/Zilliz
Anda memerlukan URI dan Token Milvus/Zilliz Anda untuk menyiapkan klien.
- Jika Anda telah menempatkan server Milvus sendiri di Docker atau Kubernetes, gunakan alamat dan port server sebagai uri Anda, misalnya
http://localhost:19530
. Jika Anda mengaktifkan fitur autentikasi pada Milvus, gunakan "<nama pengguna Anda>:<kata sandi Anda>" sebagai token, jika tidak, biarkan token sebagai string kosong. - Jika Anda menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan
uri
dantoken
, yang sesuai dengan Public Endpoint dan API key di Zilliz Cloud.
Perhatikan bahwa koleksi tidak perlu ada sebelumnya. Koleksi ini akan secara otomatis dibuat ketika data diunggah ke 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··········
Menggunakan Perayap Konten Situs Web untuk mengikis konten teks dari Milvus.io
Selanjutnya, kita akan menggunakan Website Content Crawler dengan Apify Python SDK. Kita akan mulai dengan mendefinisikan actor_id dan run_input, lalu menentukan informasi yang akan disimpan ke database vektor.
actor_id="apify/website-content-crawler"
adalah pengenal untuk Website Content Crawler. Perilaku perayap dapat dikontrol sepenuhnya melalui parameter run_input (lihat halaman input untuk lebih jelasnya). Dalam contoh ini, kita akan merayapi dokumentasi Milvus, yang tidak memerlukan rendering JavaScript. Oleh karena itu, kita menetapkan crawlerType=cheerio
, mendefinisikan startUrls
, dan membatasi jumlah halaman yang dirayapi dengan menetapkan 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)
Perayap Konten Situs Web akan merayapi situs secara menyeluruh hingga mencapai batas yang telah ditentukan yang ditetapkan oleh maxCrawlPages
. Data yang di-crawl akan disimpan di Dataset
pada platform Apify. Untuk mengakses dan menganalisis data ini, Anda dapat menggunakan plugin defaultDatasetId
dataset_id = actor_call["defaultDatasetId"]
dataset_id
'P9dLFfeJAljlePWnz'
Kode berikut ini mengambil data yang di-scrape dari Apify Dataset
dan menampilkan situs web yang di-scrape pertama kali
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.'
Untuk mengunggah data ke dalam basis data Milvus, kita menggunakan integrasi Apify Milvus. Pertama, kita perlu mengatur parameter untuk database Milvus. Selanjutnya, kita pilih field (datasetFields
) yang ingin kita simpan di dalam database. Pada contoh di bawah ini, kita menyimpan field text
dan 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",
}
Sekarang, kita akan memanggil apify/milvus-integration
untuk menyimpan data
actor_call = client.actor("apify/milvus-integration").call(
run_input=milvus_integration_inputs
)
Semua data yang telah dikikis sekarang tersimpan di dalam basis data Milvus dan siap untuk diambil dan menjawab pertanyaan
Pengambilan dan pipeline generatif LLM
Selanjutnya, kita akan mendefinisikan pipeline yang ditambahi pengambilan menggunakan Langchain. Pipeline ini bekerja dalam dua tahap:
- Vectorstore (Milvus): Langchain mengambil dokumen yang relevan dari Milvus dengan mencocokkan sematan kueri dengan sematan dokumen yang tersimpan.
- Tanggapan LLM: Dokumen yang diambil memberikan konteks untuk LLM (misalnya, GPT-4) untuk menghasilkan jawaban yang tepat.
Untuk detail lebih lanjut tentang rantai RAG, silakan lihat dokumentasi 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()
)
Setelah kita memiliki data di dalam basis data, kita dapat mulai mengajukan pertanyaan
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.'
Kesimpulan
Dalam tutorial ini, kami mendemonstrasikan cara merayapi konten situs web menggunakan Apify, menyimpan data dalam basis data vektor Milvus, dan menggunakan pipeline yang telah ditambahi pengambilan untuk melakukan tugas menjawab pertanyaan. Dengan menggabungkan kemampuan web scraping Apify dengan Milvus/Zilliz untuk penyimpanan vektor dan Langchain untuk model bahasa, Anda dapat membangun sistem pencarian informasi yang sangat efektif.
Untuk meningkatkan pengumpulan dan pembaruan data dalam database, integrasi Apify menawarkan pembaruan inkremental, yang hanya memperbarui data baru atau data yang dimodifikasi berdasarkan checksum. Selain itu, integrasi ini dapat secara otomatis menghapus data usang yang belum dirayapi dalam waktu tertentu. Fitur-fitur ini membantu menjaga basis data vektor Anda tetap dioptimalkan dan memastikan bahwa pipeline yang telah ditingkatkan untuk pengambilan data Anda tetap efisien dan mutakhir dengan upaya manual yang minimal.
Untuk detail lebih lanjut tentang integrasi Apify-Milvus, silakan lihat dokumentasi Apify Milvus dan file README integrasi.