Интеграция Milvus с WhyHow
В этом руководстве показано, как использовать whyhow.ai и Milvus Lite для выполнения поиска на основе правил.
Обзор
WhyHow - это платформа, которая предоставляет разработчикам строительные блоки, необходимые для организации, контекстуализации и надежного извлечения неструктурированных данных для выполнения сложных RAG. Пакет Rule-based Retrieval - это пакет Python, разработанный WhyHow, который позволяет людям создавать и управлять приложениями Retrieval Augmented Generation (RAG) с расширенными возможностями фильтрации.
Установка
Перед началом работы установите все необходимые пакеты python для последующего использования.
pip install --upgrade pymilvus, whyhow_rbr
Далее нам нужно инициализировать клиент Milvus, чтобы реализовать поиск на основе правил с помощью Milvus Lite.
from pymilvus import MilvusClient
# Milvus Lite local path
path="./milvus_demo.db" # random name for local milvus lite db path
# Initialize the ClientMilvus
milvus_client = ClientMilvus(path)
Вы также можете инициализировать клиента Milvus через Milvus Cloud
from pymilvus import MilvusClient
# Milvus Cloud credentials
YOUR_MILVUS_CLOUD_END_POINT = "YOUR_MILVUS_CLOUD_END_POINT"
YOUR_MILVUS_CLOUD_TOKEN = "YOUR_MILVUS_CLOUD_TOKEN"
# Initialize the ClientMilvus
milvus_client = ClientMilvus(
milvus_uri=YOUR_MILVUS_CLOUD_END_POINT,
milvus_token=YOUR_MILVUS_CLOUD_TOKEN,
)
Создание коллекции
Определение необходимых переменных
# Define collection name
COLLECTION_NAME="YOUR_COLLECTION_NAME" # take your own collection name
# Define vector dimension size
DIMENSION=1536 # decide by the model you use
Добавить схему
Прежде чем вставлять данные в базу данных Milvus Lite, нам нужно сначала определить поле данных, которое здесь называется схемой. С помощью создания объекта CollectionSchema
и добавления поля данных через add_field()
мы можем управлять типом данных и их характеристиками. Этот шаг является обязательным перед вставкой любых данных в Milvus.
schema = milvus_client.create_schema(auto_id=True) # Enable id matching
schema = milvus_client.add_field(schema=schema, field_name="id", datatype=DataType.INT64, is_primary=True)
schema = milvus_client.add_field(schema=schema, field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
Создание индекса
Для каждой схемы лучше иметь индекс, чтобы запросы были более эффективными. Чтобы создать индекс, нам сначала нужен объект index_params
, а затем мы добавляем данные индекса на этот объект IndexParams
.
# Start to indexing data field
index_params = milvus_client.prepare_index_params()
index_params = milvus_client.add_index(
index_params=index_params, # pass in index_params object
field_name="embedding",
index_type="AUTOINDEX", # use autoindex instead of other complex indexing method
metric_type="COSINE", # L2, COSINE, or IP
)
Этот метод является тонкой оберткой вокруг официальной реализации Milvus(официальная документация).
Создание коллекции
После определения всех полей данных и их индексации нам нужно создать коллекцию базы данных, чтобы мы могли быстро и точно получить доступ к нашим данным. Следует отметить, что мы инициализировали enable_dynamic_field
значением true, чтобы вы могли свободно загружать любые данные. Издержки заключаются в том, что запросы к данным могут быть неэффективными.
# Create Collection
milvus_client.create_collection(
collection_name=COLLECTION_NAME,
schema=schema,
index_params=index_params
)
Загрузка документов
После создания коллекции мы готовы наполнить ее документами. В whyhow_rbr
для этого используется метод upload_documents
из MilvusClient
. Он выполняет следующие действия под капотом:
- Предварительная обработка: Чтение и разбиение предоставленных PDF-файлов на фрагменты
- Встраивание: Встраивание всех фрагментов с помощью модели OpenAI
- Вставка: Загрузка в Milvus Lite как вложений, так и метаданных.
# get pdfs
pdfs = ["harry-potter.pdf", "game-of-thrones.pdf"] # replace to your pdfs path
# Uploading the PDF document
milvus_client.upload_documents(
collection_name=COLLECTION_NAME,
documents=pdfs
)
Ответ на вопрос
Теперь мы можем перейти к созданию дополненного поиска.
# Search data and implement RAG!
res = milvus_client.search(
question='What food does Harry Potter like to eat?',
collection_name=COLLECTION_NAME,
anns_field='embedding',
output_fields='text'
)
print(res['answer'])
print(res['matches'])
Правила
В предыдущем примере рассматривался каждый документ в нашем индексе. Однако иногда может быть полезно получить только документы, удовлетворяющие некоторым заданным условиям (например, filename=harry-potter.pdf
). В whyhow_rbr
через Milvus Lite это можно сделать с помощью настройки параметров поиска.
Правило может управлять следующими атрибутами метаданных
filename
имя файлаpage_numbers
список целых чисел, соответствующих номерам страниц (индексация 0)id
уникальный идентификатор чанка (это самый "экстремальный" фильтр).- Другие правила на основе булевых выражений
# RULES(search on book harry-potter on page 8):
PARTITION_NAME='harry-potter' # search on books
page_number='page_number == 8'
# first create a partitions to store the book and later search on this specific partition:
milvus_client.crate_partition(
collection_name=COLLECTION_NAME,
partition_name=PARTITION_NAME # separate base on your pdfs type
)
# search with rules
res = milvus_client.search(
question='Tell me about the greedy method',
collection_name=COLLECTION_NAME,
partition_names=PARTITION_NAME,
filter=page_number, # append any rules follow the Boolean Expression Rule
anns_field='embedding',
output_fields='text'
)
print(res['answer'])
print(res['matches'])
В этом примере мы сначала создаем раздел, в котором хранятся pdf-файлы, связанные с Гарри Поттером, и через поиск в этом разделе мы можем получить самую прямую информацию. Кроме того, мы применяем номера страниц в качестве фильтра, чтобы указать точную страницу, по которой мы хотим выполнить поиск. Помните, что параметр filer должен соответствовать правилу boolean.
Очистка
Наконец, после выполнения всех инструкций вы можете очистить базу данных, вызвав команду drop_collection()
.
# Clean up
milvus_client.drop_collection(
collection_name=COLLECTION_NAME
)