学术论文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篇论文,并返回。至于相似性是通过计算两篇论文嵌入向量的余弦相似度来确定的