Paperqa2 ist ein Paket für die Abruf von Hochschulungen Augmented Generation (RAG) auf PDFs oder Textdateien mit Schwerpunkt auf der wissenschaftlichen Literatur. In unserem jüngsten Artikel von 2024 finden Sie Beispiele für die übermenschliche Leistung von Paperqa2 bei wissenschaftlichen Aufgaben wie Fragenbeantwortung, Zusammenfassung und Widersprüchlichkeitserkennung.
askIn diesem Beispiel nehmen wir einen Ordner von PDFs mit Forschungspapieren auf, erhalten ihre Metadaten auf magische Weise - einschließlich Zitierzahlen mit einer Rückzugsprüfung, analysieren und zwischen PDFs in einen Volltext -Suchindex und beantworten schließlich die Benutzerfrage mit einem LLM -Agenten.
pip install paper-qa
cd my_papers
pqa ask ' How can carbon nanotubes be manufactured at a large scale? 'Frage: Hat jemand neuronale Netze entworfen, die mit Proteinen oder DNA berechnen?
Die Behauptung, dass neuronale Netze für die Berechnung mit DNA ausgelegt sind, wird von mehreren Quellen unterstützt. Die Arbeit von Qian, Winfree und Bruck zeigt die Verwendung von DNA-Strangverschiebungskaskaden zum Bau neuronaler Netzwerkkomponenten wie künstlichen Neuronen und assoziativen Erinnerungen unter Verwendung eines DNA-basierten Systems (Qian2011neural Seiten 1-2, Qian2011neural Seiten 15-16, Qian2011neural Seiten 54-56). Diese Untersuchung umfasst die Implementierung eines 3-Bit-XOR-GATE und eines Vier-Neuron-Hopfield-Associativ-Speichers, das das Potenzial der DNA für die Berechnung neuronaler Netzwerks zeigt. Darüber hinaus ist die Anwendung von Deep-Lern-Techniken auf die Genomik, die das Computer mit DNA-Sequenzen beinhaltet, gut dokumentiert. Studien haben Faltungsnetzwerke (CNNs) angewendet, um genomische Merkmale wie Transkriptionsfaktorbindung und DNA-Zugänglichkeit vorherzusagen (Eraslan2019deep Seiten 4-5, Eraslan2019Deep Seiten 5-6). Diese Modelle nutzen DNA -Sequenzen als Eingabedaten und verwenden nervige Netzwerke effektiv, um mit DNA zu berechnen. Während die bereitgestellten Auszüge keine explizit erwähnten Proteinbasis neuronaler Netzwerkberechnung erwähnen, unterstreichen sie die Verwendung neuronaler Netzwerke in Aufgaben im Zusammenhang mit Proteinsequenzen, wie z. Der Hauptaugenmerk bleibt jedoch auf DNA-basierter Berechnung.
PaperQA2 ist das beste Agentenlag -Modell für die Arbeit mit wissenschaftlichen Papieren. Hier sind einige Funktionen:
Standardmäßig werden OpenAI -Einbettungen und Modelle mit einem Numpy -Vektor -DB zum Einbetten und Durchsuchungsdokumenten verwendet. Sie können jedoch problemlos andere Modelle für geschlossene Source, Open-Source-Modelle oder Einbettungen verwenden (siehe Details unten).
Paperqa2 hängt von einigen großartigen Bibliotheken/APIs ab, die unser Repo ermöglichen. Hier sind einige in keiner bestimmten Reihenfolge:
Wir haben schon eine Weile an grundlegenden Upgrades an fundamentalen Upgrades gearbeitet und meistens Semver gefolgt. Das heißt, wir haben die Hauptversionsnummer bei jeder Breaking -Änderung erhöht. Dies bringt uns zur aktuellen Hauptversionsnummer V5. Warum rufen Sie das Repo an, das jetzt Paperqa2 genannt wird? Wir wollten jedoch bemerken, dass wir die menschliche Leistung bei vielen wichtigen Metriken übertroffen haben. Wir nennen also willkürlich Version 5 und Onward Paperqa2 und Versionen als paperqa1, um die signifikante Leistungsänderung zu bezeichnen. Wir erkennen an, dass wir im FutureHouse in der Benennung und Zählung in Frage gestellt werden. Daher behalten wir uns das Recht vor, den Namen willkürlich in Papercrow zu ändern.
Version 5 hinzugefügt:
pqaDocs -Objekt Beachten Sie, dass Docs , die aus früheren Versionen von PaperQA eingelegt wurden, mit Version 5 unvereinbar sind und umgebaut werden müssen. Außerdem wurde unsere Mindest -Python -Version auf Python 3.11 erhöht.
Um PaperQa2 zu verstehen, beginnen wir mit den Teilen des zugrunde liegenden Algorithmus. Der Standard -Workflow von Paperqa2 lautet wie folgt:
| Phase | Paperqa2 Aktionen |
|---|---|
| 1. Papiersuche | - Holen Sie sich Kandidatenpapiere von LLM-generierten Keyword-Abfragen |
| - Chunk, einbetten und hinzufügen Kandidatenpapiere zum Zustand | |
| 2. Beweise sammeln | - Anfrage in Vektor einbetten |
| - Rang Top -K -Dokumentbrocken im aktuellen Zustand | |
| - Erstellen Sie im Kontext der aktuellen Abfrage eine bewertete Zusammenfassung jedes Stücks | |
| - Verwenden Sie LLM, um die relevantesten Zusammenfassungen neu zu score und wählen | |
| 3.. Antwort generieren | - Die besten Zusammenfassungen mit dem Kontext in die schnelle Einstellung setzen |
| - Antwort mit Eingabeaufforderung erstellen |
Die Tools können von einem Sprachagenten in beliebiger Reihenfolge aufgerufen werden. Beispielsweise kann ein LLM -Agent eine enge und breite Suche durchführen oder verschiedene Phrasierung für den Sammeln von Beweisen aus dem Antwortschritt generieren.
Installieren Sie für ein Nichtentwicklungs-Setup PaperQA2 (auch bekannt als Version 5) von PYPI. Hinweis Version 5 erfordert Python 3.11+.
pip install paper-qa > =5Für Entwicklungsanlagen finden Sie in der Datei bei der beitragen.md.
PaperQa2 verwendet ein LLM, um zu bedienen. Sie müssen daher entweder eine geeignete API-Key-Umgebungsvariable festlegen (dh export OPENAI_API_KEY=sk-... ) oder ein Open-Source-LLM-Server (dh unter Verwendung von Lamafile. Jedes Litellm-kompatible Modell kann so konfiguriert werden, dass sie mit paperqa2 verwendet werden.
Wenn Sie einen großen Satz von Papieren (100+) indexieren müssen, möchten Sie wahrscheinlich einen API -Schlüssel sowohl für Crossref als auch für Semantic Scholar, mit der Sie vermeiden können, die öffentlichen Ratengrenzen mit diesen Metadatendiensten zu erreichen. Diese können als CROSSREF_API_KEY und SEMANTIC_SCHOLAR_API_KEY -Variablen exportiert werden.
Der schnellste Weg zum Testen von Paperqa2 ist über die CLI. Navigieren Sie zuerst mit einigen Papieren zu einem Verzeichnis und verwenden Sie die pqa CLI:
$ pqa ask ' What manufacturing challenges are unique to bispecific antibodies? 'Sie sehen, dass paperQa2 Ihre lokalen PDF -Dateien indexieren und die erforderlichen Metadaten für jeden von ihnen (mit Crossref und Semantic Scholar) sammeln, diesen Index suchen, dann die Dateien in kontinuierliche Evidenz -Kontexte unterteilen, eingreifen und letztendlich eine Antwort generieren. Wenn dieses Verzeichnis das nächste Mal abgefragt wird, wird Ihr Index bereits erstellt (speichern Sie für alle erkannten Unterschiede, wie z.
Alle früheren Antworten werden indexiert und gespeichert. Sie können sie durch Abfragen über den search -Unterbefehl anzeigen oder auf sie in Ihrem PQA_HOME -Verzeichnis zugreifen, das standardmäßig ~/.pqa/ standardmäßig ist.
$ pqa search -i ' answers ' ' antibodies ' PaperQa2 ist beim Ausführen aus der Befehlszeile sehr konfigurierbar, pqa --help zeigt alle Optionen und kurzen Beschreibungen an. Zum Beispiel mit einer höheren Temperatur zu laufen:
$ pqa --temperature 0.5 ask ' What manufacturing challenges are unique to bispecific antibodies? ' Sie können alle Einstellungen mit pqa view anzeigen. Eine weitere nützliche Sache ist es, in andere Vorlageneinstellungen zu wechseln - zum Beispiel fast ist eine Einstellung, die schneller antwortet und Sie sie mit pqa -s fast view sehen können
Vielleicht haben Sie einige neue Einstellungen, die Sie sparen möchten? Sie können das mit tun
pqa -s my_new_settings --temperature 0.5 --llm foo-bar-5 saveUnd dann können Sie es mit verwenden
pqa -s my_new_settings ask ' What manufacturing challenges are unique to bispecific antibodies? ' Wenn Sie pqa mit einem Befehl ausführen, der eine neue Indexierung erfordert, wird beispielsweise bei der Änderung des Standard -Chunk_Size automatisch für Sie ein neuer Index erstellt.
pqa --parsing.chunk_size 5000 ask ' What manufacturing challenges are unique to bispecific antibodies? ' Sie können auch pqa verwenden, um die Volltext-Suche unter Verwendung von LLMS-Ansicht des Suchbefehls durchzuführen. Speichern wir beispielsweise den Index aus einem Verzeichnis und geben Sie ihm einen Namen:
pqa -i nanomaterials indexJetzt kann ich nach Papieren über Thermoelektrika suchen:
pqa -i nanomaterials search thermoelectricsOder ich kann die normale Frage verwenden
pqa -i nanomaterials ask ' Are there nm scale features in thermoelectric materials? 'Sowohl das CLI als auch das Modul haben vorkonfigurierte Einstellungen auf der Grundlage früherer Leistung und unserer Veröffentlichungen. Sie können wie folgt aufgerufen werden:
pqa --settings < setting name > ask ' Are there nm scale features in thermoelectric materials? ' In Inside paperqa/configs bündeln wir bekannt nützliche Einstellungen:
| Namen einstellen | Beschreibung |
|---|---|
| Hoch_Qualität | Hochleistungsfähiger, relativ teuer (aufgrund von evidence_k = 15) Abfrage mit einem ToolSelector -Agenten. |
| schnell | Einstellung, um Antworten günstig und schnell zu erhalten. |
| Wikicrow | Einstellung, um den Wikipedia -Artikel zu emulieren, der in unserer Wikicrow -Veröffentlichung verwendet wird. |
| Verhütung | Wenn Sie in Papieren Widersprüche finden, sollte Ihre Anfrage eine Behauptung sein, die als Widerspruch (oder nicht) gekennzeichnet werden muss. |
| debuggen | Nützlich für das Debuggen nützlich, jedoch nicht in einer tatsächlichen Anwendung, die über das Debuggen hinausgeht. |
| Tier1_Limits | Einstellungen, die für jede Stufe die OpenAI-Ratengrenzen entsprechen, können Sie tier<1-5>_limits verwenden, um die Stufe anzugeben. |
Wenn Sie beispielsweise mit dem OpenAI Tier 1 -Plan die Ratengrenzen erreichen, können Sie sie in Paperqa2 hinzufügen. Für jede OpenAI-Ebene besteht eine vorgefertigte Einstellung, um die Nutzung zu begrenzen.
pqa --settings ' tier1_limits ' ask ' Are there nm scale features in thermoelectric materials? 'Dadurch wird Ihr System so einschränkt, die Tier1_Limits zu verwenden und Ihre Anfragen zu verlangsamen, um sie aufzunehmen.
Sie können sie auch manuell mit einer beliebigen Ratenlimit -Zeichenfolge angeben, die der Spezifikation im Grenzmodul entspricht:
pqa --summary_llm_config ' {"rate_limit": {"gpt-4o-2024-08-06": "30000 per 1 minute"}} ' ask ' Are there nm scale features in thermoelectric materials? ' Oder durch Hinzufügen in ein Settings , wenn Sie imperativ aufrufen:
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" }},
),
)Der vollständige Workflow von Paperqa2 kann direkt über Python zugreifen:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)Weitere Informationen finden Sie in unseren Installationsdokumenten, um das Paket von PYPI zu installieren.
ask Das Antwortobjekt hat die folgenden Attribute: formatted_answer , answer (Antwort allein), question und context (die Zusammenfassungen der für die Antwort gefundenen Passagen). ask verwendet das Tool SearchPapers , mit dem ein lokaler Index von Dateien abfragt. Sie können diesen Speicherort über das Settings angeben:
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 ist nur ein Convenience -Wrapper um den realen Einstiegspunkt, auf den Sie zugegriffen werden können, wenn Sie gleichzeitig asynchrone Workloads ausführen möchten:
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" ),
)
) Der Standardagent verwendet einen LLM -basierten Agenten, aber Sie können auch einen "fake" Agenten angeben, um einen hart codierten Call -Pfad der Suche zu verwenden -> Evidenz sammeln -> Antwort zur Reduzierung der Token -Nutzung.
Wenn Sie eine feinkörnige Kontrolle bevorzugen und dem DOCS -Objekt selbst Objekt selbst hinzufügen möchten (anstatt das Suchwerkzeug zu verwenden), kann die zuvor vorhandene Docs -Objektoberfläche verwendet werden:
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 wird so asynchron geschrieben. Die synchrone API ist nur eine Wrapper um den Async. Hier sind die Methoden und ihre async Äquivalente:
| Synchronisation | Asynchron |
|---|---|
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 |
Die synchrone Version ruft die asynchronisierte Version in einer Schleife auf. Die meisten modernen Python -Umgebungen unterstützen async nativ (einschließlich Jupyter -Notizbücher!). So können Sie dies in einem Jupyter -Notizbuch tun:
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 ()) Standardmäßig werden OpenAI-Modelle mit gpt-4o-2024-08-06 sowohl für den Wiederaufbau- als auch für den Zusammenfassungsschritt, für die Einstellung summary_llm und für den Antwortschritt, die llm Einstellung, für den Antwortschritt verwendet. Sie können dies einfach einstellen:
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"
),
) Sie können anthropisch oder ein anderes Modell verwenden, das von litellm unterstützt wird:
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"
),
)Sie können llama.cpp verwenden, um die LLM zu sein. Beachten Sie, dass Sie relativ große Modelle verwenden sollten, da paperQa2 viele Anweisungen folgen muss. Sie werden mit 7B -Modellen keine gute Leistung erzielen.
Der einfachste Weg, um eine Einrichtung zu erhalten, besteht darin, eine Lama -Datei herunterzuladen und sie mit -cb -np 4 -a my-llm-model --embedding auszuführen, die kontinuierliche Chargen und Einbettungen ermöglicht.
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 ,
),
) Models, die mit ollama gehostet werden, werden ebenfalls unterstützt. Um das folgende Beispiel auszuführen, stellen Sie sicher, dass Sie Lama3.2 und Mxbai-Embed-Large über Ollama heruntergeladen haben.
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 standardmäßig für die Verwendung von OpenAI ( text-embedding-3-small ) Einbettungen, verfügt jedoch über flexible Optionen für Vektorspeicher und Einbetten der Auswahlmöglichkeiten. Der einfachste Weg, um eine Einbettung zu ändern, ist das embedding in den Settings :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "text-embedding-3-large" ),
) embedding akzeptiert einen von LitellM unterstützten Einbettungsmodellnamen. Paperqa2 unterstützt auch einen Einbettungseingang von "hybrid-<model_name>" IE "hybrid-text-embedding-3-small" um ein Hybrid-Sparse-Keyword (basierend auf einem Token-Modulo-Einbettung) und einer Einbettung einer dichten Vektor zu verwenden, wobei jedes Litellm-Modell kann kann im dichten Modellnamen verwendet werden. "sparse" kann verwendet werden, um nur ein spärliches Schlüsselwort zu verwenden.
Einbettungsmodelle werden verwendet, um den Index von PaperQA2 des Volltext-Einbettungsvektoren ( texts_index Argument) zu erstellen. Das Einbettungsmodell kann als Einstellung angegeben werden, wenn Sie dem Docs -Objekt neue Papiere hinzufügen:
from paperqa import Docs , Settings
docs = Docs ()
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
docs . add ( doc , settings = Settings ( embedding = "text-embedding-large-3" )) Beachten Sie, dass Paperqa2 Numpy als dichter Vektor Store verwendet. Das Design der Verwendung einer Keyword -Suche reduziert zunächst die Anzahl der für jede Antwort auf eine relativ geringe Zahl <1k erforderliche Anzahl von Brocken. Daher ist NumpyVectorStore ein guter Ausgangspunkt, es ist ein einfacher In-Memory-Geschäft ohne Index. Wenn jedoch ein überdurchschnittlicher Vektor-Geschäft benötigt wird, fehlen uns derzeit hier.
Die Hybrideinbettungen können angepasst werden:
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 ) Die spärlichen Einbettungsmodelle (Keyword) -Modelle (Sparse Embedding) standardmäßig 256 Dimensionen, dies kann jedoch über das ndim -Argument angegeben werden.
Sie können ein SentenceTransformerEmbeddingModel -Modell verwenden, wenn Sie sentence-transformers installieren, eine lokale Einbettungsbibliothek mit Unterstützung für Huggingface-Modelle und vieles mehr. Sie können es installieren, indem Sie die local Extras hinzufügen.
pip install paper-qa[local] und dann Präfix-Einbettungsmodellnamen mit 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" ),
)oder mit einem Hybridmodell
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" ),
) Sie können die Anzahl der Quellen (Textabschnitte) anpassen, um die Nutzung des Tokens zu reduzieren, oder mehr Kontext hinzufügen. k bezieht sich auf die relevantesten und vielfältigsten (Mai aus verschiedenen Quellen). Jede Passage wird an die LLM gesendet, um zusammenzufassen oder festzustellen, ob sie irrelevant ist. Nach diesem Schritt wird eine Grenze von max_sources angewendet, damit die endgültige Antwort in das LLM -Kontextfenster passen kann. Somit ist k > max_sources und max_sources die Anzahl der in der endgültigen Antwort verwendete Quellen.
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 ,
)Sie müssen keine Papiere verwenden - Sie können Code oder RAW -HTML verwenden. Beachten Sie, dass sich dieses Tool auf die Beantwortung von Fragen konzentriert, sodass es nicht gut abschneidet, Code zu schreiben. Ein Hinweis ist, dass das Tool keine Zitate aus dem Code schließen kann, sodass Sie es selbst zur Verfügung stellen müssen.
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 )Möglicherweise möchten Sie Parsen -Texte und Einbettungen in eine externe Datenbank oder Datei zwischenspeichern. Sie können dann direkt ein DOCS -Objekt aus diesen erstellen:
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 ) Die Indizes werden standardmäßig in das Home -Verzeichnis platziert. Dies kann über die Umgebungsvariable PQA_HOME gesteuert werden.
Indizes werden durch Lesen von Dateien in den Settings.paper_directory erstellt. Standardmäßig lesen wir rekursiv aus Unterverzeichnissen des Papierverzeichnisses, es sei denn, die Einstellungen von Settings.index_recursively deaktiviert. Das Papierverzeichnis wird in keiner Weise geändert, es wird nur gelesen.
Der Indexierungsprozess versucht, Papiermetadaten wie Titel und DOI unter Verwendung von LLM-betriebenen Textverarbeitung zu schließen. Sie können diesen Punkt der Unsicherheit anhand einer "Manifest" -Datei vermeiden, bei der es sich um ein CSV handelt, das drei Spalten enthält (Reihenfolge spielt keine Rolle):
file_location : Relativer Pfad zum PDF des Papiers innerhalb des Indexverzeichnissesdoi : doi des Papierstitle : Titel des PapiersDurch die Bereitstellung dieser Informationen stellen wir sicher, dass Abfragen zu Metadatenanbietern wie CrossRef korrekt sind.
Die lokalen Suchindizes werden basierend auf einem Hash des aktuellen Settings erstellt. Stellen Sie also sicher, dass Sie das paper_directory in Ihrem Settings ordnungsgemäß angeben. Im Allgemeinen ist es ratsam zu:
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 ,
)
) In paperqa/agents/task.py finden Sie:
GradablePaperQAEnvironment : Eine Umgebung, die Antworten bei einer Bewertungsfunktion bewerten kann.LitQAv2TaskDataset : Ein Task -Datensatz, mit dem LitQA V2 aus dem Umarmungsgesicht gezogen und eine GradablePaperQAEnvironment pro Frage erstellt wurdeHier ist ein Beispiel dafür, wie man sie verwendet:
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 )Eines der leistungsstärksten Merkmale von PaperQA2 ist die Fähigkeit, Daten aus mehreren Metadatenquellen zu kombinieren. Beispielsweise kann Unpaywall einen Open -Access -Status/direkten Links zu PDFs bereitstellen, Crossref kann Bibtex liefern und Semantic Scholar kann Zitierlizenzen bereitstellen. Hier ist eine kurze Demo darüber, wie dies geht:
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 Der client.query soll nach genauen Titelübereinstimmungen prüfen. Es ist ein bisschen robust (gern ein Wort, das ein Wort fehlt). Es gibt jedoch Duplikate für Titel - so können Sie auch Autoren hinzufügen, sich zu disambiguieren. Oder Sie können einen DOI direkt client.query(doi="10.1038/s42256-024-00832-8") .
Wenn Sie dies in großem Maßstab tun, möchten Sie möglicherweise nicht ALL_CLIENTS verwenden (einfach das Argument weglassen) und können angeben, welche spezifischen Felder Sie beschleunigen möchten. Zum Beispiel:
details = await client . query (
title = "Augmenting large language models with chemistry tools" ,
authors = [ "Andres M. Bran" , "Sam Cox" ],
fields = [ "title" , "doi" ],
)Wird viel schneller zurückkehren als die erste Abfrage und wir werden sicher sein, dass die Autoren übereinstimmen.
Nun, das ist eine wirklich gute Frage! Es ist wahrscheinlich am besten, nur PDFs von Papieren herunterzuladen, von denen Sie glauben, dass sie Ihre Frage beantworten und von dort aus beginnen.
Es ist schon eine Weile her, dass wir dies getestet haben - also lassen Sie uns wissen, ob es auf Probleme geht!
Wenn Sie Zotero verwenden, um Ihre persönliche Bibliographie zu organisieren, können Sie die paperqa.contrib.ZoteroDB verwenden, um Papiere aus Ihrer Bibliothek abzufragen, die auf Pyzotero beruht.
Installieren Sie pyzotero über das zotero Extra für diese Funktion:
pip install paperqa[zotero]Beachten Sie zunächst, dass PaperQA2 die PDFs von Papieren in der Datenbank speichert, sodass alle relevanten Papiere in Ihrer Datenbank gespeichert werden sollten. Sie können Zotero dazu bringen, dies automatisch zu tun, indem Sie die Referenzen hervorheben, die Sie abrufen, mit der rechten Maustaste klicken und "verfügbare PDFs finden" auswählen. Sie können PDFs auch manuell auf jede Referenz ziehen.
Um Papiere herunterzuladen, müssen Sie einen API -Schlüssel für Ihr Konto erhalten.
ZOTERO_USER_ID .https://www.zotero.org/groups/groupname Die ID ist die Ganzzahl nach /gruppen /. ( H/T Pyzotero! )ZOTERO_API_KEY .Damit können wir Papiere aus unserer Bibliothek herunterladen und sie zu Paperqa2 hinzufügen:
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 ) Dadurch wird die ersten 20 Artikel in Ihre Zotero -Datenbank heruntergeladen und dem Docs -Objekt hinzugefügt.
Wir können auch bestimmte Abfragen unserer Zotero -Bibliothek durchführen und die Ergebnisse iterieren:
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 ) Sie können mehr über die Suchsyntax lesen, indem Sie zotero.iterate? in Ipython.
Wenn Sie nach Papieren außerhalb Ihrer eigenen Sammlung suchen möchten, habe ich ein nicht verwandtes Projekt namens Paper-Scraper gefunden, das so aussieht, als könnte es helfen. Aber Vorsicht, dieses Projekt sieht so aus, als würde es einige Scraping -Tools verwenden, die möglicherweise gegen die Rechte des Publisher verstoßen oder in einer Grauzone der Legalität liegen.
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 )Um eine Funktion auf jedem Stück LLM -Abschlüsse auszuführen, müssen Sie eine Funktion bereitstellen, die auf jedem Stück ausgeführt werden kann. Um beispielsweise eine Schreibmaschinenansicht der Fertigstellung zu erhalten, können Sie dies tun:
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 ],
) Im Allgemeinen werden Einbettungen zwischengespeichert, wenn Sie ein Docs einweihen, unabhängig davon, welchen Vektorspeicher Sie verwenden. Solange Sie Ihr zugrunde liegendes Docs -Objekt speichern, sollten Sie in der Lage sein, Ihre Dokumente erneut einzudämmen.
Sie können die Eingabeaufforderungen mit den Einstellungen anpassen.
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 )Nach der obigen Syntax können Sie auch Eingabeaufforderungen einfügen, die nach der Abfrage und vor der Abfrage ausgeführt werden. Sie können dies beispielsweise verwenden, um die Antwort zu kritisieren.
Intern bei FutureHouse haben wir etwas andere Werkzeuge. Wir versuchen, einige von ihnen wie Citation Traversal in dieses Repo zu bringen. Wir haben jedoch APIs und Lizenzen, um auf Forschungsarbeiten zuzugreifen, die wir nicht offen teilen können. In ähnlicher Weise beginnen wir in den Ergebnissen unserer Forschungsarbeiten nicht mit den bekannten relevanten PDFs. Unser Agent muss sie mithilfe von Schlüsselwortsuche über alle Papiere und nicht nur mit einer Teilmenge identifizieren. Wir stimmen allmählich diese beiden Versionen von PaperQA aus, aber bis es eine Open-Source-Möglichkeit gibt, sich frei auf Papiere zuzugreifen (auch nur Open-Source-Papiere), müssen Sie selbst PDFs zur Verfügung stellen.
Langchain und Llamaindex sind beide Rahmenbedingungen für die Arbeit mit LLM -Anwendungen, mit Abstraktionen, die für agierende Workflows und die Abruferzeugung abgerufen werden.
Im Laufe der Zeit entschied sich das Paperqa-Team im Laufe der Zeit, um Framework-Agnostic zu werden, stattdessen LLM-Treiber auf LitellM und ohne Pydantic für seine Werkzeuge auszulagern. Paperqa konzentriert sich auf wissenschaftliche Papiere und ihre Metadaten.
Paperqa kann entweder Lamaindex oder Langchain neu implementiert werden. Zum Beispiel kann unser GatherEvidence Tool als Retriever mit einer LLM-basierten erneuten Rang- und Kontextzusammenfassung neu implementiert werden. Es gibt ähnliche Arbeiten mit der Baumantwortmethode in Lamaindex.
Die Docs -Klasse kann eingelegt und ungehindert werden. Dies ist nützlich, wenn Sie die Einbettungen der Dokumente speichern und später laden möchten.
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 )In DOCS/2024-10-16_LITQA2-Splits.json5 sind die Fragen-IDs (entsprechen der LitQA2-Fragen-IDs von Laber-Bench), die in den Zug- und Bewertungspaltungen verwendet werden, sowie Papier-DOIs, die zum Bau des Zug- und Bewertungsaufteils verwendet werden . Die Testspaltung bleibt übernommen.
Bitte lesen und zitieren Sie die folgenden Papiere, wenn Sie diese Software verwenden:
@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 }
}