
O nome é um pouco de piada (embora um extremley ruim). Este aplicativo resumiu o que foi colocado no ARXIV, um pouco de uma história recente da literatura, se você preferir. Tucídides, sendo um dos primeiros historiadores de rigor da cultura ocidental, parecia se encaixar. No entanto, os Tucídides famosos viviam há muito tempo, então seria extremley antigo e provavelmente fisicamente incabável em resumir a literatura acadêmica moderna. Methusela era famosamente muito velho ....
A piada é esticada e a metáfora é pobre; No entanto, o que você não pode dizer é que não é um nome único.
Grande parte da instalação é tratada pelo Dockerfile. No entanto, além do Docker, você precisará
1) milvis
2) postgresql
3) GPT-Retrival-API
Observe que você precisará modificar o armazenamento de dados do GPT-Retival-Api Milvus para incluir o Document-ID de campo. Isso requer algumas pequenas modificações nos arquivos de origem para isso. Veja a parte inferior do ReadMe para obter detalhes.
Coloque as informações de configuração para elas no arquivo config.py antes de criar o contêiner do docker. Depois que estes são configurados, você pode executar os seguintes comandos para construir e implantar Methuselan Tucydides
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 é uma string aleatória que você atribui como uma variável ambiromental. Isso permite que você registre um novo usuário pela primeira vez quando você inicializa. Também permite que você permita que outras pessoas façam suas próprias contas. Contanto que eles tenham o segredo. Não compartilhe isso.
O site estará acessível em 0.0.0.0:5516 (acessível no localHost: 5516)
Configure os bancos de dados e o plug -in de recuperação da mesma maneira que você teria para a instalação do Docker. Então
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.pyIsso executará um servidor no modo de desenvolvimento em 0.0.0.0:5515 (acessível no localhost: 5515)
No PostgreSQL, faça um banco de dados chamado arxivsummary. Carregue o esquema do arquivo ./PostGres-Schema.SQL nesse banco de dados.
Sou astrônomo, não um pesquisador de segurança ou mesmo engenheiro de software. Este é um projeto de hobby em que estou trabalhando e gostaria de ter pelo menos uma segurança boa. No entanto, não implante em um ambiente de confiança de baixa confiança, pois não estou disposto a garantir que estou seguindo as melhores práticas de segurança.
Quando você abre o MT, você não terá uma conta de usuário. Você terá a opção de fazer um. Forneça um nome de usuário, senha, email e segredo (a variável ambiental MT_New_User_Secret). Quando você cria esse usuário, o código de back-end verificar se existirá algum usuário no banco de dados e, se não, ele fará com que esse usuário seja um administrador (pode criar novos usuários e novos usuários do administrador). Agora você pode fazer login como esse usuário. O botão Criar usuário permanecerá com a mesma funcionalidade; Exceto que todos os usuários subsequentes que cria não terão privilégios de administrador.
O uso básico deve ser auto -explicativo. A idéia é que o site servido forneça um breve resumo de cada artigo publicado no ARXIV no dia anterior (ou no fim de semana / sexta -feira). Esses resumos são gerados usando o GPT-3.5-Tubo e o resumo do artigo listado no ARXIV. A interface padrão será de mostrar todos os papéis; No entanto, os filtros de categoria são mostrados em uma barra lateral.
Comportamento mais complexo é ativado através da caixa de bate -papo associada a cada artigo. Esta caixa de bate-papo está conectada ao GPT-3.5-Turbo e a um banco de dados vetorial que armazena todas as informações atualmente em cache sobre o artigo (usando o modelo Open-Textextexembedding-Ada002). Quando você faz uma pergunta, as informações em cache mais relevantes sobre esse papel são passadas para o modelo GPT junto com a pergunta e sua resposta é impressa na tela. Porque, por padrão, apenas o resumo e o título são armazenados em cache, as respostas que o GPT pode dar são limitadas. No entanto, se você clicar no botão "Somente no modo de abstração" e aguarde alguns segundos, verá que ele muda para o "modo de texto completo" e não poderá mais clicar. Nos bastidores, o pdf completo desse artigo foi baixado e analisado no texto. Isso é então incorporado no mesmo banco de dados vetorial. Agora, quando você faz perguntas, o modelo GPT tem muito mais contexto para respondê -las. Como o texto completo é armazenado no banco de dados depois que alguém clica no botão "Somente no modo abstrato" uma vez, ele sempre será acinzentado no futuro, pois a caixa de bate -papo sempre será o padrão de considerar o papel inteiro.
Alguma funcionalidade se destina à interface programática não da interface do usuário (especificamente resumindo automaticamente todos os artigos mais recentes). Para isso, você precisará de uma chave da API. Somente usuários administrativos podem gerar teclas de API. Se você é um administrador, tudo o que precisa fazer para obter uma chave de API é clicar em seu nome de usuário> gerar a chave da API> gerar. A chave compreende 2 partes, separadas por um ":". A primeira é a chave UUID (usada para pesquisa rápida na tabela de chaves) e a segunda é o token de 16 bytes de texto sem formatação. No lado do servidor, este token foi hash e salgado antes de ser armazenado.
Certifique -se de anotar essa chave, pois ela não é armazenada em nenhum lugar e, portanto, não pode ser recuperada depois de encerrar o diálogo.
Eu testei isso correndo atrás de um proxy reverso do Nginx. É bastante direto e nenhuma configuração especial foi necessária.
Algumas capturas de tela da interface da web a partir de 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.
Configuração básica de Crontab para dizer ao servidor para buscar os artigos mais recentes todos os dias às 5 da manhã. Isso pressupõe que seu servidor esteja em execução em https://example.com
0 5 * * * curl -v https://example.com/api/fetch/latestIsso buscará automaticamente papéis; No entanto, não os transmitirá ao GPT para resumo. Outra chamada da API pode ser agendada para isso:
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
Primeiro modifique o arquivo em Datastore/Provedores chamado Milvus_Datastore.py para alterar a lista de esquema_v1 para o seguinte:
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 ),
"" ,
),
]Em seguida, modifique os modelos de arquivos/modelos.py com as seguintes classes atualizadas (se eu não tiver listado uma aula aqui, deixe -a da mesma forma).
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