검색 증강 세대: Apify로 웹 사이트 크롤링 및 질문 답변을 위해 Milvus에 데이터 저장하기
이 튜토리얼에서는 Apify의 웹사이트 콘텐츠 크롤러를 사용하여 웹사이트를 크롤링하고 나중에 질문 답변에 사용할 수 있도록 데이터를 Milvus/Zilliz 벡터 데이터베이스에 저장하는 방법에 대해 설명합니다.
Apify는 웹 스크래핑 및 데이터 추출 플랫폼으로, 액터라고 하는 2,000개 이상의 기성 클라우드 도구가 포함된 앱 마켓플레이스를 제공합니다. 이러한 도구는 전자상거래 웹사이트, 소셜 미디어, 검색 엔진, 온라인 지도 등에서 구조화된 데이터를 추출하는 등의 사용 사례에 이상적입니다.
예를 들어 웹사이트 콘텐츠 크롤러 액터는 웹사이트를 심층적으로 크롤링하고 쿠키 모달, 푸터 또는 탐색을 제거하여 HTML을 정리한 다음 HTML을 마크다운으로 변환할 수 있습니다.
밀버스/질리즈용 Apify 통합을 사용하면 웹에서 벡터 데이터베이스로 데이터를 쉽게 업로드할 수 있습니다.
시작하기 전에
이 노트북을 실행하기 전에 다음이 준비되어 있는지 확인하세요:
Apify 계정 및 APIFY_API_TOKEN.
OpenAI 계정 및 OPENAI_API_KEY
질리즈 클라우드 계정 (밀버스의 완전 관리형 클라우드 서비스).
질리즈 데이터베이스 URI 및 토큰
설치 종속성
$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
Apify 및 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··········
밀버스/질리즈 URI, 토큰 및 컬렉션 이름 설정
클라이언트를 설정하려면 Milvus/Zilliz의 URI와 토큰이 필요합니다.
- 도커 또는 쿠버네티스에 Milvus 서버를 자체 배포한 경우, 서버 주소와 포트를 URI로 사용합니다(예:
http://localhost:19530
). Milvus에서 인증 기능을 활성화한 경우 토큰으로 "<사용자_이름>:<사용자_비밀번호>"를 사용하고, 그렇지 않으면 빈 문자열로 남겨둡니다. - 밀버스의 완전 관리형 클라우드 서비스인 질리즈 클라우드를 사용하는 경우, 질리즈 클라우드의 퍼블릭 엔드포인트와 API 키에 해당하는
uri
및token
을 조정합니다.
컬렉션이 미리 존재할 필요는 없습니다. 데이터가 데이터베이스에 업로드되면 자동으로 생성됩니다.
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··········
웹사이트 콘텐츠 크롤러를 사용하여 Milvus.io에서 텍스트 콘텐츠 스크랩하기
다음으로, 웹사이트 콘텐츠 크롤러를 Apify Python SDK와 함께 사용하겠습니다. 먼저 actor_id와 run_input을 정의한 다음 벡터 데이터베이스에 저장할 정보를 지정합니다.
actor_id="apify/website-content-crawler"
은 웹사이트 콘텐츠 크롤러의 식별자입니다. 크롤러의 동작은 run_input 매개변수를 통해 완전히 제어할 수 있습니다(자세한 내용은 입력 페이지 참조). 이 예에서는 자바스크립트 렌더링이 필요 없는 Milvus 문서를 크롤링하겠습니다. 따라서 crawlerType=cheerio
을 설정하고 startUrls
을 정의하며 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)
웹사이트 콘텐츠 크롤러는 maxCrawlPages
에 설정된 사전 정의된 제한에 도달할 때까지 사이트를 철저히 크롤링합니다. 스크랩된 데이터는 Apify 플랫폼의 Dataset
에 저장됩니다. 이 데이터에 액세스하고 분석하려면 다음을 사용할 수 있습니다. defaultDatasetId
dataset_id = actor_call["defaultDatasetId"]
dataset_id
'P9dLFfeJAljlePWnz'
다음 코드는 Apify Dataset
에서 스크랩된 데이터를 가져와 첫 번째 스크랩된 웹사이트를 표시합니다.
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.'
Milvus 데이터베이스에 데이터를 업로드하기 위해 Apify Milvus 통합을 사용합니다. 먼저 Milvus 데이터베이스에 대한 파라미터를 설정해야 합니다. 다음으로 데이터베이스에 저장할 필드(datasetFields
)를 선택합니다. 아래 예에서는 text
필드와 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",
}
이제 apify/milvus-integration
을 호출하여 데이터를 저장합니다.
actor_call = client.actor("apify/milvus-integration").call(
run_input=milvus_integration_inputs
)
이제 모든 스크랩된 데이터가 Milvus 데이터베이스에 저장되어 검색 및 질문에 답변할 준비가 되었습니다.
검색 및 LLM 생성 파이프라인
다음으로, Langchain을 사용하여 검색 증강 파이프라인을 정의하겠습니다. 파이프라인은 두 단계로 작동합니다:
- 벡터스토어(Milvus): Langchain은 쿼리 임베딩과 저장된 문서 임베딩을 일치시켜 Milvus에서 관련 문서를 검색합니다.
- LLM 응답: 검색된 문서는 LLM(예: GPT-4)이 정보에 입각한 답변을 생성할 수 있도록 컨텍스트를 제공합니다.
RAG 체인에 대한 자세한 내용은 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()
)
데이터베이스에 데이터가 있으면 질문을 시작할 수 있습니다.
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.'
결론
이 튜토리얼에서는 Apify를 사용하여 웹사이트 콘텐츠를 크롤링하고, 데이터를 Milvus 벡터 데이터베이스에 저장하고, 검색 증강 파이프라인을 사용하여 질문 답변 작업을 수행하는 방법을 보여드렸습니다. Apify의 웹 스크래핑 기능을 벡터 스토리지용 Milvus/Zilliz 및 언어 모델용 Langchain과 결합하면 매우 효과적인 정보 검색 시스템을 구축할 수 있습니다.
데이터베이스의 데이터 수집 및 업데이트를 개선하기 위해 Apify 통합은 체크섬에 따라 새 데이터 또는 수정된 데이터만 업데이트하는 증분 업데이트를 제공합니다. 또한 지정된 시간 내에 크롤링되지 않은 오래된 데이터를 자동으로 제거할 수 있습니다. 이러한 기능을 통해 벡터 데이터베이스를 최적화하고 검색 증강 파이프라인을 최소한의 수작업으로 효율적이고 최신 상태로 유지할 수 있습니다.
Apify-Milvus 통합에 대한 자세한 내용은 Apify Milvus 설명서 및 통합 README 파일을 참조하세요.