
这个名字有点开玩笑(尽管一个极好的人)。该应用程序总结了ARXIV上的内容,如果您愿意的话,有点像最近的文献历史。修昔底德(Thucydides)是西方文化中最早的严密历史学家之一,似乎很合适。然而,修昔底德很久以前就居住了,因此很长时间,而且可能对现代学术文学的概括很可能。 Methusela非常老。
这个笑话是拉伸的,隐喻很差。但是,您不能说的是它不是一个唯一的名称。
大部分安装由Dockerfile处理。但是,除了Docker外,您还需要
1) milvis
2) postgresql
3) GPT-Retrival-API
请注意,您将必须修改GPT-ReTrival-API Milvus数据存储以包括字段文档-ID。这需要对源文件进行一些小的修改。有关详细信息,请参见README的底部。
在构建Docker容器之前,将这些信息的配置信息放在config.py文件中。设置这些设置后,您可以运行以下命令来构建和部署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是您分配为环境变量的一些随机字符串。这使您可以在启动时首次注册新用户。它还可以让您允许其他人自己的帐户。只要他们有秘密。不要分享。
该网站将在0.0.0.0:5516访问(可在Localhost:5516访问)
设置数据库和检索插件的方式与您为Docker安装相同的方式。然后
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.py这将在开发模式下以0.0.0.0:5515运行服务器(可在Localhost:5515访问)
在Postgresql中,制作一个名为Arxivsummary的数据库。从文件./postgres-schema.sql加载架构中。
我是天文学家,不是安全研究人员,甚至是软件工程师。这是一个我正在研究的爱好项目,并且至少要有一些可以的安全性。但是,不要在低信任环境中部署,因为我不愿意保证自己遵循最佳安全惯例。
打开MT时,您将不会有一个用户帐户。您将有一个选择。提供用户名,密码,电子邮件和秘密(环境变量MT_NEW_USER_SECRET)。当您创建此用户时,后端代码将检查数据库中是否存在任何用户,如果不是,则该用户将使该用户成为管理员(可以创建新用户和新的Admin用户自己)。您现在可以登录该用户。创建用户按钮将保持相同的功能;除了它创建的所有后续用户都不具有管理员特权。
基本用法应该是自我解释的。这个想法是,该网站提供了一个简短的摘要,摘要前一天(或周末 /星期五)发布给ARXIV的每篇论文。这些摘要是使用gpt-3.5-tubo生成的,以及在Arxiv上列出的论文的摘要。界面将默认显示所有论文;但是,类别过滤器在侧边栏中显示。
通过与每篇论文关联的聊天框启用了更复杂的行为。此聊天框连接到GPT-3.5-Turbo和一个存储有关该论文的所有缓存信息的矢量数据库(通过使用OpenAi-Textembedding-ADA002型号)。当您提出一个问题时,有关该论文的最相关的缓存信息将传递给GPT模型,并将其回答打印到屏幕上。因为默认情况下,只有摘要和标题是缓存的,因此GPT可以给出的响应受到限制。但是,如果单击“仅抽象模式”按钮并等待几秒钟,您会发现它更改为“全文模式”,并且不再可单击。在幕后,该论文的完整PDF已下载并解析为文本。然后将其嵌入到同一矢量数据库中。现在,当您提出问题时,GPT模型有更多的上下文可以回答它们。由于所有人一次单击“ Ampract Mode”按钮后,全文存储在数据库中,因此将来将始终将其弄清楚,因为该聊天框将始终默认为考虑整个纸张。
某些功能旨在用于程序化而不是UI接口(特别是自动汇总所有最新论文)。为此,您将需要一个API密钥。只有管理员用户才能生成API密钥。如果您是管理员,那么您需要做的一切才能获得API密钥,就是单击您的用户名>生成API键>生成。钥匙包括2个部分,由“:”隔开。第一个是键UUID(用于钥匙表中的快速查找),第二个是纯文本16字节令牌。在存储之前,在服务器端,该令牌已被哈希和腌制。
确保将此密钥写下来,因为它没有存储在任何地方,因此在您结束对话后无法检索。
我已经测试了NGINX反向代理后面运行的。它非常简单,不需要特殊的配置。
截至2023年4月18日,网络界面的一些屏幕截图








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.
基本的crontab配置告诉服务器每天凌晨5点每天获取最新论文。假设您的服务器正在https://example.com上运行
0 5 * * * curl -v https://example.com/api/fetch/latest这将自动获取论文;但是,它不会将它们传递给GPT进行总结。可以为此安排另一个API调用:
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
首先在称为milvus_datastore.py的数据存储/提供程序中修改文件以将schema_v1列表更改为以下内容:
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 ),
"" ,
),
]然后使用以下更新的类修改文件型号/型号。
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