? Sifts est un package Python simple mais puissant pour gérer et interroger les collections de documents avec la prise en charge des bases de données SQLite et PostgreSQL.
Il est conçu pour gérer efficacement la recherche en texte complet et la recherche vectorielle, ce qui le rend idéal pour les applications qui impliquent une récupération de données de texte à grande échelle.
L'idée principale des tamis est de tirer parti des capacités de recherche intégrale intégrées dans SQLite et PostgreSQL et de les rendre disponibles via une API pythonique unifiée. Vous pouvez utiliser SQLite pour les petits projets ou le développement et passer trivialement à PostgreSQL pour mettre à l'échelle votre application.
Pour la recherche de vecteurs, la similitude du cosinus est calculée dans PostgreSQL via l'extension PGVector, tandis qu'avec SQLite, la similitude est calculée en mémoire.
Les tamis ne sont pas livrés avec un mode serveur car il est censé être une bibliothèque à importer par d'autres applications. La motivation originale pour son développement était de remplacer Whoosh en tant que backend de recherche dans Gramps Web, qui est basé sur Flask.
Vous pouvez installer des tamis via PIP:
pip install sifts import sifts
# by default, creates a new SQLite database in the working directory
collection = sifts . Collection ( name = "my_collection" )
# Add docs to the index. Can also update and delete.
collection . add (
documents = [ "Lorem ipsum dolor" , "sit amet" ],
metadatas = [{ "foo" : "bar" }, { "foo" : "baz" }], # otpional, can filter on these
ids = [ "doc1" , "doc2" ], # unique for each doc. Uses UUIDs if omitted
)
results = collection . query (
"Lorem" ,
# limit=2, # optionally limit the number of results
# where={"foo": "bar"}, # optional filter
# order_by="foo", # sort by metadata key (rather than rank)
)L'API est inspirée par le chroma.
Sifts prend en charge la syntaxe de recherche suivante:
and opérateuror opérateur* Wildcard (en SQLite, soutenu n'importe où dans le terme de recherche, dans PostgreSQL uniquement à la fin du terme de recherche)La syntaxe de recherche est la même quel que soit le backend.
Les tamis peuvent également être utilisés comme magasin vectoriel, utilisé pour les moteurs de recherche sémantique ou la génération auprès de la récupération (RAG) avec de grands modèles de langue (LLM).
Passez simplement l' embedding_function à l'usine Collection pour activer le stockage vectoriel et définir vector_search=True dans la méthode de requête. Par exemple, en utilisant la bibliothèque des transformateurs de phrase,
from sentence_transformers import SentenceTransformer
model = SentenceTransformer ( "intfloat/multilingual-e5-small" )
def embedding_function ( queries : list [ str ]):
return model . encode ( queries )
collection = sifts . Collection (
db_url = "sqlite:///vector_store.db" ,
name = "my_vector_store" ,
embedding_function = embedding_function
)
# Adding vector data to the collection
collection . add ([ "This is a test sentence." , "Another example query." ])
# Querying the collection with semantic search
results = collection . query ( "Find similar sentences." , vector_search = True ) Les collections PostgreSQL nécessitent l'installation et l'activation de l'extension pgvector .
Les documents peuvent être mis à jour ou supprimés à l'aide de leurs ID.
# Update a document
collection . update ( ids = [ "document_id" ], contents = [ "Updated content" ])
# Delete a document
collection . delete ( ids = [ "document_id" ])Les contributions sont les bienvenues! N'hésitez pas à créer un problème si vous rencontrez des problèmes ou si vous avez une suggestion d'amélioration, et mieux soumettre un RP avec cela!
Les tamis sont autorisés sous la licence du MIT. Voir le fichier de licence pour plus de détails.
Bonne tamisage!