Código para o estudo de referência descrito nesta postagem do blog.
LancedB é um banco de dados vetorial de código aberto, incorporado e amigável para desenvolvedores. Alguns recursos importantes sobre o LancedB que o tornam extremamente valioso estão listados abaixo, entre muitos outros listados em seu repositório do GitHub.
O objetivo deste repositório é demonstrar os recursos de pesquisa de texto completo e vetorial do LancedB por meio de uma referência de ponta a ponta, na qual estudamos cuidadosamente os resultados da consulta e a taxa de transferência.
O conjunto de dados usado para esta demonstração é o conjunto de dados de revisões de vinhos da Kaggle, contendo ~ 130k reviews em vinhos junto com outros metadados. O conjunto de dados é convertido em um arquivo zip, e o código para isso, bem como os dados ZIP, são fornecidos aqui para referência.
Estudando o desempenho de qualquer ferramenta isoladamente é um desafio; portanto, para fins de comparação, um fluxo de trabalho Elasticsearch é fornecido neste repositório. O Elasticsearch é um popular mecanismo de pesquisa de texto completo e vetorial baseado em Lucene, cujo uso é regularmente justificado para texto completo (e atualmente, a pesquisa vetorial), portanto, isso o torna uma ferramenta significativa para comparar o LancedB.
Instale as dependências no ambiente virtual via requirements.txt .
# Setup the environment for the first time
python -m venv .venv # python -> python 3.11+
# Activate the environment (for subsequent runs)
source .venv/bin/activate
python -m pip install -r requirements.txtObservação
BAAI/bge-small-en-v1.5 )| Caso | Elasticsearch (QPS) | Lancedb (QPS) |
|---|---|---|
| FTS: Serial | 399.8 | 468.9 |
| FTS: Concorrente | 1539.0 | 528.9 |
| Pesquisa de vetor: serial | 11.9 | 54.0 |
| Pesquisa vetorial: simultânea | 50.7 | 71.6 |
A referência serial mostrada abaixo envolve consultas em execução sequencial em uma sincronização para loop no Python. Isso não é representativo de um caso de uso realista na produção, mas é útil para entender o desempenho dos mecanismos de pesquisa subjacentes em cada caso (Lucene for Elasticsearch e Tantivy for LancedB).
Mais detalhes sobre isso serão discutidos em uma postagem no blog.
| Perguntas | Elasticsearch (SEC) | Elasticsearch (QPS) | Lancedb (seg) | Lancedb (QPS) |
|---|---|---|---|---|
| 10 | 0,0516 | 193.8 | 0,0518 | 193.0 |
| 100 | 0,2589 | 386.3 | 0,2383 | 419.7 |
| 1000 | 2.5748 | 388.6 | 2.1759 | 459.3 |
| 10000 | 25.0318 | 399.8 | 21.3196 | 468.9 |
| Perguntas | Elasticsearch (SEC) | Elasticsearch (QPS) | Lancedb (seg) | Lancedb (QPS) |
|---|---|---|---|---|
| 10 | 0.8087 | 12.4 | 0,2158 | 46.3 |
| 100 | 7.6020 | 13.1 | 1.6803 | 59.5 |
| 1000 | 84.0086 | 11.9 | 16.7948 | 59.5 |
| 10000 | 842.9494 | 11.9 | 185.0582 | 54.0 |
O benchmark simultâneo foi projetado para replicar um caso de uso realista para o LancedB ou Elasticsearch - onde várias consultas chegam ao mesmo tempo e a API REST no topo do banco de dados precisa lidar com solicitações assíncronas.
Observação
multiprocessing do Python em 4 threads de trabalhadores (um número maior de threads resultou em desempenho mais lento). | Perguntas | Elasticsearch (SEC) | Elasticsearch (QPS) | Lancedb (seg) | Lancedb (QPS) |
|---|---|---|---|---|
| 10 | 0,0350 | 285.7 | 0,0284 | 351.4 |
| 100 | 0,1243 | 804.1 | 0,2049 | 487.8 |
| 1000 | 0,6972 | 1434.5 | 1.8980 | 526.8 |
| 10000 | 6.4948 | 1539.0 | 18.9136 | 528.9 |
| Perguntas | Elasticsearch (SEC) | Elasticsearch (QPS) | Lancedb, 4 threads (s) | Lancedb, 4 threads (QPs) |
|---|---|---|---|---|
| 10 | 0,2896 | 34.5 | 0,1409 | 71.0 |
| 100 | 2.5275 | 39.6 | 1.3367 | 74.8 |
| 1000 | 20.4268 | 48.9 | 13.3158 | 75.1 |
| 10000 | 197.2314 | 50.7 | 139.6330 | 71.6 |