Affine es una biblioteca de Python para proporcionar una interfaz uniforme y estructurada para varias bases de datos de vectores de respaldo y las bibliotecas vecinas más cercanas. Permite objetos simples tipo dataclass para describir colecciones junto con una sintaxis de consulta de alto nivel para realizar una búsqueda de vectores filtrados.
Para bases de datos de vectores, actualmente es compatible:
Para el modo local, son compatibles con las siguientes bibliotecas vecinas más cercanas:
Nota: Este proyecto es muy similar a VectordB-anm, que parece no mantenerse ya no se mantiene.
pip install affine-vectordb
# or `pip install "affine-vectordb[qdrant]"` for qdrant support
# `pip install "affine-vectordb[weaviate]"` for weaviate support
# `pip install "affine-vectordb[pinecone]"` for pinecone support from affine import Collection , Vector , Filter , Query
# Define a collection
class MyCollection ( Collection ):
vec : Vector [ 3 ] # declare a 3-dimensional vector
# support for additional fields for filtering
a : int
b : str
db = LocalEngine ()
# Insert vectors
db . insert ( MyCollection ( vec = [ 0.1 , 0.0 , - 0.5 ], a = 1 , b = "foo" ))
db . insert ( MyCollection ( vec = [ 1.3 , 2.1 , 3.6 ], a = 2 , b = "bar" ))
db . insert ( MyCollection ( vec = [ - 0.1 , 0.2 , 0.3 ], a = 3 , b = "foo" ))
# Query vectors
result : list [ MyCollection ] = (
db . query ( MyCollection )
. filter ( MyCollection . b == "foo" )
. similarity ([ 2.8 , 1.8 , - 4.5 ])
. limit ( 1 )
) Una noción fundamental de Affine son las clases Engine . Todas estas clases se ajustan a la misma API para la intercambio (con la excepción de algunas restricciones específicas del motor que se mencionan a continuación). Hay dos tipos generales de motores
LocalEngine : Esto hace una búsqueda de vecinos más cercanos en la máquina de ejecución y admite una variedad de bibliotecas para la investigación de vecinos más cercanos (estos se denominan backend del motor local).
Motores de base de datos vectoriales: estos son motores que se conectan a un servicio de base de datos vectorial, como Qdrant, Weaviate o Pinecone.
Las bases de datos vectoriales compatibles actualmente son:
| Base de datos | Clase | Argumentos constructores | Notas |
|---|---|---|---|
| Qdrant | affine.engine.QdrantEngine | host: str para usarport: int Port para usar | - |
| Tejido | affine.engine.WeaviateEngine | host: str para usarport: int Port para usar | - |
| Piña | affine.engine.PineconeEngine | api_key: Union[str, None] Pinecone API Clave. Si no se proporciona, se leerá desde la variable de entorno Pinecone_api_Key.spec: Union[ServerlessSpec, PodSpec, None] el objeto Podspec o ServerlessSpec. Si no se proporciona, se creará un ServerlessSpec a partir de las variables de entorno Pinecone_Cloud y Pinecone_region. | El motor Pinecone tiene la restricción de que cada colección debe contener exactamente un atributo vectorial. |
La clase LocalEngine proporciona una interfaz para realizar la búsqueda de vecinos más cercanos en la máquina de ejecución, lo que respalda una variedad de bibliotecas para la investigación de vecinos más cercanos. Cuál es especificado por el argumento backend al constructor. Por ejemplo, para usar annoy :
from affine . engine . local import LocalEngine , AnnoyBackend
db = LocalEngine ( backend = AnnoyBackend ( n_tress = 10 ))Las opciones y la configuración para los diversos backends compatibles son las siguientes:
| Biblioteca | Clase | Argumentos constructores | Notas |
|---|---|---|---|
| ingenuo/numpy | affine.engine.local.NumPyBackend | - | - |
| scikit-learn kdtree | affine.engine.local.KDTreeBackend | Argumentos de palabras clave que se transmiten directamente a sklearn.neighbors.KDTree | - |
| enojarse | affine.engine.local.AnnoyBackend | n_trees: int número de árboles para usarn_jobs: int predeterminado a -1 | - |
| Faiss | affine.engine.local.FAISSBackend | index_factory_str: str | - |
| Pynndescente | affine.engine.local.PyNNDescentBackend | Argumentos de palabras clave que se transmiten directamente a pynndescent.NNDescent | - |