
Der Name ist ein bisschen ein Witz (wenn auch ein extremes schlechtes). Diese App hat zusammengefasst, was auf den Arxiv gestellt wurde, etwas von einer jüngsten Geschichte der Literatur, wenn Sie so wollen. Thukydides, der einer der frühesten Rigorushistoriker in der westlichen Kultur war, schienen zu passen. Thukydides lebte jedoch vor langer Zeit berühmt, so dass es extrem alte und wahrscheinlich körperlich unverzüglich die moderne akademische Literatur zusammenfasst. Methusela war berühmt sehr alt ....
Der Witz ist gedehnt und die Metapher ist arm; Was Sie jedoch nicht sagen können, ist, dass es kein einzigartiger Name ist.
Ein Großteil der Installation wird von der Dockerfile behandelt. Zusätzlich zu Docker benötigen Sie jedoch auch
1) milvis
2) postgresql
3) GPT-Retrival-API
Beachten Sie, dass Sie den GPT-API-Milvus-Datenspeicher so ändern müssen, dass das Felddokument-ID einbezieht. Dies erfordert einige kleine Änderungen an den Quelldateien dafür. Weitere Informationen finden Sie im unteren Rand des Readme.
Platzieren Sie die Konfigurationsinformationen für diese in der Datei config.py, bevor Sie den Docker -Container erstellen. Sobald dies eingerichtet ist, können Sie die folgenden Befehle ausführen, um Methuselan Thukydides zu erstellen und bereitzustellen
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 ist eine zufällige Zeichenfolge, die Sie als Umweltvariable zuweisen. Auf diese Weise können Sie zum ersten Mal einen neuen Benutzer registrieren, wenn Sie starten. Sie können auch anderen erlauben, ihre eigenen Konten zu erstellen. Solange sie das Geheimnis haben. Teile das nicht.
Die Website ist unter 0,0.0.0:5516 zugänglich (zugänglich bei Localhost: 5516)
Richten Sie die Datenbanken und das Abrufen von Plugin auf die gleiche Weise ein, die Sie für die Docker -Installation haben würden. Dann
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.pyDadurch wird ein Server im Entwicklungsmodus unter 0,0.0.0:5515 ausgeführt (zugänglich bei Localhost: 5515)
Machen Sie in PostgreSQL eine Datenbank namens Arxivsummary. Laden Sie das Schema aus der Datei ./Postgres-schema.sql in diese Datenbank.
Ich bin ein Astronom, kein Sicherheitsforscher oder sogar Software -Ingenieur. Dies ist ein Hobbyprojekt, an dem ich arbeite und das ich zumindest etwas in Ordnung habe. Geben Sie jedoch nicht in einem Umfeld mit niedrigem Vertrauen ein, da ich nicht bereit bin zu garantieren, dass ich die besten Sicherheitspraktiken befolge.
Wenn Sie MT öffnen, haben Sie kein Benutzerkonto. Sie erhalten die Möglichkeit, eine zu erstellen. Geben Sie einen Benutzernamen, ein Passwort, eine E -Mail und ein Geheimnis an (die Umgebungsvariable mt_new_user_secret). Wenn Sie diesen Benutzer erstellen, prüft der Back-End-Code, ob Benutzer in der Datenbank vorhanden sind. Wenn dies nicht der Fall ist, macht er diesen Benutzer zu einem Administrator (kann neue Benutzer und neue Administratorbenutzer selbst erstellen). Sie können sich jetzt als Benutzer anmelden. Die Schaltfläche "Benutzer erstellen" bleibt mit der gleichen Funktionalität. Abgesehen davon, dass alle nachfolgenden Benutzer, die es erstellt, keine Administratorrechte haben.
Grundlegende Nutzung sollte selbsterklärend sein. Die Idee ist, dass die servierte Website eine kurze Zusammenfassung jedes Papiers enthält, das am Vortag (oder über das Wochenende / Freitag) im Arxiv veröffentlicht wurde. Diese Zusammenfassungen werden mit GPT-3.5-Tubo und dem Zusammenfassung des Papiers erzeugt, wie auf ARXIV aufgeführt. Die Schnittstelle wird standardmäßig angezeigt, um alle Papiere anzuzeigen. Kategoriefilter werden jedoch in einer Seitenleiste angezeigt.
Komplexeres Verhalten wird über die Chatbox aktiviert, die jedem Papier zugeordnet ist. Diese Chatbox ist mit GPT-3,5-Turbo und einer Vektor-Datenbank verbunden, die alle derzeit zwischengespeicherten Informationen über das Papier speichert (unter Verwendung des OpenAi-Textembedding-ADA002-Modells). Wenn Sie eine Frage stellen, werden die relevantesten Zwischenspeicherinformationen zu diesem Papier zusammen mit der Frage an das GPT -Modell übergeben und seine Antwort auf den Bildschirm ausgedruckt. Da standardmäßig nur der Abstract und der Titel zwischengespeichert werden, sind die Antworten, die GPT geben kann, begrenzt. Wenn Sie jedoch auf die Schaltfläche "nur" abstrakter Modus "klicken und einige Sekunden warten, werden Sie feststellen, dass er sich in den" Volltextmodus "ändert und nicht mehr anklickbar ist. Hinter den Kulissen wurde das vollständige PDF dieses Papiers heruntergeladen und in Text analysiert. Das wird dann in die gleiche Vektor -Datenbank eingebettet. Wenn Sie nun Fragen stellen, hat das GPT -Modell viel mehr Kontext, um sie zu beantworten. Da der vollständige Text in der Datenbank gespeichert ist, nachdem jemand einmal auf die Schaltfläche "Zusammenfassung Modus" klickt, wird er in Zukunft immer ausgegraut, da dieses Chatbox immer standardmäßig das gesamte Papier berücksichtigt.
Eine gewisse Funktionalität ist für die programmatische UI -Schnittstelle bestimmt (speziell automatisch zusammenfasst die neuesten Artikel). Dafür benötigen Sie einen API -Schlüssel. Nur Admin -Benutzer können API -Schlüssel generieren. Wenn Sie ein Administrator sind, müssen Sie nur einen API -Schlüssel erstellen, um auf Ihren Benutzernamen> API -Taste zu generieren> Generieren Sie generieren. Der Schlüssel umfasst 2 Teile, getrennt durch ein ":". Der erste ist der Schlüssel UUID (verwendet für die schnelle Suche in der Schlüsseltabelle) und der zweite ist der einfache Text -16 -Byte -Token. Auf der Serverseite wurde dieses Token vor der gespeicherten Häutung gehasht und gesalzen.
Stellen Sie sicher, dass Sie diesen Schlüssel aufschreiben, da er nirgendwo gespeichert ist und daher nicht abgerufen werden kann, nachdem Sie den Dialog geschlossen haben.
Ich habe diesen Laufen hinter einem Nginx -Reverse -Proxy getestet. Es ist ziemlich einfach und es war keine spezielle Konfiguration erforderlich.
Einige Screenshots der Webschnittstelle zum 18. April 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.
Grundlegende Crontab -Konfiguration, um den Server jeden Tag um 5 Uhr morgens die neuesten Papiere abzurufen. Dies setzt voraus, dass Ihr Server unter https://example.com ausgeführt wird
0 5 * * * curl -v https://example.com/api/fetch/latestDies holt automatisch Papiere ab; Es wird sie jedoch nicht zur Zusammenfassung an GPT weitergeben. Ein weiterer API -Anruf kann dafür geplant werden:
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
Ändern Sie zuerst die Datei in DataStore/Anbietern, die als milvus_datastore.py bezeichnet werden, um die Liste der Schema_V1 in Folgendes zu ändern:
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 ),
"" ,
),
]Ändern Sie dann die Dateimodelle/models.py mit den folgenden aktualisierten Klassen (wenn ich hier keine Klasse aufgeführt habe, lassen Sie sie gleich).
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