PaperQA2 adalah paket untuk melakukan pengambilan akurasi tinggi augmented generasi (RAG) pada PDF atau file teks, dengan fokus pada literatur ilmiah. Lihat Makalah 2024 kami baru -baru ini untuk melihat contoh -contoh kinerja manusia super PaperQA2 dalam tugas -tugas ilmiah seperti pertanyaan pertanyaan, peringkasan, dan deteksi kontradiksi.
ask secara manualDalam contoh ini kami mengambil folder kertas penelitian PDF, secara ajaib mendapatkan metadata mereka - termasuk jumlah kutipan dengan pemeriksaan retraction, kemudian parse dan cache PDF ke dalam indeks pencarian teks lengkap, dan akhirnya menjawab pertanyaan pengguna dengan agen LLM.
pip install paper-qa
cd my_papers
pqa ask ' How can carbon nanotubes be manufactured at a large scale? 'Pertanyaan: Adakah yang telah merancang jaringan saraf yang menghitung dengan protein atau DNA?
Klaim bahwa jaringan saraf telah dirancang untuk menghitung dengan DNA didukung oleh banyak sumber. Karya Qian, WinFree, dan Bruck menunjukkan penggunaan kaskade perpindahan untai DNA untuk membangun komponen jaringan saraf, seperti neuron buatan dan ingatan asosiatif, menggunakan sistem berbasis DNA (Qian2011eural halaman 1-2, Qian2011eural halaman 15-16, Qian2011 Halamaneural 54-56). Penelitian ini mencakup implementasi gerbang XOR 3-bit dan memori asosiatif empat neuron Hopfield, yang menunjukkan potensi DNA untuk perhitungan jaringan saraf. Selain itu, penerapan teknik pembelajaran mendalam untuk genomik, yang melibatkan komputasi dengan sekuens DNA, didokumentasikan dengan baik. Studi telah menerapkan jaringan saraf konvolusional (CNNs) untuk memprediksi fitur genom seperti pengikatan faktor transkripsi dan aksesibilitas DNA (EraSlan2019Deep Pages 4-5, ERASLAN2019 Halaman 5-6). Model -model ini memanfaatkan urutan DNA sebagai data input, secara efektif menggunakan jaringan saraf untuk menghitung dengan DNA. Sementara kutipan yang disediakan tidak secara eksplisit menyebutkan perhitungan jaringan saraf berbasis protein, mereka menyoroti penggunaan jaringan saraf dalam tugas yang terkait dengan sekuens protein, seperti memprediksi pengikatan protein DNA (Zeng2016 konvolusional 1-2). Namun, fokus utama tetap pada perhitungan berbasis DNA.
PaperQA2 direkayasa untuk menjadi model kain agen terbaik untuk bekerja dengan makalah ilmiah. Berikut beberapa fitur:
Secara default, ia menggunakan embeddings dan model openai dengan vektor numpy db untuk menyematkan dan mencari dokumen. Namun, Anda dapat dengan mudah menggunakan model atau embeddings open-source tertutup lainnya (lihat detail di bawah).
PaperQA2 tergantung pada beberapa perpustakaan/API yang luar biasa yang memungkinkan repo kami. Berikut beberapa tidak ada urutan tertentu:
Kami telah bekerja keras pada peningkatan mendasar untuk sementara waktu dan sebagian besar mengikuti SEMVER. Artinya kami telah menambah nomor versi utama pada setiap perubahan besar. Ini membawa kita ke nomor versi utama saat ini V5. Jadi mengapa panggilan repo sekarang disebut paperqa2? Kami ingin berkomentar tentang fakta bahwa kami telah melampaui kinerja manusia pada banyak metrik penting. Jadi kami secara sewenang -wenang memanggil versi 5 dan dan seterusnya paperqa2, dan versi sebelumnya sebagai paperqa1 untuk menunjukkan perubahan signifikan dalam kinerja. Kami menyadari bahwa kami ditantang dalam penamaan dan menghitung di Futurhouse, jadi kami berhak kapan saja untuk secara sewenang -wenang mengubah nama menjadi papercrow.
Versi 5 ditambahkan:
pqaDocs Perhatikan bahwa objek Docs acar dari versi PaperQA sebelumnya tidak kompatibel dengan versi 5, dan perlu dibangun kembali. Juga, versi python minimum kami ditingkatkan menjadi Python 3.11.
Untuk memahami PaperQA2, mari kita mulai dengan potongan -potongan algoritma yang mendasarinya. Alur kerja default PaperQA2 adalah sebagai berikut:
| Fase | Tindakan PaperQA2 |
|---|---|
| 1. Pencarian Kertas | - Dapatkan kandidat kertas dari kueri kata kunci yang dihasilkan LLM |
| - Potongan, embed, dan tambahkan kandidat kertas ke negara bagian | |
| 2. Kumpulkan bukti | - Embed kueri ke dalam vektor |
| - Dokumen Kop Dokumen Top Rank dalam keadaan saat ini | |
| - Buat ringkasan skor dari setiap potongan dalam konteks kueri saat ini | |
| - Gunakan LLM untuk men-score dan memilih ringkasan yang paling relevan | |
| 3. Hasilkan jawaban | - Masukkan ringkasan terbaik ke dalam konteks |
| - menghasilkan jawaban dengan prompt |
Alat dapat dipanggil dalam urutan apa pun oleh agen bahasa. Misalnya, agen LLM mungkin melakukan pencarian yang sempit dan luas, atau menggunakan frasa yang berbeda untuk langkah kumpulkan langkah dari langkah Jawaban Generate.
Untuk pengaturan non-pengembangan, instal PaperQA2 (alias versi 5) dari PYPI. Catatan Versi 5 membutuhkan Python 3.11+.
pip install paper-qa > =5Untuk pengaturan pengembangan, silakan merujuk ke file contributing.md.
PaperQA2 menggunakan LLM untuk beroperasi, jadi Anda harus mengatur variabel lingkungan kunci API yang sesuai (yaitu export OPENAI_API_KEY=sk-... ) atau mengatur server LLM open source (yaitu menggunakan llamafile. dikonfigurasi untuk digunakan dengan paperqa2.
Jika Anda perlu mengindeks satu set kertas besar (100+), Anda mungkin akan menginginkan kunci API untuk Crossref dan Semantic Scholar, yang akan memungkinkan Anda untuk menghindari mencapai batas tarif publik menggunakan layanan metadata ini. Itu dapat diekspor sebagai variabel CROSSREF_API_KEY dan SEMANTIC_SCHOLAR_API_KEY .
Cara tercepat untuk menguji PaperQA2 adalah melalui CLI. Pertama -tama arahkan ke direktori dengan beberapa makalah dan gunakan pqa CLI:
$ pqa ask ' What manufacturing challenges are unique to bispecific antibodies? 'Anda akan melihat PaperQA2 mengindeks file PDF lokal Anda, mengumpulkan metadata yang diperlukan untuk masing -masing (menggunakan Crossref dan Semantic Scholar), mencari indeks itu, kemudian memecah file menjadi konteks bukti yang dipotong, memberi peringkat, dan akhirnya menghasilkan jawaban. Lain kali direktori ini ditanya, indeks Anda sudah akan dibangun (simpan untuk perbedaan yang terdeteksi, seperti kertas tambahan baru), sehingga akan melewatkan langkah pengindeksan dan chunking.
Semua jawaban sebelumnya akan diindeks dan disimpan, Anda dapat melihatnya dengan menanyakan melalui sub -perintah search , atau mengaksesnya sendiri di direktori PQA_HOME Anda, yang default ke ~/.pqa/ .
$ pqa search -i ' answers ' ' antibodies ' PaperQA2 sangat dapat dikonfigurasi, saat berjalan dari baris perintah, pqa --help menunjukkan semua opsi dan deskripsi pendek. Misalnya berjalan dengan suhu yang lebih tinggi:
$ pqa --temperature 0.5 ask ' What manufacturing challenges are unique to bispecific antibodies? ' Anda dapat melihat semua pengaturan dengan pqa view . Hal lain yang berguna adalah mengubah ke pengaturan templated lainnya - misalnya fast adalah pengaturan yang menjawab lebih cepat dan Anda dapat melihatnya dengan pqa -s fast view
Mungkin Anda memiliki beberapa pengaturan baru yang ingin Anda simpan? Anda bisa melakukannya dengan
pqa -s my_new_settings --temperature 0.5 --llm foo-bar-5 saveDan kemudian Anda dapat menggunakannya dengan
pqa -s my_new_settings ask ' What manufacturing challenges are unique to bispecific antibodies? ' Jika Anda menjalankan pqa dengan perintah yang memerlukan pengindeksan baru, katakanlah jika Anda mengubah chunk_size default, indeks baru akan secara otomatis dibuat untuk Anda.
pqa --parsing.chunk_size 5000 ask ' What manufacturing challenges are unique to bispecific antibodies? ' Anda juga dapat menggunakan pqa untuk melakukan pencarian teks lengkap dengan menggunakan LLMS melihat perintah pencarian. Misalnya, mari kita simpan indeks dari direktori dan beri nama:
pqa -i nanomaterials indexSekarang saya dapat mencari makalah tentang termoelektrik:
pqa -i nanomaterials search thermoelectricsatau saya bisa menggunakan permintaan normal
pqa -i nanomaterials ask ' Are there nm scale features in thermoelectric materials? 'Baik CLI dan modul memiliki pengaturan yang telah dikonfigurasi sebelumnya berdasarkan kinerja sebelumnya dan publikasi kami, mereka dapat dipanggil sebagai berikut:
pqa --settings < setting name > ask ' Are there nm scale features in thermoelectric materials? ' Di dalam paperqa/configs kami menggabungkan pengaturan yang dikenal:
| Nama pengaturan | Keterangan |
|---|---|
| High_quality | Berkinerja tinggi, relatif mahal (karena memiliki evidence_k = 15) permintaan menggunakan agen ToolSelector . |
| cepat | Pengaturan untuk mendapatkan jawaban dengan murah dan cepat. |
| Wikicrow | Pengaturan untuk meniru penulisan artikel Wikipedia yang digunakan dalam publikasi Wikicrow kami. |
| Contracrow | Pengaturan untuk menemukan kontradiksi dalam makalah, pertanyaan Anda harus menjadi klaim yang perlu ditandai sebagai kontradiksi (atau tidak). |
| debug | Mengatur bermanfaat semata -mata untuk debugging, tetapi tidak dalam aplikasi aktual di luar debugging. |
| Tier1_limits | Pengaturan yang cocok dengan batas tingkat openai untuk setiap tingkat, Anda dapat menggunakan tier<1-5>_limits untuk menentukan tingkat. |
Jika Anda mencapai batas tingkat, katakan dengan paket Openai Tier 1, Anda dapat menambahkannya ke dalam PaperQA2. Untuk setiap tingkat openai, ada pengaturan yang sudah dibangun untuk membatasi penggunaan.
pqa --settings ' tier1_limits ' ask ' Are there nm scale features in thermoelectric materials? 'Ini akan membatasi sistem Anda untuk menggunakan Tier1_limits, dan memperlambat pertanyaan Anda untuk mengakomodasi.
Anda juga dapat menentukannya secara manual dengan string batas laju apa pun yang cocok dengan spesifikasi dalam modul Batas:
pqa --summary_llm_config ' {"rate_limit": {"gpt-4o-2024-08-06": "30000 per 1 minute"}} ' ask ' Are there nm scale features in thermoelectric materials? ' Atau dengan menambahkan ke objek Settings , jika memanggil secara imperatif:
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" }},
),
)Alur kerja lengkap Paperqa2 dapat diakses melalui Python secara langsung:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)Silakan lihat dokumen instalasi kami untuk cara menginstal paket dari PYPI.
ask secara manual Objek jawaban memiliki atribut berikut: formatted_answer , answer (jawaban saja), question , dan context (ringkasan bagian -bagian yang ditemukan untuk jawaban). ask akan menggunakan alat SearchPapers , yang akan meminta indeks file lokal, Anda dapat menentukan lokasi ini melalui objek 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 hanyalah pembungkus kenyamanan di sekitar titik masuk nyata, yang dapat diakses jika Anda ingin menjalankan beban kerja yang tidak sinkron secara bersamaan:
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" ),
)
) Agen default akan menggunakan agen berbasis LLM, tetapi Anda juga dapat menentukan agen "fake" untuk menggunakan jalur panggilan kode yang keras -> Kumpulkan bukti -> Jawaban untuk mengurangi penggunaan token.
Jika Anda lebih suka kontrol berbutir halus, dan Anda ingin menambahkan objek ke objek Docs sendiri (daripada menggunakan alat pencarian), maka antarmuka objek Docs yang sebelumnya ada dapat digunakan:
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 ditulis untuk digunakan secara tidak sinkron. API sinkron hanyalah pembungkus di sekitar async. Berikut adalah metode dan padanan async mereka:
| Sinkronisasi | 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 |
Versi sinkron hanya memanggil versi async dalam satu loop. Sebagian besar lingkungan Python modern mendukung async secara asli (termasuk Jupyter Notebooks!). Jadi Anda dapat melakukan ini di buku catatan 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 ()) Secara default, menggunakan model OpenAI dengan gpt-4o-2024-08-06 untuk langkah peringkat ulang dan ringkasan, pengaturan summary_llm , dan untuk langkah penjawab, pengaturan llm . Anda dapat menyesuaikan ini dengan mudah:
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"
),
) Anda dapat menggunakan antropik atau model lain yang didukung oleh 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"
),
)Anda dapat menggunakan llama.cpp untuk menjadi LLM. Perhatikan bahwa Anda harus menggunakan model yang relatif besar, karena PaperQA2 membutuhkan banyak instruksi. Anda tidak akan mendapatkan kinerja yang baik dengan model 7B.
Cara termudah untuk mendapatkan pengaturan adalah dengan mengunduh file llama dan menjalankannya dengan -cb -np 4 -a my-llm-model --embedding yang akan memungkinkan batching dan embeddings kontinu.
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 ,
),
) Model yang di -host dengan ollama juga didukung. Untuk menjalankan contoh di bawah ini, pastikan Anda telah mengunduh llama3.2 dan mxbai-embed-besar melalui ollama.
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 default untuk menggunakan embeddings OpenAI ( text-embedding-3-small ), tetapi memiliki opsi fleksibel untuk kedua toko vektor dan pilihan embedding. Cara paling sederhana untuk mengubah embedding adalah melalui argumen embedding ke Settings Objek Konstruktor:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "text-embedding-3-large" ),
) embedding menerima nama model penyematan yang didukung oleh Litellm. Paperqa2 juga mendukung input embedding "hybrid-<model_name>" yaitu "hybrid-text-embedding-3-small" untuk menggunakan kata kunci hibrida jarang (berdasarkan pada model modulo yang bisa disematkan) dan embedding vektor padat, di mana model litellm mana pun bisa digunakan dalam nama model padat. "sparse" dapat digunakan untuk menggunakan kata kunci kata kunci yang jarang saja.
Model embedding digunakan untuk membuat indeks paperqa2 dari vektor embedding teks lengkap (argumen texts_index ). Model embedding dapat ditentukan sebagai pengaturan saat Anda menambahkan makalah baru ke objek 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" )) Perhatikan bahwa PaperQA2 menggunakan Numpy sebagai toko vektor padat. Desainnya menggunakan pencarian kata kunci pada awalnya mengurangi jumlah potongan yang diperlukan untuk setiap jawaban untuk jumlah yang relatif kecil <1k. Oleh karena itu, NumpyVectorStore adalah tempat yang baik untuk memulai, ini adalah toko dalam memori yang sederhana, tanpa indeks. Namun, jika diperlukan toko vektor yang lebih besar dari memori, kami saat ini kurang di sini.
Embeddings hibrida dapat disesuaikan:
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 ) Model embedding (kata kunci) jarang default untuk memiliki 256 dimensi, tetapi ini dapat ditentukan melalui argumen ndim .
Anda dapat menggunakan Model SentenceTransformerEmbeddingModel jika Anda menginstal sentence-transformers , yang merupakan perpustakaan embedding lokal dengan dukungan untuk model Huggingface dan banyak lagi. Anda dapat menginstalnya dengan menambahkan ekstra local .
pip install paper-qa[local] dan kemudian awalan menanamkan nama model dengan 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" ),
)atau dengan model hybrid
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" ),
) Anda dapat menyesuaikan jumlah sumber (bagian teks) untuk mengurangi penggunaan token atau menambahkan lebih banyak konteks. k mengacu pada bagian K yang paling relevan dan beragam (dapat dari berbagai sumber). Setiap bagian dikirim ke LLM untuk merangkum, atau menentukan apakah itu tidak relevan. Setelah langkah ini, batas max_sources diterapkan sehingga jawaban akhir dapat masuk ke jendela konteks LLM. Dengan demikian, k > max_sources dan max_sources adalah jumlah sumber yang digunakan dalam jawaban akhir.
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 ,
)Anda tidak perlu menggunakan kertas - Anda dapat menggunakan kode atau HTML mentah. Perhatikan bahwa alat ini difokuskan pada menjawab pertanyaan, jadi tidak akan berhasil dalam menulis kode. Salah satu catatannya adalah bahwa alat tersebut tidak dapat menyimpulkan kutipan dari kode, jadi Anda harus menyediakannya sendiri.
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 )Anda mungkin ingin menyimpan teks dan embedding parsed dalam database atau file eksternal. Anda kemudian dapat membangun objek Docs dari yang secara langsung:
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 ) Indeks akan ditempatkan di direktori home secara default. Ini dapat dikontrol melalui variabel lingkungan PQA_HOME .
Indeks dibuat dengan membaca file di Settings.paper_directory . Secara default, kami membaca secara rekursif dari subdirektori direktori kertas, kecuali dinonaktifkan menggunakan Settings.index_recursively . Direktori kertas tidak dimodifikasi dengan cara apa pun, itu baru saja dibaca.
Proses pengindeksan mencoba menyimpulkan metadata kertas seperti judul dan doi menggunakan pemrosesan teks bertenaga LLM. Anda dapat menghindari titik ketidakpastian ini menggunakan file "manifes", yang merupakan CSV yang berisi tiga kolom (urutan tidak masalah):
file_location : Jalur relatif ke PDF kertas dalam direktori indeksdoi : doi kertastitle : Judul KertasDengan memberikan informasi ini, kami memastikan pertanyaan untuk penyedia metadata seperti CrossRef akurat.
Indeks pencarian lokal dibangun berdasarkan hash dari objek Settings saat ini. Jadi pastikan Anda menentukan dengan benar paper_directory ke objek Settings Anda. Secara umum, disarankan untuk:
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 ,
)
) Di paperqa/agents/task.py , Anda akan menemukan:
GradablePaperQAEnvironment : Lingkungan yang dapat menilai jawaban yang diberikan fungsi evaluasi.LitQAv2TaskDataset : Dataset tugas yang dirancang untuk menarik litqa v2 dari wajah memeluk, dan membuat satu GradablePaperQAEnvironment per pertanyaanBerikut adalah contoh cara menggunakannya:
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 )Salah satu fitur paling kuat dari PaperQA2 adalah kemampuannya untuk menggabungkan data dari beberapa sumber metadata. Misalnya, Unpaywall dapat memberikan status akses terbuka/tautan langsung ke PDF, CrossRef dapat memberikan Bibtex, dan Semantic Scholar dapat memberikan lisensi kutipan. Inilah demo singkat tentang bagaimana melakukan ini:
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 dimaksudkan untuk memeriksa kecocokan judul yang tepat. Agak kuat (suka casing, melewatkan sepatah kata pun). Ada duplikat untuk judul - sehingga Anda juga dapat menambahkan penulis ke disambiguate. Atau Anda dapat memberikan DOI secara langsung client.query(doi="10.1038/s42256-024-00832-8") .
Jika Anda melakukan ini dalam skala besar, Anda mungkin tidak ingin menggunakan ALL_CLIENTS (cukup hilangkan argumennya) dan Anda dapat menentukan bidang spesifik mana yang ingin Anda percepat permintaan. Misalnya:
details = await client . query (
title = "Augmenting large language models with chemistry tools" ,
authors = [ "Andres M. Bran" , "Sam Cox" ],
fields = [ "title" , "doi" ],
)Akan kembali lebih cepat daripada kueri pertama dan kami akan memastikan penulis cocok.
Nah itu pertanyaan yang sangat bagus! Mungkin yang terbaik untuk hanya mengunduh PDF dari makalah yang menurut Anda akan membantu menjawab pertanyaan Anda dan mulai dari sana.
Sudah lama sejak kami telah menguji ini - jadi beri tahu kami jika mengalami masalah!
Jika Anda menggunakan Zotero untuk mengatur daftar pustaka pribadi Anda, Anda dapat menggunakan paperqa.contrib.ZoteroDB untuk meminta kertas dari perpustakaan Anda, yang bergantung pada Pyzotero.
Instal pyzotero melalui zotero Extra untuk fitur ini:
pip install paperqa[zotero]Pertama, perhatikan bahwa PaperQA2 mem -parsing PDF kertas untuk disimpan dalam database, sehingga semua makalah yang relevan harus memiliki PDF yang disimpan di dalam database Anda. Anda bisa mendapatkan Zotero untuk secara otomatis melakukan ini dengan menyorot referensi yang ingin Anda ambil, klik kanan, dan memilih "Temukan PDF yang tersedia" . Anda juga dapat menyeret dan menjatuhkan PDF secara manual ke setiap referensi.
Untuk mengunduh kertas, Anda perlu mendapatkan kunci API untuk akun Anda.
ZOTERO_USER_ID .https://www.zotero.org/groups/groupname , dan arahkan ke atas tautan pengaturan. ID adalah bilangan bulat setelah /grup /. ( H/T Pyzotero! )ZOTERO_API_KEY .Dengan ini, kami dapat mengunduh kertas dari perpustakaan kami dan menambahkannya ke 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 ) yang akan mengunduh 20 makalah pertama di database Zotero Anda dan menambahkannya ke objek Docs .
Kami juga dapat melakukan kueri spesifik dari perpustakaan Zotero kami dan mengulangi hasilnya:
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 ) Anda dapat membaca lebih lanjut tentang sintaks pencarian dengan mengetik zotero.iterate? di Ipython.
Jika Anda ingin mencari kertas di luar koleksi Anda sendiri, saya telah menemukan proyek yang tidak terkait yang disebut kertas-paper yang sepertinya mungkin membantu. Tapi waspadalah, proyek ini sepertinya menggunakan beberapa alat pengikis yang mungkin melanggar hak -hak penerbit atau berada di bidang legalitas abu -abu.
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 )Untuk menjalankan fungsi pada setiap bagian dari penyelesaian LLM, Anda perlu memberikan fungsi yang dapat dieksekusi pada setiap potongan. Misalnya, untuk mendapatkan tampilan mesin tik tentang penyelesaian, Anda dapat melakukannya:
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 ],
) Secara umum, embeddings di -cache saat Anda acar Docs terlepas dari toko vektor apa yang Anda gunakan. Jadi selama Anda menyimpan objek Docs yang mendasari, Anda harus dapat menghindari kembali dokumen Anda.
Anda dapat menyesuaikan salah satu prompt menggunakan pengaturan.
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 )Mengikuti sintaks di atas, Anda juga dapat memasukkan petunjuk yang dieksekusi setelah kueri dan sebelum kueri. Misalnya, Anda dapat menggunakan ini untuk mengkritik jawabannya.
Secara internal di Foperhouse, kami memiliki seperangkat alat yang sedikit berbeda. Kami mencoba untuk mendapatkan beberapa dari mereka, seperti traversal kutipan, ke repo ini. Namun, kami memiliki API dan lisensi untuk mengakses makalah penelitian yang tidak dapat kami bagikan secara terbuka. Demikian pula, dalam hasil penelitian kami, kami tidak mulai dengan PDF yang relevan yang diketahui. Agen kami harus mengidentifikasi mereka menggunakan pencarian kata kunci di atas semua kertas, bukan hanya subset. Kami secara bertahap menyelaraskan kedua versi Paperqa ini, tetapi sampai ada cara open-source untuk secara bebas mengakses kertas (bahkan hanya kertas open source) Anda perlu memberikan PDF sendiri.
Langchain dan Llamaindex keduanya kerangka kerja untuk bekerja dengan aplikasi LLM, dengan abstraksi yang dibuat untuk alur kerja agen dan pengambilan generasi augmented.
Seiring waktu, tim Paperqa dari waktu ke waktu memilih untuk menjadi kerangka kerja-agnostik, sebaliknya outsourcing driver LLM ke Litellm dan tidak ada kerangka kerja selain Pydantic untuk alatnya. Paperqa berfokus pada makalah ilmiah dan metadata mereka.
Paperqa dapat diimplementasikan menggunakan llamaindex atau langchain. Misalnya, alat GatherEvidence kami dapat diimplementasikan sebagai retriever dengan ringkasan peringkat ulang dan kontekstual berbasis LLM. Ada pekerjaan serupa dengan metode respons pohon di llamaindex.
Kelas Docs dapat diasamkan dan tidak diputuskan. Ini berguna jika Anda ingin menyimpan embeddings dokumen dan kemudian memuatnya nanti.
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 )Terdapat dalam Docs/2024-10-16_litqa2-splits.json5 adalah ID pertanyaan (sesuai dengan ID pertanyaan litqa2 Lab-Bench) yang digunakan dalam pemisahan kereta dan evaluasi, serta Paper DOI yang digunakan untuk membangun indeks kereta api dan evaluasi split 'Split' Splits ' . Perpecahan tes tetap bertahan.
Harap baca dan kutip makalah berikut jika Anda menggunakan perangkat lunak ini:
@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 }
}