Recherche vectorielle complète construite pour les articles open source JSTOR - Recherche par sens, pas les mots clés!
Backend fait avec une base de données vectorielle de Pinecone, des étreintes / transformateurs pour les incorporations et une API FastAPI avec deux points de terminaison pour faire des requêtes avec ou sans filtres de métadonnées. Frontend fait avec react.js
Ce projet est destiné à être utilisé avec des ensembles de données locaux construits à partir du partenaire de données officiel de JSTOR Constellate, au format JSONL à partir de l'option complète de téléchargement de données.
Actuellement, les titres et les sous-titres d'articles sont combinés et intégrés, et une similitude sémantique est mesurée de la requête à ces titres et sous-titres intégrés. Des informations plus détaillées sur les articles sont retournées dans le cadre des métadonnées.
Grâce à l'API et à l'application Web Frontend, le nombre supérieur de résultats souhaité peut être passé, et des filtres tels que la date et le nombre de pages peuvent également être passés, sous la forme d'un dictionnaire de filtre à l'aide du langage de requête de métadonnées PineCone.
Grâce à l'API, le dictionnaire des filtres de métadonnées doit refléter directement le format de dictionnaire qui peut être transmis à PineCone, bien que l'application Web gère l'ajout des touches et l'utilisateur peut saisir uniquement les valeurs dans un formulaire.
Pour être configuré avec Python et les dépendances pour exécuter ce projet:
$ python -m venv <evironment_name>$ <evironment_name>Scriptsactivate.bat$ pip install -r requirements.txt$ python <filename>.py PINECONE_API_KEY='<YOUR API KEY>'
PINECONE_ENV='<YOUR ENVIRONMENT>'
Pour ajouter des données à votre index de pince:
Cela devrait intégrer et mettre le service de tous les éléments de l'ensemble de données dans votre index de pignon. Remarque, cela s'ajoute à l'index actuel, donc si vous souhaitez que les nouvelles données ne soient dans l'index, vous devez d'abord supprimer l'index qui peut être fait avec la méthode ._delete_index () de la classe DBClient dans ce référentiel.
Dans le dossier / backend, l'API peut être exécutée par:
$ uvicorn main:app qui ne metra pas à jour l'API avec aucune modification de développement, mais peut être fermée facilement avec un CTRL + C dans le terminal$ uvicorn main:app --reload qui mettra à jour l'API avec les modifications de développement, mais ne s'arrêtera pas avec Ctrl + C L'API a deux points de terminaison, un pour une simple recherche de requête uniquement, et une pour une recherche avec des filtres de métadonnées Query Plus. Cependant, la façon dont les filtres sont traités signifie que le point de terminaison filtré fonctionnera avec un dict vide, et est donc le seul point de terminaison appelé à partir de l'application Web.
GET /api/v1/query/{query_string}/{top_n}
Prend deux paramètres de chemin: - Query_String (Type de données: chaîne) - La requête de recherche principale qui devrait être sémantiquement similaire aux résultats que l'utilisateur souhaite - top_n (type de données: entier) - le nombre de correspondances à retourner
POST /api/v1/filter-query/{query_string}/{top_n}
Prend les deux mêmes paramètres de chemin: - Query_String (Type de données: chaîne) - La requête de recherche principale qui devrait être sémantiquement similaire aux résultats que l'utilisateur souhaite - top_n (type de données: entier) - le nombre de correspondances à retourner
Plus un dict de filtre dans le corps de la demande, par exemple:
{
"document_type" : { "$eq" : " document " },
"word_count" : { "$gte" : 2000 }
}Les deux points de terminaison renvoient le même type de réponse, avec des résultats principaux comme un tableau dans la touche «correspondant», par exemple:
{
"matches" : [
{
"id" : " 123-abc-321 " ,
"score" : 18.792 ,
"values" : [],
"metadata" : {
"categories" : [
" Language & Literature " ,
" Humanities "
],
"creator" : [
" A. Creator "
],
"date_published" : " 2020/04/01 " ,
"document_sub_type" : " " ,
"document_type" : " document " ,
"issue_number" : " 1 " ,
"language" : [
" eng "
],
"page_count" : 10.0 ,
"parent_publication" : " A publication " ,
"publisher" : " A publisher " ,
"sub_title" : " " ,
"title" : " An example " ,
"url" : " http://www.jstor.org/stable/1234 " ,
"volume_number" : " 2123 " ,
"word_count" : 123.0
}
}
],
"namespace" : " "
}Une fois le backend configuré et que l'API est en cours d'exécution, vous devriez pouvoir utiliser l'application Web pour interagir avec l'API et rechercher plus facilement. Pour faire ceci:
$ npm install pour installer les dépendances$ npm start pour démarrer l'application Web localement