Periplus в настоящее время находится в Альфе и не готов к производству. Проект находится в активной разработке и еще не рекомендуется для использования в производственных системах.
Periplus-это кэш векторной базы данных с открытым исходным кодом, созданный в библиотеке поиска вектора сходства Meta Faiss. Проект лучше всего можно рассматривать как «Redis для векторных баз данных». Он предназначен для хранения динамически обновленного подмножества большой векторной коллекции, полностью в памяти, когда обслуживает запросы, не взаимодействуя с любыми другими узлами во время запроса. Когда Periplus получает запрос, он сначала оценивает, имеет ли он соответствующую часть индекса в резиденции. Если это так, он разрешает запрос с соответствующим ответом. Если это не так, он возвращает кеш -промальку и оставляет Querier для извлечения данных из базы данных. Periplus не предназначен для функционирования изоляции. Вместо этого он предназначен для формирования модульного и гибкого уровня кэширования для отдельной векторной базы данных, которая образует уровень стойкости. Цель этого состоит в том, чтобы обеспечить более низкую задержку и легкое горизонтальное масштабирование для увеличения пропускной способности. Для более подробного описания вдохновения Periplus и того, как он работает, вы можете прочитать блог объявлений: Представление Periplus: новый подход к кэшированию векторной базы данных.
Periplus использует индекс инвертированного файла (ЭКО) в качестве основы для управления кэшем. Индексы инвентаризации файла разделяют векторное пространство на смежные ячейки, определяемые набором центроидных векторов, где каждая ячейка определяется как область, которая ближе к ее центре, чем к любому другому центру. Затем запросы разрешаются путем сначала вычисления расстояний от вектора запроса до набора центроидов, а затем поиска только ячейки, определяемые ближайшими центроидами N_PROBE (поиск гиперпараметра). Periplus использует это, сохраняя подмножество этих ячеек в резиденции в любой момент времени и разрешив только запросы, которые имеют отношение к этому подмножеству, отвергая те, которые не так, как кеш не пропускает. Periplus загружает и выдвигает целые ячейки ЭКО за раз, чтобы поддерживать целостность индекса и обеспечить эквивалентный отзыв (в кэшах) для стандартного индекса ЭКО. Клетки ЭКО загружаются путем запроса векторной базы данных через прокси со списком идентификаторов векторов, которые Периплас поддерживает для отслеживания того, какие векторы занимают какие ячейки. Эти операции могут быть вызваны пользователем, использующим команды загрузки , поиска и выселения . Для получения подробной информации см. Раздел команд Periplus ниже.
Periplus можно запустить в качестве контейнера Docker, либо его можно построить из источника и запустить в качестве исполняемого файла. В настоящее время официальных двоичных файлов не доступно. Запуск Periplus в качестве контейнера является рекомендуемым подходом, но оба являются жизнеспособными вариантами.
В настоящее время изображение Docker поддерживает только архитектуры AMD64. Это ограничение связано с базовым изображением, но в ближайшем будущем будет поддерживаться больше архитектуры. Есть 2 способа запуска Periplus в качестве контейнера: загрузите официальное изображение Docker с Dockerhub (рекомендуется) или создайте изображение самостоятельно. Первый шаг в любом случае - установить Docker, если вы еще этого не сделали. Инструкции по этому поводу можно найти здесь.
docker image pull qdl123/periplus:latest .docker run -p 3000:3000 qdl123/periplus:latest git clone https://github.com/QDL123/Periplus.gitcd <path-to-periplus-repo>/Periplusdocker build -t periplus-image .docker run -p 3000:3000 periplus-image .Periplus использует Cmake для своей системы сборки. Он ожидает, что все зависимости будут установлены предварительно скомпилированные двоичные файлы через Homebrew. Homebrew поддерживается MacOS, Ubuntu и WSL, если вы на Windows. Periplus был построен на MacOS/ARM64 и Ubuntu/AMD64. Все остальные операционные системы и комбинации архитектуры не проверены. Чтобы построить Periplus из источника, выполните следующие шаги:
brew install faiss curl cpr rapidjson libomp catch2 cmakegit clone https://github.com/QDL123/Periplus.gitcd <path-to-periplus-repo>/Peripluscmake -S . -B buildcmake --build build./build/periplus -p 3000 Любая система, использующая Periplus, будет состоять из 4 компонентов: векторная база данных, прокси базы данных, которая позволяет Periplus загружать данные из базы данных, экземпляр Periplus и клиентского приложения.

Пример архитектуры приложения с использованием Periplus.
Любая векторная база данных, которая позволяет работать в поисках данных уникальным идентификатором (практически все из них), будет работать. Periplus предназначен для того, чтобы быть наиболее полезным при работе с действительно большими векторными коллекциями (в миллиардах), где индекс должен жить в файловой системе, в отличие от оперативной памяти, хотя это не является требованием.
Цель прокси -сервера векторной базы данных состоит в том, чтобы обеспечить постоянный интерфейс для Periplus для взаимодействия с векторной базой данных. Прокси должен реализовать интерфейс REST, который принимает запросы POST в следующей форме:
URL: это гибко и может быть указано клиентом Periplus.
Заголовки: "Content-Type": "application/json
Тело:
{
"ids" : [ " id-1 " , " id-2 " , " id-3 " ]
}Ответ:
{
"results" : [
{
"id" : " String " ,
"embedding" : [ 0.1 , 0.2 , 0.3 ],
"document" : " String " ,
"metdata" : " String "
}
]
}Чтобы облегчить реализацию этой конечной точки, вы можете использовать пакет Periplus-Proxy Python, который использует Fastapi для настройки всего. Все, что нужно сделать, это реализовать следующую функцию и передать ее как аргумент:
async def fetch_ids(request: Query) -> QueryResult
Для получения подробной информации о том, как это сделать, вы можете проверить Periplus-Proxy Package Readme.md.
Следуйте инструкциям выше, чтобы запустить экземпляр Periplus.
Чтобы взаимодействовать с вашим экземпляром Periplus, используйте клиентскую библиотеку Periplus. В настоящее время поддерживается только Python. Для получения подробной информации о клиентской библиотеке вы можете просмотреть его readme.md.
from periplus_client import Periplus
# host, port
client = Periplus ( "localhost" , 13 )
# vector dimensionality, database proxy url, options: (nTotal)
await client . initialize ( d = d , db_url = url , options = { "nTotal" : 50000 })
training_data = [[ 0.43456 , ..., 0.38759 ], ...]
await client . train ( training_data )
ids = [ "0" , ..., "n" ]
embeddings = [[ 0.43456 , ..., 0.38759 ], ...]
await client . add ( ids = ids , embeddings = embeddings )
load_options = { "n_load" : 2 }
# query_vector, optional: options object
await client . load ([ embeddings [ 0 ]] load_options )
# k, query_vector
response = await client . search ( 5 , [ embeddings [ 0 ]])
print ( response )
'''
[ // Results for each of the n query vectors in xq
[ // K nearest neighbors to this corresponding index in the xq list
(
id="n",
embedding=[0.43456, ..., 0.38759],
document="",
metadata="{}"
),
...
],
...
]
'''
# query_vector
await client . evict ( embeddings [ 0 ])Мы приветствуем вклад в Periplus! Чтобы узнать, как начать, взгляните на руководство по взносу.
Этот проект лицензирован по лицензии MIT - для получения подробной информации см. Файл лицензии.