PaperQA2是用于在PDFS或文本文件上进行高准确检索增强发电(RAG)的软件包,重点是科学文献。请参阅我们最近的2024年论文,以查看PaperQA2超人表现的示例,例如问题回答,摘要和矛盾检测。
ask在此示例中,我们将一个研究论文PDF的文件夹神奇地获取其元数据 - 包括带回收检查的引用数,然后解析和缓存PDFS中的全文搜索索引,最后用LLM代理回答用户问题。
pip install paper-qa
cd my_papers
pqa ask ' How can carbon nanotubes be manufactured at a large scale? '问题:是否有人设计了用蛋白质或DNA计算的神经网络?
多个来源支持神经网络已设计为用DNA计算的声称。 Qian,Winfree和Bruck的工作证明了使用基于DNA的系统(Qian2011 Neural Pages 1-2,Qian2011Neural Pages 15-16,15-16,Qian2011Neural Pages ofertoal and Mosisiative memories)使用DNA链位移级联反应来构建神经网络组件,例如人工神经元和关联记忆。 QIAN2011教育第54-56页)。这项研究包括实施3位XOR栅极和四个神经元的Hopfield关联记忆,展示了DNA对神经网络计算的潜力。另外,有充分的文献记录了深度学习技术在基因组学上的应用,该技术涉及使用DNA序列进行计算。研究已应用卷积神经网络(CNN)来预测基因组特征,例如转录因子结合和DNA可及性(Eraslan2019deep第4-5页,Eraslan2019deep第5-6页)。这些模型利用DNA序列作为输入数据,有效地使用神经网络用DNA计算。尽管提供的摘录并未明确提及基于蛋白质的神经网络计算,但它们确实突出了与蛋白质序列有关的任务中的神经网络的使用,例如预测DNA-蛋白结合(Zeng2016 Conconconconconconloseal Pages 1-2)。但是,主要重点仍然放在基于DNA的计算上。
PaperQA2设计为使用科学论文的最佳代理抹布模型。这是一些功能:
默认情况下,它使用Numpy Vector DB使用OpenAI嵌入式和模型来嵌入和搜索文档。但是,您可以轻松地使用其他封闭源,开源型号或嵌入(请参见下面的详细信息)。
PaperQA2取决于一些很棒的库/API,这些库/API使我们的存储库成为可能。以下是没有特定顺序的一些:
我们一直在努力进行基本升级,并大多遵循Semver。这意味着我们已经在每个破裂更改上增加了主要版本号。这使我们进入了当前的主要版本号V5。那么,为什么现在称为PaperQA2的存储库呢?我们想评论这一事实,尽管我们已经超出了许多重要指标的人类绩效。因此,我们任意将版本5及以后的PaperQA2和版本称为PaperQA1,以表示性能的重大变化。我们认识到,我们在未来的房屋中受到挑战,因此我们随时保留任意将名称更改为Papercrow的权利。
添加了5版:
pqaDocs对象中删除了许多状态请注意,从PaperQA的先前版本腌制的Docs对象与版本5不兼容,需要重建。同样,我们的最低Python版本增加到Python 3.11。
要了解PaperQA2,让我们从基础算法的部分开始。 PaperQA2的默认工作流量如下:
| 阶段 | PaperQA2动作 |
|---|---|
| 1。纸搜索 | - 从LLM生成的关键字查询获取候选论文 |
| - 块,嵌入和添加候选论文 | |
| 2。收集证据 | - 将查询嵌入向量 |
| - 在当前状态下排名最高的K文档块 | |
| - 在当前查询的上下文中创建每个块的评分摘要 | |
| - 使用LLM重新评分并选择最相关的摘要 | |
| 3。生成答案 | - 在上下文中提示最佳摘要 |
| - 及时产生答案 |
这些工具可以由语言代理以任何顺序调用。例如,LLM代理可能会进行狭窄而广泛的搜索,或者使用不同的措辞来从生成的答案步骤中进行收集证据步骤。
对于非开发设置,请从PYPI安装PaperQA2(又名5版)。注意版本5要求Python 3.11+。
pip install paper-qa > =5有关开发设置,请参阅contruting.md文件。
PaperQA2使用LLM进行操作,因此您需要设置适当的API密钥环境变量(即export OPENAI_API_KEY=sk-... )或设置开源LLM Server(即使用LLAMAFILE。任何LITELLM兼容模型都可以配置为与PaperQA2一起使用。
如果您需要索引大量论文(100+),则可能需要CrossRef和语义学者的API密钥,这将使您避免使用这些元数据服务达到公共费用限制。可以将这些导出为CROSSREF_API_KEY和SEMANTIC_SCHOLAR_API_KEY变量。
测试PaperQA2的最快方法是通过CLI。首先用一些论文导航到目录,然后使用pqa CLI:
$ pqa ask ' What manufacturing challenges are unique to bispecific antibodies? '您将看到PaperQA2索引您的本地PDF文件,为每个文件收集必要的元数据(使用CrossRef和Sminantic Scholar),搜索该索引,然后将文件分解为块的证据上下文,对它们进行排名,并最终产生答案。下次查询此目录时,您的索引将已经构建(除了检测到的任何差异,例如新添加的论文),因此它将跳过索引和分解步骤。
所有先前的答案将被索引和存储,您可以通过search子命令查询查看它们,或者在PQA_HOME目录中自己访问它们,该目录默认为~/.pqa/ 。
$ pqa search -i ' answers ' ' antibodies ' PaperQA2是高度可配置的,当从命令行运行时, pqa --help显示所有选项和简短说明。例如,以较高的温度运行:
$ pqa --temperature 0.5 ask ' What manufacturing challenges are unique to bispecific antibodies? '您可以使用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 ' What manufacturing challenges are unique to bispecific antibodies? '如果您使用需要新索引的命令运行pqa ,请说如果更改默认的chunk_size,则将自动为您创建一个新的索引。
pqa --parsing.chunk_size 5000 ask ' What manufacturing challenges are unique to bispecific antibodies? '您也可以使用pqa使用LLMS查看搜索命令进行全文搜索。例如,让我们从目录中保存索引并给它一个名称:
pqa -i nanomaterials index现在,我可以搜索有关热电学的论文:
pqa -i nanomaterials search thermoelectrics或者我可以使用正常的问
pqa -i nanomaterials ask ' Are there nm scale features in thermoelectric materials? 'CLI和模块都基于先前的绩效和我们的出版物都进行了预配置的设置,它们可以如下所示:
pqa --settings < setting name > ask ' Are there nm scale features in thermoelectric materials? '在paperqa/configs中,我们将已知有用设置捆绑在一起:
| 设置名称 | 描述 |
|---|---|
| 高质量 | 高性能的,相对昂贵(由于evidence_k = 15),使用ToolSelector代理查询。 |
| 快速地 | 设置以廉价,快速地获得答案。 |
| 维基克罗 | 设置为Wikicrow出版物中使用的Wikipedia文章写作。 |
| contracrow | 设置在论文中查找矛盾的情况,您的查询应是需要标记为矛盾(或没有)的主张。 |
| 调试 | 设置仅用于调试的有用,但在调试之外的任何实际应用程序中都不适用。 |
| tier1_limits | 匹配每个层的OpenAI速率限制的设置,您可以使用tier<1-5>_limits来指定层。 |
如果您达到率限制,则说使用OpenAI Tier 1计划,可以将它们添加到PaperQA2中。对于每个Openai层,都存在预建的设置以限制使用。
pqa --settings ' tier1_limits ' ask ' Are there nm scale features in thermoelectric materials? '这将限制您的系统使用tier1_limits,并减慢查询以适应。
您也可以使用任何速率限制字符串手动指定它们,该字符串与限制模块中的规范匹配:
pqa --summary_llm_config ' {"rate_limit": {"gpt-4o-2024-08-06": "30000 per 1 minute"}} ' ask ' Are there nm scale features in thermoelectric materials? '或通过添加到Settings对象中,如果急得调用:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm_config = { "rate_limit" : { "gpt-4o-2024-08-06" : "30000 per 1 minute" }},
summary_llm_config = { "rate_limit" : { "gpt-4o-2024-08-06" : "30000 per 1 minute" }},
),
)PaperQA2的完整工作流程可以直接通过Python访问:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)请参阅我们的安装文档,了解如何从PYPI安装包装。
ask答案对象具有以下属性: formatted_answer , answer (单独答案), question和context (找到答案的段落的摘要)。 ask将使用SearchPapers工具,该工具将查询文件的本地索引,您可以通过Settings对象指定此位置:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
) ask只是真实入口处的便利包装,如果您想同时运行同步的工作负载,则可以访问它:
from paperqa import Settings , agent_query , QueryRequest
answer = await agent_query (
QueryRequest (
query = "What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)
)默认代理将使用基于LLM的代理,但是您还可以指定"fake"代理,以使用硬编码的搜索路径 - >收集证据 - >答案以减少令牌使用情况。
如果您喜欢细粒度控制,并且希望自己将对象添加到文档对象(而不是使用搜索工具),则可以使用以前现有的Docs对象接口:
from paperqa import Docs , Settings
# valid extensions include .pdf, .txt, and .html
doc_paths = ( "myfile.pdf" , "myotherfile.pdf" )
docs = Docs ()
for doc in doc_paths :
docs . add ( doc )
settings = Settings ()
settings . llm = "claude-3-5-sonnet-20240620"
settings . answer . answer_max_sources = 3
answer = docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)
print ( answer . formatted_answer )PaperQA2被编写为异步使用。同步API只是异步周围的包装器。这是方法及其async等效物:
| 同步 | 异步 |
|---|---|
Docs.add | Docs.aadd |
Docs.add_file | Docs.aadd_file |
Docs.add_url | Docs.aadd_url |
Docs.get_evidence | Docs.aget_evidence |
Docs.query | Docs.aquery |
同步版本仅在循环中调用异步版本。大多数现代的Python环境本地支持async (包括Jupyter笔记本!)。因此,您可以在Jupyter笔记本中执行此操作:
import asyncio
from paperqa import Docs
async def main () -> None :
docs = Docs ()
# valid extensions include .pdf, .txt, and .html
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
await docs . aadd ( doc )
answer = await docs . aquery (
"What manufacturing challenges are unique to bispecific antibodies?"
)
print ( answer . formatted_answer )
asyncio . run ( main ())默认情况下,它对重新排序和摘要步骤, summary_llm设置以及答案步骤llm设置)使用OpenAI模型,其中包括gpt-4o-2024-08-06 。您可以轻松调整此:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "gpt-4o-mini" , summary_llm = "gpt-4o-mini" , paper_directory = "my_papers"
),
)您可以使用litellm支持的人类或任何其他模型:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "claude-3-5-sonnet-20240620" , summary_llm = "claude-3-5-sonnet-20240620"
),
)您可以使用Llama.cpp作为LLM。请注意,您应该使用相对较大的型号,因为PaperQA2需要按照很多说明。 7B型号您将无法获得良好的性能。
获得设置的最简单方法是下载Llama文件并使用-cb -np 4 -a my-llm-model --embedding执行,该文件将启用连续的批处理和嵌入。
from paperqa import Settings , ask
local_llm_config = dict (
model_list = [
dict (
model_name = "my_llm_model" ,
litellm_params = dict (
model = "my-llm-model" ,
api_base = "http://localhost:8080/v1" ,
api_key = "sk-no-key-required" ,
temperature = 0.1 ,
frequency_penalty = 1.5 ,
max_tokens = 512 ,
),
)
]
)
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "my-llm-model" ,
llm_config = local_llm_config ,
summary_llm = "my-llm-model" ,
summary_llm_config = local_llm_config ,
),
)还支持由ollama主持的模型。要运行下面的示例,请确保您通过Ollama下载了Llama3.2和Mxbai-embed-large。
from paperqa import Settings , ask
local_llm_config = {
"model_list" : [
{
"model_name" : "ollama/llama3.2" ,
"litellm_params" : {
"model" : "ollama/llama3.2" ,
"api_base" : "http://localhost:11434" ,
},
}
]
}
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "ollama/llama3.2" ,
llm_config = local_llm_config ,
summary_llm = "ollama/llama3.2" ,
summary_llm_config = local_llm_config ,
embedding = "ollama/mxbai-embed-large" ,
),
)PaperQA2默认使用OpenAI( text-embedding-3-small )嵌入,但对矢量存储和嵌入选择都具有灵活的选项。更改嵌入的最简单方法是通过embedding参数到Settings对象构造函数:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "text-embedding-3-large" ),
) embedding接受Litellm支持的任何嵌入模型名称。 PaperQA2还支持"hybrid-<model_name>" ie "hybrid-text-embedding-3-small"的嵌入输入,以使用混合稀疏关键字(基于令牌模量嵌入)和密集的矢量,并在任何LITELLM模型中嵌入任何LITELLM模型,在密集的型号名称中使用。 "sparse"只能使用稀疏的关键字嵌入。
嵌入模型用于创建全文嵌入向量的PaperQA2的索引( texts_index参数)。当您向Docs对象添加新论文时,可以将嵌入模型指定为设置:
from paperqa import Docs , Settings
docs = Docs ()
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
docs . add ( doc , settings = Settings ( embedding = "text-embedding-large-3" ))请注意,PaperQA2使用Numpy作为密集的矢量存储。它使用关键字搜索的设计最初将每个答案所需的块数减少到相对较小的数字<1k。因此, NumpyVectorStore是一个不错的起点,它是一个简单的内存商店,没有索引。但是,如果需要大型内存矢量商店,我们目前在这里缺乏。
可以自定义混合嵌入:
from paperqa import (
Docs ,
HybridEmbeddingModel ,
SparseEmbeddingModel ,
LiteLLMEmbeddingModel ,
)
model = HybridEmbeddingModel (
models = [ LiteLLMEmbeddingModel (), SparseEmbeddingModel ( ndim = 1024 )]
)
docs = Docs ()
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
docs . add ( doc , embedding_model = model )稀疏嵌入(关键字)模型默认为具有256个维度,但可以通过ndim参数指定。
如果您安装sentence-transformers ,则可以使用SentenceTransformerEmbeddingModel模型,该模型是一个本地嵌入式库,支持拥抱面模型等。您可以通过添加local额外功能来安装它。
pip install paper-qa[local]然后将模型名称嵌入st- :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "st-multi-qa-MiniLM-L6-cos-v1" ),
)或使用混合模型
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "hybrid-st-multi-qa-MiniLM-L6-cos-v1" ),
)您可以调整源数(文本的段落)以减少令牌使用情况或添加更多上下文。 k是指最相关和最多样化(可能来自不同来源)段落的顶级K。每个段落都发送到LLM以汇总或确定它是无关紧要的。在此步骤之后,应用了max_sources的限制,以便最终答案可以适合LLM上下文窗口。因此, k > max_sources和max_sources是最终答案中使用的源数。
from paperqa import Settings
settings = Settings ()
settings . answer . answer_max_sources = 3
settings . answer . k = 5
docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)您不需要使用论文 - 您可以使用代码或原始HTML。请注意,该工具专注于回答问题,因此编写代码无法很好地完成问题。一个值得注意的是该工具不能从代码中推断引用,因此您需要自己提供它们。
import glob
import os
from paperqa import Docs
source_files = glob . glob ( "**/*.js" )
docs = Docs ()
for f in source_files :
# this assumes the file names are unique in code
docs . add ( f , citation = "File " + os . path . name ( f ), docname = os . path . name ( f ))
answer = docs . query ( "Where is the search bar in the header defined?" )
print ( answer )您可能需要在外部数据库或文件中缓存解析的文本和嵌入。然后,您可以直接从这些对象构建文档对象:
from paperqa import Docs , Doc , Text
docs = Docs ()
for ... in my_docs :
doc = Doc ( docname = ..., citation = ..., dockey = ..., citation = ...)
texts = [ Text ( text = ..., name = ..., doc = doc ) for ... in my_texts ]
docs . add_texts ( texts , doc )默认情况下,索引将放置在主目录中。这可以通过PQA_HOME环境变量来控制。
索引是通过在Settings.paper_directory中读取文件来制作索引。默认情况下,除非使用Settings.index_recursively distabled,否则我们会从纸张目录的子目录中递归阅读。纸目录不会以任何方式修改,它只是从中读取的。
索引过程试图使用llm驱动的文本处理来推断纸元数据,例如标题和doi。您可以使用“清单”文件避免此不确定性,该文件是包含三列(顺序无关紧要)的CSV:
file_location :索引目录中论文PDF的相对路径doi :纸上的doititle :纸的标题通过提供此信息,我们确保对像CrossRef这样的元数据提供商进行查询是准确的。
本地搜索索引是基于当前Settings对象的哈希构建的。因此,请确保您正确地将paper_directory指定到Settings对象。通常,建议:
import os
from paperqa import Settings
from paperqa . agents . main import agent_query
from paperqa . agents . models import QueryRequest
from paperqa . agents . search import get_directory_index
async def amain ( folder_of_papers : str | os . PathLike ) -> None :
settings = Settings ( paper_directory = folder_of_papers )
# 1. Build the index. Note an index name is autogenerated when unspecified
built_index = await get_directory_index ( settings = settings )
print ( settings . get_index_name ()) # Display the autogenerated index name
print ( await built_index . index_files ) # Display the index contents
# 2. Use the settings as many times as you want with ask
answer_response_1 = await agent_query (
query = QueryRequest (
query = "What is the best way to make a vaccine?" , settings = settings
)
)
answer_response_2 = await agent_query (
query = QueryRequest (
query = "What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)
)在paperqa/agents/task.py中,您会发现:
GradablePaperQAEnvironment :一个可以给定评估功能的答案的环境。LitQAv2TaskDataset :一个旨在将LITQA V2拉开的任务数据集,并创建一个GradablePaperQAEnvironment这是如何使用它们的示例:
import os
from aviary . env import TaskDataset
from ldp . agent import SimpleAgent
from ldp . alg . callbacks import MeanMetricsCallback
from ldp . alg . runners import Evaluator , EvaluatorConfig
from paperqa import QueryRequest , Settings
from paperqa . agents . task import TASK_DATASET_NAME
async def evaluate ( folder_of_litqa_v2_papers : str | os . PathLike ) -> None :
base_query = QueryRequest (
settings = Settings ( paper_directory = folder_of_litqa_v2_papers )
)
dataset = TaskDataset . from_name ( TASK_DATASET_NAME , base_query = base_query )
metrics_callback = MeanMetricsCallback ( eval_dataset = dataset )
evaluator = Evaluator (
config = EvaluatorConfig ( batch_size = 3 ),
agent = SimpleAgent (),
dataset = dataset ,
callbacks = [ metrics_callback ],
)
await evaluator . evaluate ()
print ( metrics_callback . eval_means )PaperQA2最强大的功能之一是它可以结合来自多个元数据源的数据的能力。例如,UndayWall可以提供开放访问状态/直接链接到PDF,CrossRef可以提供Bibtex,语义学者可以提供引用许可。这是如何做到这一点的简短演示:
from paperqa . clients import DocMetadataClient , ALL_CLIENTS
client = DocMetadataClient ( clients = ALL_CLIENTS )
details = await client . query ( title = "Augmenting language models with chemistry tools" )
print ( details . formatted_citation )
# Andres M. Bran, Sam Cox, Oliver Schilter, Carlo Baldassari, Andrew D. White, and Philippe Schwaller.
# Augmenting large language models with chemistry tools. Nature Machine Intelligence,
# 6:525-535, May 2024. URL: https://doi.org/10.1038/s42256-024-00832-8,
# doi:10.1038/s42256-024-00832-8.
# This article has 243 citations and is from a domain leading peer-reviewed journal.
print ( details . citation_count )
# 243
print ( details . license )
# cc-by
print ( details . pdf_url )
# https://www.nature.com/articles/s42256-024-00832-8.pdf client.query旨在检查标题的精确匹配。这有点坚固(就像外壳一样,错过一个单词)。但是,标题有重复的内容 - 因此您还可以添加作者来消除歧义。或者,您可以直接提供doi client.query(doi="10.1038/s42256-024-00832-8")
如果您大规模这样做,则可能不想使用ALL_CLIENTS (只需省略参数),并且可以指定要加快查询的特定字段。例如:
details = await client . query (
title = "Augmenting large language models with chemistry tools" ,
authors = [ "Andres M. Bran" , "Sam Cox" ],
fields = [ "title" , "doi" ],
)返回的速度将比第一个查询快得多,我们将确定作者匹配。
好吧,这是一个非常好的问题!最好只下载您认为的论文PDF,从而有助于回答您的问题并从那里开始。
自从我们已经测试过以来已经有一段时间了 - 因此,让我们知道它是否遇到问题!
如果您使用Zotero组织您的个人参考书目,则可以使用paperqa.contrib.ZoteroDB来查询库的纸张,该库依赖于Pyzotero。
通过zotero额外安装pyzotero此功能:
pip install paperqa[zotero]首先,请注意,PaperQA2解析了存储在数据库中的纸张的PDF,因此所有相关的论文都应在数据库中存储PDF。您可以通过突出显示要检索,右键单击并选择“可用PDFS”的参考文献来自动执行此操作。您也可以将拖放PDF手动到每个引用。
要下载论文,您需要获取帐户的API密钥。
ZOTERO_USER_ID 。https://www.zotero.org/groups/groupname ,然后在设置链接上悬停。 ID是 /组之后的整数。 ( H/T Pyzotero! )ZOTERO_API_KEY 。这样,我们可以从库中下载论文并将其添加到PaperQA2:
from paperqa import Docs
from paperqa . contrib import ZoteroDB
docs = Docs ()
zotero = ZoteroDB ( library_type = "user" ) # "group" if group library
for item in zotero . iterate ( limit = 20 ):
if item . num_pages > 30 :
continue # skip long papers
docs . add ( item . pdf , docname = item . key )它将在您的Zotero数据库中下载前20篇论文,并将其添加到Docs对象中。
我们还可以对Zotero库进行特定的查询,并迭代结果:
for item in zotero . iterate (
q = "large language models" ,
qmode = "everything" ,
sort = "date" ,
direction = "desc" ,
limit = 100 ,
):
print ( "Adding" , item . title )
docs . add ( item . pdf , docname = item . key )您可以通过键入zotero.iterate?在Ipython。
如果您想在自己的收藏集外搜索论文,我找到了一个无关的项目,称为纸造纸,看起来可能会有所帮助。但是要当心,这个项目看起来使用了一些可能侵犯出版商权利或处于合法性的刮擦工具。
from paperqa import Docs
keyword_search = "bispecific antibody manufacture"
papers = paperscraper . search_papers ( keyword_search )
docs = Docs ()
for path , data in papers . items ():
try :
docs . add ( path )
except ValueError as e :
# sometimes this happens if PDFs aren't downloaded or readable
print ( "Could not read" , path , e )
answer = docs . query (
"What manufacturing challenges are unique to bispecific antibodies?"
)
print ( answer )要在LLM完成的每个块上执行一个函数,您需要提供一个可以在每个块上执行的函数。例如,要获取完整的打字机视图,您可以做:
def typewriter ( chunk : str ) -> None :
print ( chunk , end = "" )
docs = Docs ()
# add some docs...
docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
callbacks = [ typewriter ],
)通常,当您腌制Docs时,无论您使用哪种矢量商店,都会将嵌入式嵌入。因此,只要您保存基础Docs对象,就应该能够避免重新安装文档。
您可以使用设置自定义任何提示。
from paperqa import Docs , Settings
my_qa_prompt = (
"Answer the question '{question}' n "
"Use the context below if helpful. "
"You can cite the context using the key like (Example2012). "
"If there is insufficient context, write a poem "
"about how you cannot answer. n n "
"Context: {context}"
)
docs = Docs ()
settings = Settings ()
settings . prompts . qa = my_qa_prompt
docs . query ( "Are covid-19 vaccines effective?" , settings = settings )遵循上面的语法,您还可以包括查询后和查询之前执行的提示。例如,您可以使用它来批评答案。
在内部,我们有一套略有不同的工具。我们正在努力将其中一些(例如引用遍历)进入此仓库。但是,我们拥有API和许可证,可以访问无法公开分享的研究论文。同样,在我们的研究论文的结果中,我们也不是从已知的相关PDF开始。我们的经纪人必须使用所有论文中的关键字搜索来识别它们,而不仅仅是子集。我们逐渐将这两个版本的PaperQA对齐,但是直到有一种开源方式来自由访问论文(即使只是开源论文),您将需要自己提供PDF。
Langchain和LlamainDex都是用于使用LLM应用程序的框架,并为代理工作流程和检索增强发电提供了抽象。
随着时间的流逝,随着时间的流逝,PaperQA团队选择成为框架 - 敏捷的剂量,而是将LLM驱动程序外包给Litellm,除了Pydantic以外,没有框架以使用其工具。 PaperQA专注于科学论文及其元数据。
可以使用LlamainDex或Langchain重新完成PaperQA。例如,可以通过基于LLM的重新排列和上下文摘要来重新将我们的GatherEvidence工具重新成真。 Llamaindex中的树响应方法也有类似的工作。
Docs课可以被腌制和未挑选。如果要保存文档的嵌入,然后再加载它们,这将很有用。
import pickle
# save
with open ( "my_docs.pkl" , "wb" ) as f :
pickle . dump ( docs , f )
# load
with open ( "my_docs.pkl" , "rb" ) as f :
docs = pickle . load ( f )包含在文档/2024-10-16_litqa2-splits.json5中的问题ID(与Lab-Bench的LITQA2问题ID相对应),用于火车和评估拆分,以及用于构建火车和评估索引的纸DOIS 。测试拆分仍保持不变。
如果您使用此软件,请阅读并引用以下论文:
@article { skarlinski2024language ,
title = { Language agents achieve superhuman synthesis of scientific knowledge } ,
author = {
Michael D. Skarlinski and
Sam Cox and
Jon M. Laurent and
James D. Braza and
Michaela Hinks and
Michael J. Hammerling and
Manvitha Ponnapati and
Samuel G. Rodriques and
Andrew D. White } ,
year = { 2024 } ,
journal = { arXiv preprent arXiv:2409.13740 } ,
url = { https://doi.org/10.48550/arXiv.2409.13740 }
} @article { lala2023paperqa ,
title = { PaperQA: Retrieval-Augmented Generative Agent for Scientific Research } ,
author = {
Jakub Lála and
Odhran O'Donoghue and
Aleksandar Shtedritski and
Sam Cox and
Samuel G. Rodriques and
Andrew D. White } ,
journal = { arXiv preprint arXiv:2312.07559 } ,
year = { 2023 }
}