Búsqueda de vector de pila completa creada para artículos de código abierto JSTOR - ¡Busque por significado, no palabras clave!
Backend hecho con una base de datos Vector Pinecone, Huggingface/Transformers para incrustaciones y una API de FastAPI con dos puntos finales para hacer consultas con o sin filtros de metadatos. Frontend hecho con react.js
Este proyecto está destinado a ser utilizado con conjuntos de datos locales construidos a partir del socio oficial de datos de JSTOR, Constellate, en formato JSONL a partir de la opción completa de descarga de datos.
Actualmente, los títulos y subtítulos de los artículos se combinan e integran, y se mide una similitud semántica de la consulta a estos títulos y subtítulos integrados. La información más detallada sobre los artículos se devuelve como parte de los metadatos.
A través de la API y la aplicación web frontend, se puede pasar el número de resultados K deseado, y los filtros como la fecha y el recuento de páginas también se pueden aprobar, en forma de un diccionario de filtro utilizando el lenguaje de consulta de metadatos pinecone.
A través de la API, el diccionario de filtros de metadatos debe reflejar directamente el formato de diccionario que se puede pasar a Pinecone, aunque la aplicación web se encargará de agregar las claves y el usuario puede ingresar solo los valores en un formulario.
Para configurarse con Python y las dependencias para ejecutar este proyecto:
$ 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>'
Para agregar datos a su índice de pinecone:
Esto debería incrustar y aumentar todos los elementos en el conjunto de datos en su índice Pinecone. Tenga en cuenta que esto se suma al índice actual, por lo que si desea que solo los nuevos datos estén dentro del índice, debe eliminar el índice primero que se puede hacer con el método ._delete_index () de la clase DBClient dentro de este repositorio.
Desde la carpeta /backend, la API se puede ejecutar por cualquiera:
$ uvicorn main:app que no actualiza la API con ningún cambio de desarrollo, pero se puede cerrar fácilmente con un CTRL + C en el terminal$ uvicorn main:app --reload que actualizará la API con cualquier cambio de desarrollo, pero no se cerrará con CTRL + C La API tiene dos puntos finales, uno para una búsqueda simple de consulta y otra para una búsqueda con filtros de consulta más metadatos. Sin embargo, la forma en que se procesan los filtros significa que el punto final filtrado funcionará con un dict vacío y, por lo tanto, es el único punto final llamado desde la aplicación web.
GET /api/v1/query/{query_string}/{top_n}
Toma dos parámetros de ruta: - query_string (tipo de datos: cadena) - La consulta de búsqueda principal que debe ser semánticamente similar a los resultados que el usuario desea - top_n (tipo de datos: entero) - el número de coincidencias para devolver
POST /api/v1/filter-query/{query_string}/{top_n}
Toma los mismos dos parámetros de ruta: - Query_String (Tipo de datos: String) - La consulta de búsqueda principal que debe ser semánticamente similar a los resultados que el usuario desea - top_n (tipo de datos: entero) - el número de coincidencias para devolver
Más un dict de filtro en el cuerpo de solicitud, por ejemplo:
{
"document_type" : { "$eq" : " document " },
"word_count" : { "$gte" : 2000 }
}Ambos puntos finales devuelven el mismo tipo de respuesta, con los resultados principales como una matriz dentro de la clave de 'coincidencias', por ejemplo:
{
"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" : " "
}Una vez que se configura el backend y la API se está ejecutando, debería poder usar la aplicación web para interactuar con la API y buscar más fácilmente. Para hacer esto:
$ npm install para instalar dependencias$ npm start a iniciar la aplicación web localmente