
Namanya sedikit lelucon (walaupun ekstrem yang buruk). Aplikasi ini merangkum apa yang telah diletakkan di Arxiv, agak dari sejarah literatur baru -baru ini jika Anda mau. Thucydides, menjadi salah satu sejarawan Rigorus paling awal dalam budaya Barat, tampaknya cocok. Namun, Thucydides yang terkenal sudah lama hidup sehingga akan menjadi Extremley tua dan kemungkinan tidak dapat meringkas literatur akademik modern. Methusela terkenal sangat tua ....
Leluconnya diregangkan dan metafora buruk; Namun, yang tidak bisa Anda katakan adalah bahwa itu bukan nama yang unik.
Sebagian besar pemasangan ditangani oleh Dockerfile. Namun, selain Docker yang Anda perlukan
1) milvis
2) postgresql
3) GPT-Retrival-API
Perhatikan bahwa Anda harus memodifikasi datastore GPT-Retrival-API Milvus untuk memasukkan dokumen-id lapangan. Ini membutuhkan beberapa modifikasi kecil pada file sumber untuk itu. Lihat bagian bawah readme untuk detailnya.
Tempatkan informasi konfigurasi untuk ini di file config.py sebelum membangun wadah Docker. Setelah diatur, Anda dapat menjalankan perintah berikut untuk membangun dan menggunakan 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 adalah beberapa string acak yang Anda tetapkan sebagai variabel lingkungan. Ini memungkinkan Anda untuk mendaftarkan pengguna baru untuk pertama kalinya saat Anda boot. Ini juga memungkinkan Anda mengizinkan orang lain untuk membuat akun mereka sendiri. Selama mereka memiliki rahasia. Jangan membagikan ini.
Situs web akan dapat diakses di 0.0.0.0:5516 (dapat diakses di LocalHost: 5516)
Siapkan database dan plugin pengambilan dengan cara yang sama seperti yang akan Anda miliki untuk instalasi Docker. Kemudian
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.pyIni akan menjalankan server dalam mode pengembangan di 0.0.0.0:5515 (dapat diakses di LocalHost: 5515)
Di PostgreSQL membuat databse yang disebut Arxivsummary. Muat skema dari file ./postgres-schema.sql ke dalam database itu.
Saya seorang astronom, bukan peneliti keamanan atau bahkan insinyur perangkat lunak. Ini adalah proyek hobi yang sedang saya kerjakan dan ingin memiliki setidaknya keamanan yang agak baik. Namun, jangan menyebarkan dalam lingkungan kepercayaan yang rendah karena saya tidak mau menjamin bahwa saya mengikuti praktik keamanan terbaik.
Saat Anda membuka MT, Anda tidak akan memiliki akun pengguna. Anda akan diberikan opsi untuk membuatnya. Berikan nama pengguna, kata sandi, email, dan rahasia (variabel lingkungan mt_new_user_secret). Saat Anda membuat pengguna ini kode back-end akan memeriksa apakah ada pengguna di database dan jika tidak akan menjadikan pengguna itu admin (dapat membuat pengguna baru dan pengguna admin baru sendiri). Anda sekarang dapat masuk sebagai pengguna itu. Tombol Buat Pengguna akan tetap dengan fungsionalitas yang sama; Kecuali bahwa semua pengguna berikutnya yang dibuatnya tidak akan memiliki hak admin.
Penggunaan dasar harus jelas. Idenya adalah bahwa situs web yang dilayani memberikan ringkasan singkat dari setiap makalah yang diposting ke Arxiv pada hari sebelumnya (atau selama akhir pekan / Jumat). Ringkasan ini dihasilkan menggunakan GPT-3.5-tubo dan abstrak dari makalah sebagaimana tercantum pada Arxiv. Antarmuka akan default untuk menunjukkan kepada Anda semua kertas; Namun, filter kategori ditampilkan di bilah samping.
Perilaku yang lebih kompleks diaktifkan melalui kotak obrolan yang terkait dengan setiap kertas. Kotak obrolan ini terhubung ke GPT-3.5-Turbo dan database vektor yang menyimpan semua informasi yang saat ini di-cache tentang kertas (dengan menggunakan model OpenAi-Textembedding-Dada002). Ketika Anda mengajukan pertanyaan, informasi cache yang paling relevan tentang makalah itu diteruskan ke model GPT bersama dengan pertanyaan dan tanggapannya dicetak ke layar. Karena secara default hanya abstrak dan judul yang di -cache, tanggapan yang dapat diberikan GPT terbatas. Namun, jika Anda mengklik tombol "Mode Abstrak saja" dan tunggu beberapa detik, Anda akan melihat bahwa itu berubah menjadi "mode teks lengkap" dan tidak lagi dapat diklik. Di belakang layar PDF lengkap dari makalah itu telah diunduh dan diuraikan menjadi teks. Itu kemudian tertanam ke dalam database vektor yang sama. Sekarang ketika Anda mengajukan pertanyaan, model GPT memiliki konteks yang jauh lebih banyak untuk menjawabnya. Karena teks lengkap disimpan dalam database setelah siapa pun mengklik tombol "Mode Abstrak saja" satu kali akan selalu menjadi abu -abu di masa depan karena kotak obrolan itu akan selalu default untuk mempertimbangkan seluruh kertas.
Beberapa fungsionalitas dimaksudkan untuk antarmuka Programatik bukan UI (khususnya secara otomatis meringkas semua makalah terbaru). Untuk ini Anda akan membutuhkan kunci API. Hanya pengguna admin yang dapat menghasilkan kunci API. Jika Anda adalah admin, semua yang perlu Anda lakukan untuk mendapatkan kunci API adalah klik pada nama pengguna Anda> Hasilkan Kunci API> Hasilkan. Kuncinya terdiri dari 2 bagian, dipisahkan oleh ":". Yang pertama adalah UUID kunci (digunakan untuk pencarian cepat di tabel kunci) dan yang kedua adalah token teks 16 byte polos. Di sisi server, token ini memiliki hash dan asin sebelum disimpan.
Pastikan untuk menuliskan kunci ini karena tidak disimpan di mana pun dan karenanya tidak dapat diambil setelah Anda menutup dialog.
Saya telah menguji ini berjalan di belakang proxy terbalik nginx. Ini cukup mudah dan tidak diperlukan konfigurasi khusus.
Beberapa tangkapan layar antarmuka web pada tanggal 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.
Konfigurasi crontab dasar untuk memberi tahu server untuk mengambil kertas terbaru setiap hari pada jam 5 pagi. Ini mengasumsikan bahwa server Anda berjalan di https://example.com
0 5 * * * curl -v https://example.com/api/fetch/latestIni akan secara otomatis mengambil kertas; Namun, itu tidak akan meneruskannya ke GPT untuk meringkas. Panggilan API lain dapat dijadwalkan untuk itu:
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
Pertama -tama ubah file di datastore/penyedia yang disebut milvus_datastore.py untuk mengubah daftar schema_v1 ke yang berikut:
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 ),
"" ,
),
]Kemudian modifikasi model/model.py dengan kelas -kelas yang diperbarui berikut (jika saya tidak mencantumkan kelas di sini kemudian biarkan sama).
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