Periplus目前在Alpha,尚未準備就緒。該項目正在積極開發中,並且不建議用於生產系統。
Periplus是建立在Meta的Vector相似性搜索庫Faiss上的開源內存矢量數據庫緩存。該項目最好被視為“ vector數據庫的重複”。它旨在將大型矢量集合的動態更新子集存儲在內存中,同時在查詢時,而無需在查詢時間與其他任何節點進行交互。當Periplus收到查詢時,它首先評估它是否具有索引居住的相關部分。如果確實如此,它將通過適當的響應解析查詢。如果沒有,它將返回緩存失誤,並讓Querier從數據庫中獲取數據。 Periplus並非設計用於隔離功能。取而代之的是,它旨在形成一個模塊化和靈活的緩存層,用於形成持久層的單獨矢量數據庫。這樣做的目的是使較低的延遲和易於水平縮放量表以增加吞吐量。有關Periplus背後的靈感及其工作方式的更詳細說明,您可以閱讀公告博客:介紹Periplus:矢量數據庫緩存的新方法。
Periplus使用倒文件索引(IVF)作為緩存管理的基礎。倒文件索引將矢量空間劃分為由一組質心向量定義的連續單元,其中每個單元被定義為接近其質心的區域,而不是其他任何質心。然後通過首先計算從查詢矢量到質心集的距離來解決查詢,然後僅搜索由N_probe (搜索超參數)最接近的質心定義的細胞。 Periplus通過在任何給定時間將這些單元的子集保留在居住中,而僅解決與該子集相關的查詢,同時拒絕與不像Cache失誤相關的居民,則利用了這一點。 Periplus一次載荷並驅逐整個IVF單元,以維持索引的完整性,並確保(在高速緩存命中)對標準IVF指數(在緩存命中)上進行等效召回。通過通過代理查詢矢量數據庫,其中periplus維護以跟踪哪些向量佔據了哪些細胞,從而加載了IVF單元。這些操作可以由用戶使用加載,搜索和驅逐命令來調用。有關詳細信息,請參見下面的“ Periplus命令”部分。
Periplus可以作為Docker容器運行,也可以從源構建並作為可執行文件運行。目前沒有官方二進製文件。推薦的方法是運行Periplus作為容器,但兩者都是可行的選擇。
當前,Docker映像僅支持AMD64架構。這種約束源於基本圖像,但在不久的將來將支持更多的架構。有兩種將Periplus作為容器運行的方法:從Dockerhub(推薦)下載官方Docker映像或自己構建圖像。在任何一種情況下,第一步都是安裝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進行其構建系統。它預計所有依賴性都將通過自製的二進製文件進行預編譯。如果您在Windows上,則由MacOS,Ubuntu和WSL支持Homebrew。 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的設計是在與真正的大型矢量集合(十億個尺度)合作時最有益的,該指數必須在文件系統上而不是RAM,儘管這不是必需的。
向量數據庫代理的目的是為Periplus提供與矢量數據庫通過的一致接口。代理必須實現一個REST接口,該接口接受以下表格的發布請求:
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軟件包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許可證獲得許可的 - 有關詳細信息,請參見許可證文件。