PaperQa2は、科学文献に焦点を当てたPDFまたはテキストファイルで、高精度の検索拡張生成(RAG)を行うためのパッケージです。最近の2024年の論文を参照して、質問の回答、要約、矛盾の検出などの科学的タスクにおけるPaperqa2の超人的パフォーマンスの例をご覧ください。
askこの例では、研究論文PDFのフォルダーを取り、魔法のようにメタデータを取得します - 格納チェックを備えた引用カウントを含めて、PDFをフルテキスト検索インデックスに解析してキャッシュし、最後に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ベースのシステムを使用して、人工ニューロンや連想記憶などのニューラルネットワークコンポーネントを構築するためのDNA鎖変位カスケードの使用を示しています(QIAN2011NEURAL PAGES 1-2、QIAN2011NEURAL PAGES 15-16、 Qian2011Neuralページ54-56)。この研究には、3ビットXORゲートの実装と4 neuronホップフィールド連想メモリが含まれ、ニューラルネットワーク計算のDNAの可能性を紹介します。さらに、DNA配列を使用したコンピューティングを含むゲノミクスに深い学習技術を適用することは、十分に文書化されています。研究では、転写因子の結合やDNAアクセシビリティなどのゲノム機能を予測するために、畳み込みニューラルネットワーク(CNNS)を適用しています(ERASLAN2019DEEPページ4-5、ERASLAN2019DEEPページ5-6)。これらのモデルは、DNAシーケンスを入力データとして活用し、ニューラルネットワークを使用してDNAとの計算を効果的に使用します。提供された抜粋は、タンパク質ベースのニューラルネットワーク計算を明示的に言及していませんが、DNAタンパク質結合の予測など、タンパク質配列に関連するタスクでのニューラルネットワークの使用を強調しています(Zeng2016Convolutional Pages 1-2)。ただし、主な焦点はDNAベースの計算に残っています。
PaperQa2は、科学論文を操作するための最高のエージェントRAGモデルになるように設計されています。ここにいくつかの機能があります:
デフォルトでは、Numpy Vector DBを備えたOpenAI埋め込みとモデルを使用して、ドキュメントを埋め込み検索します。ただし、他のクローズドソース、オープンソースモデル、または埋め込みを簡単に使用できます(以下の詳細を参照)。
PaperQa2は、リポジトリを可能にするいくつかの素晴らしいライブラリ/APIに依存しています。ここにいくつかの順序がありません:
私たちはしばらくの間、基本的なアップグレードに懸命に取り組んでおり、ほとんどがSemverに続いています。つまり、各壊れた変化についてメジャーバージョン番号を増やしました。これにより、現在のメジャーバージョン番号V5になります。では、なぜPaperQa2と呼ばれるレポが電話をかけるのですか?私たちは、多くの重要なメトリックで人間のパフォーマンスを超えたことを事実について述べたかったのです。したがって、バージョン5および以前のPaperQa2を任意に呼び、その前のバージョンはPaperQa1としてバージョンを呼び出して、パフォーマンスの大幅な変化を示します。 Futurehouseでの命名とカウントに挑戦していることを認識しているため、名前をPapercrowに任意に変更するために、いつでも権利を留保します。
バージョン5追加:
pqaDocsオブジェクトからの症状の多くを削除しました PaperQAの以前のバージョンから漬けられたDocsオブジェクトは、バージョン5と互換性があり、再構築する必要があることに注意してください。また、最小PythonバージョンはPython 3.11に増加しました。
PaperQa2を理解するには、基礎となるアルゴリズムの部分から始めましょう。 PaperQa2のデフォルトワークフローは次のとおりです。
| 段階 | Paperqa2アクション |
|---|---|
| 1。紙検索 | -LLMで生成されたキーワードクエリから候補論文を取得します |
| -Chunk、埋め込み、および候補者の論文を述べる | |
| 2。証拠を収集します | - クエリをベクトルに埋め込みます |
| - 現在の状態でトップKドキュメントチャンクをランク付けします | |
| - 現在のクエリのコンテキストで各チャンクのスコア付き概要を作成します | |
| -LLMを使用して、最も関連性の高い要約を再スコアして選択します | |
| 3。答えを生成します | - コンテキストで最高の要約をプロンプトに入れます |
| - プロンプトで回答を生成します |
ツールは、言語エージェントが任意の順序で呼び出すことができます。たとえば、LLMエージェントは、狭く幅広い検索を行うか、生成回答ステップからの収集証拠ステップに異なる言い回しを使用する場合があります。
非開発セットアップの場合は、PypiのPaperQa2(別名バージョン5)をインストールします。注バージョン5にはPython 3.11+が必要です。
pip install paper-qa > =5開発のセットアップについては、convributing.mdファイルを参照してください。
Paperqa2はLLMを使用して操作するため、適切なAPIキー環境変数( export OPENAI_API_KEY=sk-... )を設定するか、オープンソースLLMサーバー(つまり、llamafileを使用しています。 Paperqa2で使用するように構成されています。
大規模な論文(100+)にインデックスを作成する必要がある場合は、CrossRefとSemantic Scholarの両方に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およびSemantic Scholarを使用)を収集し、そのインデックスを検索し、ファイルをチャンクされた証拠コンテキストに分割し、ランク付けし、最終的に答えを生成します。次回このディレクトリが照会されたとき、インデックスは既に構築されています(新しい追加された論文のように検出された違いを除いて)ので、インデックスとチャンキングの手順をスキップします。
すべての事前回答はインデックスおよび保存されます。 searchサブコマンドを介してクエリすることで表示するか、 ~/.pqa/にデフォルトであるPQA_HOMEディレクトリに自分でアクセスできます。
$ pqa search -i ' answers ' ' antibodies ' PaperQa2は、コマンドラインから実行するときにpqa --helpすべてのオプションと短い説明を表示します。たとえば、より高い温度で実行するには:
$ pqa --temperature 0.5 ask ' What manufacturing challenges are unique to bispecific antibodies? ' pqa viewですべての設定を表示できます。もう1つの便利なことは、他のテンプレート設定に変更することです - たとえば、 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 | Wikicrowの出版物で使用されているWikipediaの記事執筆をエミュレートする設定。 |
| 矛盾 | 論文で矛盾を見つけるために、あなたの質問は、矛盾としてフラグを立てる必要がある(またはそうでない)主張であるべきです。 |
| デバッグ | デバッグのみに役立つ設定ですが、デバッグ以外の実際のアプリケーションではありません。 |
| 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オブジェクトに追加することにより、Imperallyを呼び出す場合:
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 Answerオブジェクトには、次の属性がありますformatted_answer 、 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オブジェクトにオブジェクトを追加する場合は、以前に既存の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相当があります。
| 同期 | 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 Notebooks!を含む!)。したがって、これを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設定の両方でgpt-4o-2024-08-06を備えたOpenAIモデルを使用します。これを簡単に調整できます:
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 )埋め込みを使用することを義務付けていますが、ベクターストアと埋め込み選択の両方に柔軟なオプションがあります。埋め込みを変更する最も簡単な方法は、 Settingsオブジェクトコンストラクターへのembedding引数を使用することです。
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>"の埋め込み入力もサポートしています"hybrid-text-embedding-3-small"密なモデル名で使用します。 "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引数を介して指定できます。
SentenceTransformerEmbeddingModelモデルを使用できますsentence-transformersをインストールする場合は、ハグFaceモデルなどをサポートするローカルな埋め込みライブラリです。 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に送信され、要約するか、無関係かどうかを判断します。このステップの後、最終回答がLLMコンテキストウィンドウに適合できるように、 max_sourcesの制限が適用されます。したがって、 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 ,
)論文を使用する必要はありません - コードまたはRAW HTMLを使用できます。このツールは質問への回答に焦点を合わせているため、コードの作成にはうまくいかないことに注意してください。 1つの注意点は、ツールがコードから引用を推測できないため、自分で提供する必要があることです。
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を使用して無効にしない限り、ペーパーディレクトリのサブディレクトリから再帰的に読み取ります。 Paper Directoryは決して変更されておらず、読み取られています。
インデックスプロセスは、LLM駆動のテキスト処理を使用して、タイトルとDOIのような紙メタデータを推測しようとします。 「マニフェスト」ファイルを使用して、この不確実性のポイントを回避できます。これは、3つの列を含む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をhugging顔から引き出し、質問ごとに1つのGradablePaperQAEnvironment paperqaenvironmentを作成するように設計されたタスクデータセットこれらを使用する方法の例は次のとおりです。
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の最も強力な機能の1つは、複数のメタデータソースからのデータを組み合わせる機能です。たとえば、UpaywallはPDFSへのオープンアクセスステータス/ダイレクトリンクを提供でき、CrossRefはBibtexを提供でき、Semantic Scholarは引用ライセンスを提供できます。これがこれを行う方法の短いデモです:
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 direct 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 Extraを介してpyzoteroをインストールします。
pip install paperqa[zotero]まず、Paperqa2はデータベースに保存する論文のPDFを解析するため、関連するすべての論文にはデータベース内にPDFが保存される必要があることに注意してください。 Zoteroを取得して、取得する参照を強調表示し、右クリックし、 「利用可能なPDFを検索」を選択することで、これを自動的に実行できます。また、各参照にPDFを手動でドラッグアンドドロップすることもできます。
論文をダウンロードするには、アカウントのAPIキーを取得する必要があります。
ZOTERO_USER_IDとして設定します。https://www.zotero.org/groups/groupnameにアクセスし、設定リンクをホバリングします。 IDは整数 /groups /です。 ( 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で。
自分のコレクション以外の紙を検索したい場合は、Paper-Scraperと呼ばれる無関係なプロジェクトを見つけました。しかし、注意してください、このプロジェクトは、出版社の権利に違反したり、合法性の灰色の領域にある可能性のあるスクレイピングツールを使用しているように見えます。
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 )上記の構文に従って、クエリの後およびクエリの前に実行されるプロンプトを含めることもできます。たとえば、これを使用して答えを批判できます。
Futurehouseでは、ツールのセットがわずかに異なります。引用トラバーサルのようなそれらのいくつかをこのレポを入れようとしています。ただし、公然と共有できない研究論文にアクセスするためのAPIとライセンスがあります。同様に、私たちの研究論文の結果では、既知の関連するPDFから始まりません。私たちのエージェントは、単なるサブセットではなく、すべての論文のキーワード検索を使用してそれらを識別する必要があります。これらの2つのバージョンのPaperQAを徐々に連携させていますが、自由にアクセスするためのオープンソースの方法(オープンソースペーパーだけでも)があるまで、PDFSを自分で提供する必要があります。
LangchainとLlamaindexはどちらもLLMアプリケーションを操作するためのフレームワークであり、エージェントワークフローと検索拡張生成のために抽象化されています。
時間が経つにつれて、PaperQAチームは時間の経過とともにフレームワークに依存することを選択し、代わりにLLMドライバーをLitellmにアウトソーシングし、そのツールのためにPydantic以外のフレームワークをアウトソーシングしました。 Paperqaは、科学論文とそのメタデータに焦点を当てています。
Paperqaは、LlamaindexまたはLangchainのいずれかを使用して再実装できます。たとえば、当社のGatherEvidenceツールは、LLMベースの再ランクおよびコンテキストサマリーを備えたレトリバーとして再実装できます。 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 )docs/2024-10-16_litqa2-splits.json5に含まれるのは、列車と評価の分割で使用される質問ID(ラボベンチのlitqa2質問IDに対応)と、列車と評価スプリットのインデックスの構築に使用される紙のdoi 。テストの分割は引き続き保持されています。
このソフトウェアを使用する場合は、次の論文を読んで引用してください。
@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 }
}