Генерация с дополненным извлечением: Создание веб-сайтов с помощью Apify и сохранение данных в Milvus для ответов на вопросы
В этом уроке рассказывается о том, как с помощью Apify's Website Content Crawler просматривать веб-сайты и сохранять данные в векторной базе Milvus/Zilliz, чтобы затем использовать их для ответов на вопросы.
Apify - это платформа для веб-скреппинга и извлечения данных, которая предлагает рынок приложений с более чем двумя тысячами готовых облачных инструментов, известных как Actors. Эти инструменты идеально подходят для таких случаев, как извлечение структурированных данных с сайтов электронной коммерции, социальных сетей, поисковых систем, онлайн-карт и т. д.
Например, инструмент Website Content Crawler Actor может глубоко просмотреть веб-сайты, очистить их HTML, удалив модальные окна cookie, нижний колонтитул или навигацию, а затем преобразовать HTML в Markdown.
Интеграция Apify для Milvus/Zilliz позволяет легко загружать данные из Интернета в векторную базу данных.
Прежде чем начать
Прежде чем приступить к работе с этим блокнотом, убедитесь, что у вас есть следующее:
учетная запись Apify и APIFY_API_TOKEN.
учетная запись OpenAI и OPENAI_API_KEY.
Учетная запись Zilliz Cloud (полностью управляемый облачный сервис для Milvus).
URI базы данных Zilliz и токен
Установите зависимости
$ 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/Zilliz.
- Если вы самостоятельно развернули сервер Milvus на Docker или Kubernetes, используйте адрес и порт сервера в качестве uri, например,
http://localhost:19530
. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае оставьте токен пустой строкой. - Если вы используете Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте
uri
иtoken
, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
Обратите внимание, что коллекция не обязательно должна существовать заранее. Она будет создана автоматически при загрузке данных в базу.
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··········
Использование Website Content Crawler для сканирования текстового контента с Milvus.io
Далее мы будем использовать Website Content Crawler с Apify Python SDK. Начнем с определения actor_id и run_input, а затем укажем информацию, которая будет сохранена в векторной базе данных.
actor_id="apify/website-content-crawler"
- это идентификатор для Website Content Crawler. Поведение краулера можно полностью контролировать с помощью параметров run_input (подробнее см. на странице ввода ). В этом примере мы будем просматривать документацию Milvus, которая не требует отрисовки JavaScript. Поэтому мы зададим 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)
Website Content Crawler будет тщательно просматривать сайт, пока не достигнет заданного предела, установленного в maxCrawlPages
. Собранные данные будут храниться в Dataset
на платформе Apify. Чтобы получить доступ к этим данным и проанализировать их, вы можете воспользоваться функцией 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 интеграции.