
El nombre es un poco broma (aunque sea extremadamente malo). Esta aplicación resumió lo que se ha puesto en el ARXIV, algo así como una historia reciente de la literatura si lo desea. Tucídides, siendo uno de los primeros historiadores de rigor en la cultura occidental, parecía encajar. Sin embargo, Tucídides vivió hace mucho tiempo, por lo que sería un extremo viejo y probablemente físicamente incapaz de resumir la literatura académica moderna. Matusela era famosa muy vieja ...
La broma se estira y la metáfora es pobre; Sin embargo, lo que no puedes decir es que no es un nombre único.
Gran parte de la instalación es manejada por Dockerfile. Sin embargo, además de Docker necesitará
1) milvis
2) postgresql
3) GPT-Retrival-API
Tenga en cuenta que deberá modificar el almacén de datos GPT-Retrival-API Milvus para incluir el ID de documento de campo. Esto requiere algunas pequeñas modificaciones a los archivos de origen para eso. Vea la parte inferior del Readme para más detalles.
Coloque la información de configuración para estos en el archivo config.py antes de construir el contenedor Docker. Una vez que se configuran, puede ejecutar los siguientes comandos para construir e implementar tucídides de Matuselan
git clone [email protected]:tboudreaux/MethuselanThucydides.git
cd MethuselanThucydides
cp config.py.user config.py
vim config.py # Edit the file as needed
export OPENAI_API_KEY= < Your API KEY >
export BEARER_TOKEN= < Your Bearer Token >
export DATASTORE= " milvus "
docker build -t mt:v0.5 .
docker run -p 5516:5000 -d --restart always -e " BEARER_TOKEN= $BEARER_TOKEN " -e " OPENAI_API_KEY= $OPENAI_API_KEY " -e " DATASTORE= $DATASTORE " -e " MT_NEW_USER_SECRET= $MT_NEW_USER_SECRET " -e " MT_DB_NAME=databaseName " -e " MT_DB_HOST=host " -e " MT_DB_PORT=port " -e " MT_DB_USER=dbUsername " -e " MT_DB_PASSWORD=dbPassword " --name MethuselanThucydides mt:v0.5Mt_new_user_secret es una cadena aleatoria que asigna como una variable Enviromental. Esto le permite registrar un nuevo usuario por primera vez cuando se inicia. También le permite permitir que otros hagan sus propias cuentas. Mientras tengan el secreto. No compartas esto.
Se puede acceder al sitio web a 0.0.0.0:5516 (accesible en Localhost: 5516)
Configurar las bases de datos y el complemento de recuperación de la misma manera que tendría para la instalación de Docker. Entonces
git clone [email protected]:tboudreaux/MethuselanThucydides.git
cd MethuselanThucydides
pip install -r requirments.txt
cp config.py.user config.py
vim config.py # Edit the file as needed
export OPENAI_API_KEY= < Your API KEY >
export BEARER_TOKEN= < Your Bearer Token >
export DATASTORE= " milvus "
python app.pyEsto ejecutará un servidor en modo de desarrollo a 0.0.0.0:5515 (accesible en localhost: 5515)
En PostgreSQL, haga un sés de datos llamado ARXIVSUMMARY. Cargue el esquema desde el archivo ./postgres-schema.sql en esa base de datos.
Soy astrónomo, no investigador de seguridad o incluso ingeniero de software. Este es un proyecto de pasatiempo en el que estoy trabajando y me gustaría tener al menos una seguridad algo bien. Sin embargo, no se despliegue en un entorno de baja confianza, ya que no estoy dispuesto a garantizar que estoy siguiendo las mejores prácticas de seguridad.
Cuando abra MT, no tendrá una cuenta de usuario. Se le dará la opción de hacer uno. Proporcione un nombre de usuario, contraseña, correo electrónico y secreto (la variable ambiental mt_new_user_secret). Cuando crea este usuario, el código de fondo verificará si existen usuarios en la base de datos y, si no, hará que ese usuario sea un administrador (puede crear nuevos usuarios y nuevos usuarios de administración). Ahora puede iniciar sesión como ese usuario. El botón Crear usuario permanecerá con la misma funcionalidad; Excepto que todos los usuarios posteriores que crea no tendrán privilegios de administración.
El uso básico debe explicarse por sí mismo. La idea es que el sitio web que sirvió proporciona un breve resumen de cada artículo publicado en el ARXIV el día anterior (o durante el fin de semana / viernes). Estos resúmenes se generan utilizando GPT-3.5-TUBO y el resumen del documento como se enumera en ARXIV. La interfaz de manera predeterminada le mostrará todos los documentos; Sin embargo, los filtros de categoría se muestran en una barra lateral.
El comportamiento más complejo se habilita a través del cuadro de chat asociado a cada papel. Este cuadro de chat está conectado a GPT-3.5-TURBO y una base de datos vectorial que almacena toda la información en caché actualmente sobre el documento (mediante el modelo OpenAI-Textembedding-ADA002). Cuando hace una pregunta, la información en caché más relevante sobre ese documento se pasa al modelo GPT junto con la pregunta y su respuesta se imprime en la pantalla. Porque, de manera predeterminada, solo el resumen y el título se almacenan en caché, las respuestas que GPT puede dar son limitadas. Sin embargo, si hace clic en el botón "solo modo abstracto" y espera unos segundos, verá que cambia al "modo de texto completo" y ya no se puede hacer clic. Detrás de escena, el PDF completo de ese documento ha sido descargado y analizado en texto. Eso se incrusta en la misma base de datos vectorial. Ahora, cuando hace preguntas, el modelo GPT tiene mucho más contexto para responderlas. Debido a que el texto completo se almacena en la base de datos después de que cualquiera haga clic en el botón "Solo en modo abstracto" una vez, siempre será gris en el futuro, ya que ese cuadro de chat siempre debe tener en cuenta todo el documento.
Alguna funcionalidad está destinada a la interfaz programática, no en la interfaz de usuario (específicamente que resume automáticamente los últimos documentos). Para esto necesitará una clave API. Solo los usuarios administrativos pueden generar claves API. Si es un administrador, todo lo que necesita hacer para obtener una clave API es hacer clic en su nombre de usuario> Generar la tecla API> Generar. La clave comprende 2 partes, separadas por un ":". El primero es el UUID clave (utilizado para la búsqueda rápida en la tabla de clave) y la segunda es el token de texto de texto de 16 bytes. En el lado del servidor, este token ha sido hash y salado antes de almacenarse.
Asegúrese de escribir esta llave, ya que no se almacena en ningún lugar y, por lo tanto, no se puede recuperar después de haber cerrado el diálogo.
He probado esto corriendo detrás de un proxy inverso de Nginx. Es bastante sencillo y no se necesitaba una configuración especial.
Algunas capturas de pantalla de la interfaz web a partir del 18 de abril de 2023 








1) Currently there is a bug in how I have implimented the arxiv API
such that it does not actually grab all the papers from a given day.
2) I need to rework the memory model for a single chat to make it more
robust
3) Papers are currently not pulled automatically every day. A call to the
/api/fetch/latest must be made manually to fetch the latest papers. This
will be added as an automated job to the docker container. However for now
this should be pretty easy to impliment in cron (See below)
4) I want to have chat memory stored server side for users once user
authentication is enabled.
Configuración básica de Crontab para decirle al servidor que obtenga los últimos documentos todos los días a las 5 a.m. Esto supone que su servidor se está ejecutando en https://example.com
0 5 * * * curl -v https://example.com/api/fetch/latestEsto buscará automáticamente papeles; Sin embargo, no los pasará a GPT para su resumen. Se puede programar otra llamada API para eso:
10 5 * * * curl -X GET https://example.com:5515/api/gpt/summarize/latest -H "x-access-key: YOUR-MT-API-KEY" - Adding vector based memory for conversations instances
- Better user management tools
- Improved UI
- Search functionality
- Home page with recommendations based on what papers users have interacted with
- Ability to follow references chains and bring additional papers down those chains in for further context (long term)
- config option to switch between gpt-3.5-turbo and gpt-4 (waiting till I get gpt-4 api access)
- Auto build the schema on first setup so that the schema does not have to be manually built
Primero modifique el archivo en DataStore/Providers llamado milvus_datastore.py para cambiar la lista Schema_V1 a lo siguiente:
SCHEMA_V1 = [
(
"pk" ,
FieldSchema ( name = "pk" , dtype = DataType . INT64 , is_primary = True , auto_id = True ),
Required ,
),
(
EMBEDDING_FIELD ,
FieldSchema ( name = EMBEDDING_FIELD , dtype = DataType . FLOAT_VECTOR , dim = OUTPUT_DIM ),
Required ,
),
(
"text" ,
FieldSchema ( name = "text" , dtype = DataType . VARCHAR , max_length = 65535 ),
Required ,
),
(
"document_id" ,
FieldSchema ( name = "document_id" , dtype = DataType . VARCHAR , max_length = 65535 ),
"" ,
),
(
"source_id" ,
FieldSchema ( name = "source_id" , dtype = DataType . VARCHAR , max_length = 65535 ),
"" ,
),
(
"id" ,
FieldSchema (
name = "id" ,
dtype = DataType . VARCHAR ,
max_length = 65535 ,
),
"" ,
),
(
"source" ,
FieldSchema ( name = "source" , dtype = DataType . VARCHAR , max_length = 65535 ),
"" ,
),
( "url" , FieldSchema ( name = "url" , dtype = DataType . VARCHAR , max_length = 65535 ), "" ),
( "created_at" , FieldSchema ( name = "created_at" , dtype = DataType . INT64 ), - 1 ),
(
"author" ,
FieldSchema ( name = "author" , dtype = DataType . VARCHAR , max_length = 65535 ),
"" ,
),
(
"subject" ,
FieldSchema ( name = "subject" , dtype = DataType . VARCHAR , max_length = 65535 ),
"" ,
),
(
"file" ,
FieldSchema ( name = "file" , dtype = DataType . VARCHAR , max_length = 65535 ),
"" ,
),
(
"source_url" ,
FieldSchema ( name = "source_url" , dtype = DataType . VARCHAR , max_length = 65535 ),
"" ,
),
]Luego modifique los archivos modelos/modelos.py con las siguientes clases actualizadas (si no he enumerado una clase aquí, deje que la deje igual).
class DocumentMetadata ( BaseModel ):
source : Optional [ str ] = None
source_id : Optional [ str ] = None
url : Optional [ str ] = None
created_at : Optional [ str ] = None
author : Optional [ str ] = None
subject : Optional [ str ] = None
file : Optional [ str ] = None
source_url : Optional [ str ] = None
class DocumentChunkMetadata ( DocumentMetadata ):
document_id : Optional [ str ] = None
class DocumentMetadataFilter ( BaseModel ):
document_id : Optional [ str ] = None
source : Optional [ Source ] = None
source_id : Optional [ str ] = None
author : Optional [ str ] = None
start_date : Optional [ str ] = None # any date string format
end_date : Optional [ str ] = None # any date string format
url : Optional [ str ] = None
subject : Optional [ str ] = None
file : Optional [ str ] = None
source_url : Optional [ str ] = None