LLMs之PaperQA2:PaperQA2的简介、安装和使用方法、案例应用之详细攻略
目录
PaperQA2的简介
PaperQA2是一个高精度的检索增强生成(RAG)工具,专注于处理科学文献。它通过整合文档元数据、嵌入和大型语言模型(LLM)来提供基于文本的引文答案。PaperQA2旨在超越人类在科学任务中的表现,如问答、总结和矛盾检测。以下是其主要特点:
>> 简单的界面:提供引文支持的答案。
>> 文档元数据感知:在嵌入中使用元数据,并通过LLM进行重新排序和上下文总结。
>> Agentic RAG支持:语言代理可以迭代优化查询和答案。
>> 自动提取元数据:从多个提供商获取文献的引文和期刊质量数据。
>> 全文搜索引擎:支持本地存储库的PDF或文本文件搜索。
>> 可定制接口:默认支持所有LiteLLM模型,也可使用其他模型或嵌入。
GitHub地址:https://github.com/Future-House/paper-qa
1、PaperQA2 与 PaperQA 的比较
我们一直在努力进行根本性的升级,并且大部分遵循 SemVer 版本号规则。这意味着我们在每次不兼容的变更时都会递增主版本号。这就带我们来到了当前的主要版本号 v5。那么为什么现在仓库被称为 PaperQA2?我们想要指出的是,我们在许多重要指标上已经超越了人类的表现。因此,我们将版本 5 及之后称为 PaperQA2,之前的版本则称为 PaperQA1,以表示性能上的显著变化。我们承认 FutureHouse 在命名和计数方面存在挑战,所以我们保留随时任意更名的权利,例如改为 PaperCrow。
2、版本 5 (即 PaperQA2) 中的新功能是什么?
版本 5 添加了:
>> 一个 CLI pqa
>> 调用工具进行论文搜索、收集证据和生成答案的代理工作流程
>> 从 Docs 对象中移除了大量的状态保持
>> 迁移至 LiteLLM 以便与许多 LLM 提供商兼容,同时集中速率限制和成本跟踪
>> 一套打包的配置(阅读此处),包含已知良好的超参数
请注意,从先前版本的 PaperQA 中序列化的 Docs 对象与版本 5 不兼容,需要重建。另外,我们的最低 Python 版本已提升至 Python 3.11。
3、PaperQA2 算法
要理解 PaperQA2,让我们从底层算法的组成部分开始。PaperQA2 的默认工作流程如下:
阶段 | PaperQA2 动作 |
1. 论文搜索 | >> 从 LLM 生成的关键字查询中获取候选论文 >> 将候选论文分块、嵌入并添加到状态中 |
2. 收集证据 | >> 将查询嵌入向量 >> 对当前状态中的前 k 个文档片段进行排序 >> 创建每个片段在当前查询上下文中的得分摘要 >> 使用 LLM 重新评分并选择最相关的摘要 |
3. 生成答案 | >> 将最佳摘要放入带有上下文的提示中 >> 使用提示生成答案 |
这些工具可以由语言代理以任意顺序调用。例如,一个 LLM 代理可能会执行窄范围和宽范围的搜索,或者在收集证据步骤和生成答案步骤之间使用不同的措辞。
PaperQA2的安装和使用方法
1、安装
PaperQA2 依赖于一些出色的库/API,使我们的仓库成为可能。这里列出了一些,不分先后顺序:
Semantic Scholar
Crossref
Unpaywall
Pydantic
tantivy
LiteLLM
pybtex
PyMuPDF
安装
对于非开发环境,请从 PyPI 安装 PaperQA2:
pip install paper-qa
对于开发环境设置,请参考 CONTRIBUTING.md 文件。
PaperQA2 使用 LLM 来操作,因此您需要设置合适的 API 密钥环境变量(例如 export OPENAI_API_KEY=sk-...)或设置一个开源 LLM 服务器(例如使用 llamafile。任何与 LiteLLM 兼容的模型都可以配置为与 PaperQA2 一起使用。
如果您需要索引大量论文(100+),您可能希望获得 Crossref 和 Semantic Scholar 的 API 密钥,这样可以让您避免使用这些元数据服务时碰到公共速率限制。这些可以导出为 CROSSREF_API_KEY 和 SEMANTIC_SCHOLAR_API_KEY 变量。
CLI 使用
测试 PaperQA2 最快的方式是通过 CLI。首先导航到包含一些论文的目录,并使用 pqa cli:
$ pqa ask '双特异性抗体有哪些独特的制造挑战?'
您会看到 PaperQA2 为您的本地 PDF 文件建立索引,收集每篇论文所需的元数据(使用 Crossref 和 Semantic Scholar),在该索引上搜索,然后将文件分割成证据上下文块,对它们进行排序,最终生成答案。下次查询此目录时,您的索引已经被构建(除非检测到差异,例如新添加的论文),因此它将跳过索引和分块步骤。
所有先前的答案都将被索引并存储,您可以通过 search 子命令查询它们,或者自己在 PQA_HOME 目录中访问它们,默认位置为 ~/.pqa/。
$ pqa search -i 'answers' 'antibodies'
PaperQA2 是高度可配置的,当从命令行运行时,pqa --help 显示所有选项和简短描述。例如,要以更高的温度运行:
$ pqa --temperature 0.5 ask '双特异性抗体有哪些独特的制造挑战?'
您可以使用 pqa view 查看所有设置。另一个有用的功能是切换到其他模板设置——例如 fast 是一种更快回答的设置,您可以使用 pqa -s fast view 查看
也许您有一些新的设置想要保存?您可以这样做:
pqa -s my_new_settings --temperature 0.5 --llm foo-bar-5 save
然后您可以使用它:
pqa -s my_new_settings ask '双特异性抗体有哪些独特的制造挑战?'
如果您使用需要重新索引的命令运行 pqa,比如说如果您更改了默认的 chunk_size,将会为您自动创建一个新的索引。
pqa --parsing.chunk_size 5000 ask '双特异性抗体有哪些独特的制造挑战?'
您还可以使用 pqa 结合 LLM 进行全文搜索,查看 search 命令。例如,让我们保存一个目录的索引并给它命名:
pqa -i nanomaterials index
现在我可以搜索有关热电材料的论文:
pqa -i nanomaterials search thermoelectrics
或者我可以使用正常的 ask
pqa -i nanomaterials ask '热电材料中是否存在纳米尺度的特征?'
CLI 和模块都有基于之前表现和我们出版物预先配置的设置,可以按照以下方式调用:
pqa --settings <setting name> ask '热电材料中是否存在纳米尺度的特征?'
捆绑设置
在 paperqa/configs 中,我们捆绑了已知有用的设置:
设置名称 | 描述 |
high_quality | 使用 ToolSelector 代理进行的高性能查询,相对昂贵(因为 evidence_k = 15)。 |
fast | 用于快速且低成本获取答案的设置。 |
wikicrow | 模仿我们在 WikiCrow 出版物中使用的维基百科文章写作的设置。 |
contracrow | 用于查找论文中的矛盾之处的设置;您的查询应该是一个需要被标记为矛盾(或不是)的声明。 |
2、库使用
可以通过 Python 访问 PaperQA2 的完整工作流程。
PaperQA2 的完整工作流程可以直接通过 Python 访问:
请参阅我们的安装文档以了解如何从 PyPI 安装该软件包。
手动提问
答案对象具有以下属性:formatted_answer(格式化后的答案),answer(单独的答案),question(问题),和 context(为答案找到的段落摘要)。ask 将使用 SearchPapers 工具,该工具将查询本地文件索引,您可以通过 Settings 对象指定这个位置:
ask 只是一个方便的包装器,如果您希望运行并发异步工作负载,可以访问真实入口点:
默认代理将使用基于 LLM 的代理,但您也可以指定一个“假”代理来使用硬编码的搜索 -> 收集证据 -> 回答路径,以减少令牌使用。
手动添加文档
如果您更喜欢精细控制,并且希望自行向 docs 对象中添加对象(而不是使用搜索工具),则可以使用之前存在的 Docs 对象接口:
异步
PaperQA2 是为了异步使用而编写的。同步 API 只是异步 API 的一个包装。这里是方法及其异步等效项:
同步版本只是在一个循环中调用异步版本。大多数现代 Python 环境都支持原生异步(包括 Jupyter 笔记本!)。因此,您可以在 Jupyter Notebook 中执行如下操作:
选择模型
默认情况下,它使用 OpenAI 模型 gpt-4o-2024-08-06 进行重新排序和总结步骤,summary_llm 设置以及回答步骤中的 llm 设置。您可以轻松调整这些设置:
您可以使用 Anthropic 或任何其他由 litellm 支持的模型:
本地托管
您可以使用 llama.cpp 作为 LLM。请注意,您应该使用相对较大的模型,因为 PaperQA2 需要遵循很多指令。7B 模型不会带来良好的性能。
最简单的设置方法是下载一个 llama 文件并使用 -cb -np 4 -a my-llm-model --embedding 执行,这将启用连续批处理和嵌入。
更改嵌入模型
PaperQA2 默认使用 OpenAI (text-embedding-3-small) 嵌入,但对于向量存储和嵌入选项都有灵活的选择。更改嵌入最简单的方法是通过传递给 Settings 对象构造函数的 embedding 参数:
embedding 接受 litellm 支持的任何嵌入模型名称。PaperQA2 也支持使用 "hybrid-<model_name>" 形式的嵌入输入,例如 "hybrid-text-embedding-3-small" 来使用混合稀疏关键字(基于令牌模数嵌入)和密集向量嵌入,其中任意 litellm 模型都可以用于密集模型名称。"sparse" 可以用来仅使用稀疏关键字嵌入。
嵌入模型用于创建 PaperQA2 的全文嵌入向量索引(texts_index 参数)。在向 Docs 对象添加新论文时,可以指定嵌入模型作为设置:
注意 PaperQA2 使用 Numpy 作为密集向量存储。其设计是首先使用关键词搜索来减少每个答案所需的分块数量至相对较小的数量 < 1k。因此,NumpyVectorStore 是一个很好的起点,它是一个简单的内存存储,没有索引。然而,如果需要大于内存的向量存储,我们目前在这方面有所不足。
混合嵌入可以自定义:
稀疏嵌入(关键词)模型默认有 256 维,但这可以通过 ndim 参数指定。
调整来源数量
您可以调整来源(文本段落)的数量以减少令牌使用或增加更多上下文。k 指的是前 k 个最相关且多样化的(可能来自不同来源)段落。每个段落都将发送给 LLM 以进行总结,或者确定是否无关。在这一步之后,应用 max_sources 的限制,使得最终答案能够适应 LLM 上下文窗口。因此,k > max_sources 并且 max_sources 是最终答案中使用的来源数量。
使用代码或 HTML
您不必使用论文——您可以使用代码或原始 HTML。请注意,此工具专注于回答问题,因此它不擅长编写代码。需要注意的一点是,工具无法从代码中推断引用,因此您需要自己提供它们。
使用外部数据库/向量数据库和缓存
您可能希望在外部数据库或文件中缓存解析后的文本和嵌入。然后,您可以直接从这些数据构建 Docs 对象:
创建索引
索引默认会放置在家目录中。这可以通过 PQA_HOME 环境变量控制。
索引是通过读取 Settings.paper_directory 中的文件创建的。默认情况下,我们递归地从论文目录的子目录读取,除非使用 Settings.index_recursively 禁用。论文目录不会被修改,只是从中读取。
清单文件
索引过程尝试使用 LLM 动力的文本处理来推断论文元数据,如标题和 DOI。您可以通过使用“清单”文件来避免这种不确定性,该文件是一个包含三列的 CSV 文件(顺序无关紧要):
file_location: 相对于索引目录的论文 PDF 的相对路径
doi: 论文的 DOI
title: 论文的标题
通过提供这些信息,我们可以确保对像 Crossref 这样的元数据提供商的查询是准确的。
重用索引
本地搜索索引是根据当前 Settings 对象的哈希值构建的。因此,请确保正确指定了 paper_directory 到您的 Settings 对象。通常建议:
根据论文文件夹预建索引(可能需要几分钟)
重用索引来执行许多查询
3、在LitQA v2上运行
在paperqa/agents/task.py中,您将找到:
GradablePaperQAEnvironment:一个可以根据评估函数对答案进行评分的环境。
LitQAv2TaskDataset:一个任务数据集,设计用于从Hugging Face拉取LitQA v2,并为每个问题创建一个GradablePaperQAEnvironment。
这里是如何使用它们的一个示例:
直接使用客户端
PaperQA2最强大的功能之一是能够结合来自多个元数据源的数据。例如,Unpaywall可以提供开放访问状态/直接链接到PDF,Crossref可以提供bibtex,而Semantic Scholar可以提供引用许可。下面是一个简短的演示如何实现这一点的例子:
client.query旨在检查标题的完全匹配。它相对健壮(比如对大小写、缺少单词的情况)。不过,由于标题可能有重复——因此您可以添加作者来消除歧义。或者,您可以直接提供DOI client.query(doi="10.1038/s42256-024-00832-8")。
如果您大规模地这样做,您可能不想使用ALL_CLIENTS(只需省略参数),并且可以指定您想要的具体字段以加快查询速度。例如:
这将比第一个查询返回得快得多,并且我们可以确定作者是匹配的。
4、我从哪里获取论文?
这是一个非常好的问题!最好的办法可能是下载您认为有助于回答您的问题的论文的PDF,并从那里开始。
Zotero
自从我们测试这个以来已经有一段时间了——所以如果遇到问题请告诉我们!
如果您使用Zotero来组织个人书目,可以使用paperqa.contrib.ZoteroDB通过pyzotero从您的库中查询论文。
通过zotero额外安装pyzotero以获得此功能:
pip install paperqa[zotero]
首先,请注意PaperQA2会解析论文的PDF以存储在数据库中,因此所有相关论文都应在其数据库内存储PDF。您可以高亮显示希望检索的参考文献,右键单击并选择“查找可用PDF”让Zotero自动执行此操作。您也可以手动将PDF拖放到每个参考文献上。
要下载论文,您需要为您的账户获取API密钥。
获取您的库ID,并将其设置为环境变量ZOTERO_USER_ID。
对于个人库,该ID在这里的部分“Your userID for use in API calls is XXXXXX”给出。
对于群组库,转到您的群组页面https://www.zotero.org/groups/groupname,并悬停在设置链接上。ID是在/groups/之后的整数。(感谢pyzotero!)
在此处创建一个新的API密钥,并将其设置为环境变量ZOTERO_API_KEY。
密钥需要对库具有读取权限。
有了这些,我们可以从我们的库下载论文并将它们添加到PaperQA2中:
论文抓取器
如果您想搜索自己收藏之外的论文,我发现了一个与此无关的项目叫做paper-scraper,看起来可能会有所帮助。但请注意,该项目似乎使用了一些可能违反出版商权利或处于法律灰色地带的抓取工具。
回调
要在每个LLM完成块上执行一个函数,您需要提供一个可以在每个块上执行的函数。例如,为了得到完成项的打字机视图,您可以这样做:
缓存嵌入
一般来说,无论使用何种向量存储,当您pickle一个Docs时,嵌入都会被缓存。因此,只要保存您的基础Docs对象,就应该能够避免重新嵌入您的文档。
自定义提示
您可以使用设置来自定义任何提示。
预置和后置提示
按照上述语法,您还可以包含在查询之前和之后执行的提示。例如,您可以使用它来批判答案。
5、快速入门
在这个例子中,我们从一系列研究论文 PDF 文件夹开始,神奇地获取它们的元数据——包括带有撤稿检查的引用次数,然后解析并将 PDF 缓存到全文搜索索引中,最后使用 LLM 代理回答用户的问题。
pip install paper-qa
cd my_papers
pqa ask '如何大规模制造碳纳米管?'
示例输出
问题:有人设计了使用蛋白质或 DNA 进行计算的神经网络吗?
有多个来源支持设计了使用 DNA 进行计算的神经网络这一说法。Qian、Winfree 和 Bruck 的工作展示了如何利用 DNA 链置换级联来构建神经网络组件,例如人工神经元和联想记忆,这些都基于 DNA 系统(Qian2011Neural 第 1-2 页, Qian2011Neural 第 15-16 页, Qian2011Neural 第 54-56 页)。这项研究包括实现了一个 3 位 XOR 门和一个四神经元 Hopfield 联想记忆,展示了 DNA 在神经网络计算方面的潜力。此外,将深度学习技术应用于基因组学,涉及对 DNA 序列进行计算,这一点已有充分记录。研究表明已经应用卷积神经网络(CNNs)来预测基因组特征,如转录因子结合和 DNA 可访问性(Eraslan2019Deep 第 4-5 页, Eraslan2019Deep 第 5-6 页)。这些模型利用 DNA 序列作为输入数据,实际上是在使用神经网络对 DNA 进行计算。虽然提供的摘录没有明确提到基于蛋白质的神经网络计算,但它们确实强调了神经网络在与蛋白质序列相关的任务中的应用,比如预测 DNA-蛋白质结合(Zeng2016Convolutional 第 1-2 页)。然而,主要焦点仍然是基于 DNA 的计算。
6、常见问题
为什么我的结果与你们的论文不同?
在FutureHouse内部,我们使用了一套略有不同的工具。我们正试图将其中一些工具,如引文遍历,纳入这个仓库。然而,我们拥有访问研究论文的API和许可证,这是无法公开分享的。同样,在我们的研究论文结果中,我们并不是从已知的相关PDF开始。我们的代理必须使用关键词搜索所有论文来识别它们,而不是仅搜索一个子集。我们正在逐步使这两个版本的PaperQA保持一致,但在有一个开源方式自由访问论文(即使是开源论文)之前,您需要自行提供PDF。
这与LlamaIndex或LangChain有何不同?
LangChain和LlamaIndex都是处理LLM应用程序的框架,提供了面向代理工作流和增强生成检索的抽象。
随着时间的推移,PaperQA团队选择了成为框架无关的,而是将LLM驱动程序外包给LiteLLM,并且除了Pydantic以外没有其他框架用于其工具。PaperQA专注于科学论文及其元数据。
可以使用LlamaIndex或LangChain重新实现PaperQA。例如,我们的GatherEvidence工具可以作为带有基于LLM的重排和上下文摘要的检索器重新实现。在LlamaIndex中的树响应方法也有类似的工作。
我可以保存或加载吗?
Docs类可以被序列化和反序列化。如果您想保存文档的嵌入并在以后加载它们,这是非常有用的。
PaperQA2的案例应用
持续更新中……