
Le nom est un peu une blague (bien qu'un mauvais mauvais). Cette application a résumé ce qui a été mis sur l'Arxiv, en quelque sorte une histoire récente de la littérature si vous voulez. Thucydide, étant l'un des premiers historiens de Rigorus de la culture occidentale, semblait s'adapter. Cependant, Thucydide a vécu il y a longtemps il y a longtemps, il serait donc extrêmement ancien et probablement physiquement incompatible de résumer la littérature scolaire moderne. Methusela était célèbre très vieux ...
La blague est étirée et la métaphore est pauvre; Cependant, ce que vous ne pouvez pas dire, c'est que ce n'est pas un nom unique.
Une grande partie de l'installation est gérée par le dockerfile. Cependant, en plus de Docker, vous aurez besoin
1) milvis
2) postgresql
3) GPT-Retrival-API
Notez que vous devrez modifier le GPT-Retrival-API Milvus Milvus Datastore pour inclure le Document-ID de champ. Cela nécessite quelques petites modifications pour les fichiers source pour cela. Voir le bas de la lecture pour plus de détails.
Placez les informations de configuration pour celles-ci dans le fichier config.py avant de créer le conteneur Docker. Une fois celles-ci, vous pouvez exécuter les commandes suivantes pour construire et déployer Methuselan Thucydides
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 est une chaîne aléatoire que vous attribuez en tant que variable environnementale. Cela vous permet d'enregistrer un nouvel utilisateur pour la première fois lorsque vous démarrez. Cela vous permet également de permettre aux autres de créer leurs propres comptes. Tant qu'ils ont le secret. Ne partagez pas cela.
Le site Web sera accessible à 0.0.0.0:5516 (accessible chez LocalHost: 5516)
Configurez les bases de données et le plugin de récupération de la même manière que vous auriez pour l'installation de Docker. Alors
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.pyCela exécutera un serveur en mode développement à 0.0.0.0:5515 (accessible chez localhost: 5515)
Dans PostgreSQL, faites une données appelée Arxivsummary. Chargez le schéma à partir du fichier ./Postgres-schema.sql dans cette base de données.
Je suis astronome, pas chercheur en sécurité ou même ingénieur logiciel. Il s'agit d'un projet de passe-temps sur lequel je travaille et j'aimerais avoir au moins une sécurité un peu correcte. Cependant, ne vous déployez pas dans un environnement de fiducie bas car je ne suis pas disposé à garantir que je suis les meilleures pratiques de sécurité.
Lorsque vous ouvrez MT, vous n'aurez pas de compte d'utilisateur. Vous aurez la possibilité d'en faire un. Fournissez un nom d'utilisateur, un mot de passe, un e-mail et un secret (la variable environnementale MT_NEW_USER_SECRET). Lorsque vous créez cet utilisateur, le code back-end vérifiera si des utilisateurs existent dans la base de données et sinon, cela fera de cet utilisateur un administrateur (peut créer de nouveaux utilisateurs et de nouveaux utilisateurs d'administration de soi. Vous pouvez maintenant vous connecter comme cet utilisateur. Le bouton Créer un utilisateur restera avec les mêmes fonctionnalités; Sauf que tous les utilisateurs ultérieurs qu'il crée n'aura pas de privilèges d'administration.
L'utilisation de base devrait être explicite. L'idée est que le site Web servi fournit un bref résumé de chaque article publié sur l'ARXIV la veille (ou le week-end / vendredi). Ces résumés sont générés à l'aide de GPT-3.5-Tubo et le résumé de l'article comme indiqué sur arXIV. L'interface vous montrera par défaut tous les articles; Cependant, les filtres de catégorie sont indiqués dans une barre latérale.
Un comportement plus complexe est activé via la boîte de discussion associée à chaque article. Cette boîte de discussion est connectée à GPT-3.5-Turbo et à une base de données vectorielle stockant toutes les informations actuellement mises en cache sur le document (en utilisant le modèle Openai-Textedding-A002). Lorsque vous posez une question, les informations mises en cache les plus pertinentes sur ce document sont transmises au modèle GPT ainsi que la question et sa réponse est imprimée à l'écran. Parce que par défaut, seul le résumé et le titre sont mis en cache, les réponses que GPT peut donner sont limitées. Cependant, si vous cliquez sur le bouton "Résumé uniquement" et attendez quelques secondes, vous verrez qu'il se transforme en "mode de texte complet" et n'est plus cliquable. Dans les coulisses, le PDF complet de ce document a été téléchargé et analysé dans le texte. Cela est ensuite intégré à la même base de données vectorielle. Maintenant, lorsque vous posez des questions, le modèle GPT a beaucoup plus de contexte pour y répondre. Étant donné que le texte intégral est stocké dans la base de données après que quiconque clique sur le bouton "Résumé uniquement" une fois, il sera toujours grisé à l'avenir, car cette boîte de chat sera toujours par défaut à l'ensemble de l'ensemble du papier.
Certaines fonctionnalités sont destinées à l'interface programmatique et non à l'interface utilisateur (en particulier à résumer automatiquement tous les derniers articles). Pour cela, vous aurez besoin d'une clé API. Seuls les utilisateurs d'administration peuvent générer des clés d'API. Si vous êtes un administrateur, tout ce que vous avez besoin pour obtenir une touche API est cliquez sur votre nom d'utilisateur> Générer la touche API> Générer. La clé comprend 2 parties, séparées par un ":". Le premier est le UUID clé (utilisé pour la recherche rapide dans le tableau des clés) et le second est le jeton de 16 octet de texte brut. Du côté du serveur, ce jeton a été haché et salé avant d'être stocké.
Assurez-vous d'écrire cette clé car elle n'est stockée nulle part et ne peut donc pas être récupérée après avoir fermé le dialogue.
J'ai testé ce fonctionnement derrière un proxy inverse Nginx. C'est assez simple et aucune configuration spéciale n'était nécessaire.
Quelques captures d'écran de l'interface Web au 18 avril 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.
Configuration de base de Crontab pour dire au serveur de récupérer les derniers articles chaque jour à 5 h. Cela suppose que votre serveur s'exécute sur https://example.com
0 5 * * * curl -v https://example.com/api/fetch/latestCela va automatiquement récupérer les papiers; Cependant, il ne les transmettra pas à GPT pour le résumé. Un autre appel API peut être prévu pour cela:
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
Modifiez d'abord le fichier dans Datastore / Providers appelé milvus_datastore.py pour modifier la liste schéma_v1 en ce qui suit:
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 ),
"" ,
),
]Modifiez ensuite les modèles de fichiers / modèles.py avec les classes mises à jour suivantes (si je n'ai pas répertorié une classe ici, laissez-la la même chose).
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