學術論文GPT的源碼解讀與微調:從chatpaper、gpt_academic到七月論文審稿GPT

文末《大模型項目開發線下營-深廣站》秒殺!!!

第一部分 ChatPaper:論文對話、總結、翻譯

ChatPaper的自身定位是全流程加速科研:論文總結+專業級翻譯+潤色+審稿+審稿回覆,因爲論文更多是PDF的格式,故針對PDF的對話、總結、翻譯,便不可避免的涉及到PDF的解析

1.1 論文審稿:ChatPaper/ChatReviewerAndResponse

1.1.1 對PDF的解析:ChatReviewerAndResponse/get_paper.py

// 待更

1.1.2 論文審查:ChatReviewerAndResponse/chat_reviewer.py

使用OpenAI的GPT模型進行論文審查的腳本。它首先定義了一個Reviewer類來處理審查工作,然後在if __name__ == '__main__':語句下使用argparse處理命令行參數,並調用chat_reviewer_main函數來開始審查過程

導入模塊:比如jieba、tenacity等

命名元組定義:用於保存與論文審稿相關的參數

判斷文本中是否包含中文:

插入句子到文本

主要功能是在給定文本的每隔一定數量的單詞或中文字符後插入一個指定的句子。如果文本行包含中文字符,則使用jieba分詞工具來切分中文,否則使用空格來切分:

論文審稿類:定義了一個Reviewer類,包含以下功能:

第一階段審稿:先是基於論文標題和摘要,選擇要審稿的部分

然後分別實現兩個函數

一個chat_review,主要功能是調用GPT-3模型進行論文審稿,對輸入的文章文本進行審查,並按照預定格式生成審稿意見

使用ChatGPT進行審稿,且有tenacity重試機制和更多的功能,其中review_by_chatgpt 調用了上面所示的兩個函數,一個stage_1,一個chat_review

主程序部分:

定義了一個chat_reviewer_main 函數,該函數創建了一個Reviewer對象,並對指定路徑中的PDF文件進行審稿

主程序中定義了命令行參數解析,並調用了chat_reviewer_main 函數

在主程序中增加了審稿時間的計算功能

當然,這個項目的論文審稿部分更多是用的ChatGPT的API審稿,我司在API的基礎上進一步做了微調的工作,比如如何通過論文審閱語料微調出一個論文審稿GPT(甚至通過10萬量級的paper+review語料微調/訓練),詳見本文的第三部分或我司的「大模型項目開發線下營」

1.2 PDF解析:ChatPaper/scipdf_parser-master/

1.2.1 ChatPaper/scipdf_parser-master/scipdf/pdf/parse_pdf.py

導入必要的庫

re: 正則表達式庫,用於匹配和處理字符串

os 和 os.path: 操作文件和路徑的庫

glob: 搜索文件的庫

urllib: 用於處理和獲取 URL

subprocess: 執行外部命令和程序的庫

requests: 用於發送 HTTP 請求的庫

BeautifulSoup 和 NavigableString: 從 bs4 導入,用於解析和操作 XML/HTML 內容

tqdm 和 tqdm_notebook: 提供進度條功能

定義常量

GROBID_URL: GROBID 是一個開源軟件,可以從 PDF 文件中提取和解析學術出版物的結構化信息

PDF_FIGURES_JAR_PATH: 這是指向某個 jar 文件的路徑,但這段代碼中並沒有用到這個常量

函數 list_pdf_paths: 返回給定文件夾中所有 PDF 文件的路徑

函數 validate_url: 通過正則表達式驗證給定的路徑是否爲有效的 URL

函數 parse_pdf:

這是代碼中的核心功能,用 GROBID 服務從 PDF 文檔中解析 XML 或 BeautifulSoup 格式的信息

如果 fulltext 參數爲 True,則解析整篇文章;否則,只解析標題

可以從本地或雲端的 GROBID 服務中獲取數據

函數 parse_authors: 從 BeautifulSoup 文章對象中提取作者信息

函數 parse_date: 從 BeautifulSoup 文章對象中提取出版日期

函數 parse_abstract: 從 BeautifulSoup 文章對象中提取摘要

函數 calculate_number_of_references: 計算給定部分中的引用數量

函數 parse_sections:

從 BeautifulSoup 文章對象中提取文章的各個部分或段落

它還計算每個部分中的引用數量

parse_references(article):功能:從給定的BeautifulSoup對象中解析文獻引用列表主要步驟:尋找包含引用的部分對於每個引用,提取文章標題、期刊、發佈日期和作者信息返回包含所有引用信息的列表

parse_figure_caption(article):

功能:從給定的BeautifulSoup對象中解析圖形和表格

主要步驟:

搜索所有圖形

對於每個圖形或表格,提取標籤、類型、ID、標題和數據

返回包含所有圖形/表格信息的列表

convert_article_soup_to_dict(article, as_list=False):

功能:將BeautifulSoup對象轉換爲JSON格式的字典,類似於某些開源項目的輸出

主要步驟:

提取文章的標題、作者、發佈日期、摘要、部分、引用、圖形和公式

返回一個包含所有這些信息的字典

parse_pdf_to_dict(...):功能:解析給定的PDF並返回解析後的文章的字典

主要步驟:

使用外部工具或服務(如GROBID)解析PDF

將解析後的BeautifulSoup對象轉換爲字典格式

返回該字典

這個函數的目的是解析給定的PDF文件,並將其轉換爲一個結構化的字典。首先,它使用parse_pdf函數來解析PDF,然後使用convert_article_soup_to_dict函數將解析後的BeautifulSoup對象轉換爲字典

parse_figures(...):

功能:使用pdffigures2工具從給定的科學PDF中解析圖形

主要步驟:

檢查輸出文件夾是否存在,如果不存在則創建它

在輸出文件夾中創建子文件夾來保存數據和圖形

使用Java運行pdffigures2工具解析圖形

打印完成消息

1.3 論文檢索:ChatPaper/auto_survey/utils

具體包含如下功能(這個基於GPT4的文獻總結工具的項目auto-draft也提供類似的功能)

自動搜索相關文獻, 提供真實有出處的引用

自動生成LaTeX格式,markdown格式的調研結果

1.3.1 /auto_survey/utils/knowledge_databases/ml_textbook_test

// 待更

1.3.2 /auto_survey/utils/embeddings.py

1.3.3 /auto_survey/utils/gpt_interaction.py

// 待更

1.3.4 /auto_survey/utils/knowledge.py

定義了一個Knowledge類,該類使用關鍵詞字典從數據庫中搜索相關內容,並可以將這些內容轉化爲提示文本或JSON格式

1.3.5 /auto_survey/utils/references.py

這個代碼文件主要注意實現了以下功能

1.3.5.1第一部分:References 類之外

1)Reference類的說明

從給定的.bib文件中讀取論文,並用search_paper_abstract方法填充缺失的摘要

根據一些關鍵詞使用Semantic Scholar API查找相關論文

從所選論文中生成Bibtex引用格式

從所選論文中生成提示(prompts)。示例提示格式爲:{"paper_id": "paper summary"}。

2)待完成的任務(todo)

加載預定義的論文;

使用Semantic Scholar API查找所有相關作品;

將所有引文添加到bib_papers;

將所有被引文添加到bib_papers;

使用Semantic Scholar查找它們的嵌入;

將引文分組以減少tokens的數量

3)一些基本的工具

evaluate_cosine_similarity:計算兩個向量的餘弦相似性

chunks 將一個較長的列表分割爲較小的批次,以便於處理;

embed 通過向Semantic Scholar的API發送請求,爲一組論文計算嵌入(即將論文映射到一個向量空間中)

get_embeddings 爲給定的論文標題和描述獲取嵌入

get_top_k 獲取與給定論文最相關的k篇論文

具體而言,從提供的papers_dict 中找到與給定的paper_title和paper_description最相似的前k篇論文,並返回。至於相似性是通過計算兩篇論文嵌入向量的餘弦相似度來確定的