Paperqa2 es un paquete para realizar una generación aumentada de recuperación de alta precisión (RAG) en PDF o archivos de texto, con un enfoque en la literatura científica. Vea nuestro reciente artículo de 2024 para ver ejemplos del rendimiento sobrehumano de Paperqa2 en tareas científicas como respuesta de preguntas, resumen y detección de contradicciones.
ask manualmenteEn este ejemplo, tomamos una carpeta de PDF de documentos de investigación, obtenemos mágicamente sus metadatos, incluidos los recuentos de citas con una verificación de retracción, luego PDFS de análisis y caché en un índice de búsqueda de texto completo, y finalmente responden la pregunta del usuario con un agente LLM.
pip install paper-qa
cd my_papers
pqa ask ' How can carbon nanotubes be manufactured at a large scale? 'Pregunta: ¿Alguien ha diseñado redes neuronales que calculen con proteínas o ADN?
La afirmación de que las redes neuronales han sido diseñadas para calcular con ADN es compatible con múltiples fuentes. El trabajo de Qian, Winfree y Bruck demuestra el uso de cascadas de desplazamiento de la cadena de ADN para construir componentes de redes neuronales, como neuronas artificiales y recuerdos asociativos, utilizando un sistema basado en ADN (Páginas Qian2011Neural 1-2, Páginas de Nian2011Neural 15-16, Qian2011 Páginas de las Páginas 54-56). Esta investigación incluye la implementación de una puerta XOR de 3 bits y una memoria asociativa de Hopfield de cuatro neuronas, que muestra el potencial del ADN para el cálculo de la red neuronal. Además, la aplicación de técnicas de aprendizaje profundo a la genómica, que implica la calculación con secuencias de ADN, está bien documentada. Los estudios han aplicado redes neuronales convolucionales (CNN) para predecir características genómicas como la unión del factor de transcripción y la accesibilidad del ADN (Páginas Eraslan2019Deep 4-5, Páginas Eraslan2019Deep 5-6). Estos modelos aprovechan las secuencias de ADN como datos de entrada, utilizando efectivamente redes neuronales para calcular con ADN. Si bien los extractos proporcionados no mencionan explícitamente el cálculo de la red neuronal basada en proteínas, destacan el uso de redes neuronales en tareas relacionadas con secuencias de proteínas, como la predicción de la unión de ADN-proteína (Páginas Convolutivas Zeng2016 1-2). Sin embargo, el enfoque principal permanece en el cálculo basado en el ADN.
Paperqa2 está diseñado para ser el mejor modelo de trapo de agente para trabajar con documentos científicos. Aquí hay algunas características:
De manera predeterminada, utiliza incrustaciones y modelos de OpenAI con un Vector DB numpy para incrustar y buscar documentos. Sin embargo, puede usar fácilmente otros modelos o integridades de código abierto de código cerrado (ver detalles a continuación).
Paperqa2 depende de algunas bibliotecas/API increíbles que hacen posible nuestro repositorio. Aquí hay algunos en ningún orden en particular:
Hemos estado trabajando duro en actualizaciones fundamentales durante un tiempo y seguimos principalmente a Semver. lo que significa que hemos incrementado el número de versión principal en cada cambio de ruptura. Esto nos lleva al número de versión principal actual V5. Entonces, ¿por qué llamado el repositorio ahora se llama Paperqa2? Sin embargo, queríamos comentar sobre el hecho de que hemos superado el rendimiento humano en muchas métricas importantes. Por lo tanto, llamamos arbitrariamente la versión 5 y el papelqa2, y las versiones ante él como PaperQA1 para denotar el cambio significativo en el rendimiento. Reconocemos que tenemos el desafío de nombrar y contar en Futurehouse, por lo que nos reservamos el derecho en cualquier momento de cambiar arbitrariamente el nombre a PaperCrow.
Versión 5 agregada:
pqaDocs Tenga en cuenta que los objetos Docs en escabeche de las versiones anteriores de PaperQA son incompatibles con la versión 5, y deberán ser reconstruidos. Además, nuestra versión mínima de Python se incrementó a Python 3.11.
Para comprender Paperqa2, comencemos con las piezas del algoritmo subyacente. El flujo de trabajo predeterminado de Paperqa2 es el siguiente:
| Fase | Acciones de Paperqa2 |
|---|---|
| 1. Búsqueda de papel | - Obtenga documentos candidatos de la consulta de palabras clave generadas por LLM |
| - fragmentar, incrustar y agregar documentos candidatos al estado | |
| 2. Reúna evidencia | - Incorporar la consulta en el vector |
| - Rango de clasificación de los trozos de documento K en el estado actual | |
| - Crear resumen puntaje de cada fragmento en el contexto de la consulta actual | |
| - Use LLM para volver a clasificar y seleccionar los resúmenes más relevantes | |
| 3. Generar respuesta | - Ponga los mejores resúmenes en el contexto |
| - Generar respuesta con el aviso |
Las herramientas pueden ser invocadas en cualquier orden por un agente de idiomas. Por ejemplo, un agente de LLM puede hacer una búsqueda estrecha y amplia, o usar diferentes frases para el paso de evidencia de recopilación del paso de respuesta de generación.
Para una configuración de no desarrollo, instale PaperQA2 (también conocido como versión 5) de PYPI. Nota La versión 5 requiere Python 3.11+.
pip install paper-qa > =5Para la configuración del desarrollo, consulte el archivo contribuyente.md.
Paperqa2 utiliza un LLM para operar, por lo que deberá establecer una variable de entorno de clave API apropiada (es decir, export OPENAI_API_KEY=sk-... ) o configurar un servidor LLM de código abierto (es decir, usando llamaFile. Cualquier modelo compatible con litellm puede estar configurado para usar con Paperqa2.
Si necesita indexar un gran conjunto de documentos (más de 100), es probable que desee una clave API tanto para CrossRef como para Semantic Scholar, lo que le permitirá evitar alcanzar los límites de tarifa pública utilizando estos servicios de metadatos. Esos se pueden exportar como variables CROSSREF_API_KEY y SEMANTIC_SCHOLAR_API_KEY .
La forma más rápida de probar PaperQA2 es a través de la CLI. Primero navegue a un directorio con algunos documentos y use la CLI pqa :
$ pqa ask ' What manufacturing challenges are unique to bispecific antibodies? 'Verá que PaperQA2 indexará sus archivos PDF locales, recopilando los metadatos necesarios para cada uno de ellos (usando CrossRef y Semantic Scholar), busque sobre ese índice, luego divide los archivos en contextos de evidencia fragmentados, clasifiquelos y finalmente genere una respuesta. La próxima vez que se consulte este directorio, su índice ya se construirá (salvo para cualquier diferencia detectada, como los nuevos documentos agregados), por lo que se omitirá los pasos de indexación y fragmentación.
Todas las respuestas anteriores serán indexadas y almacenadas, puede verlas consultando a través del subcomando search , o acceder a ellas usted mismo en su directorio PQA_HOME , que vale por defecto a ~/.pqa/ .
$ pqa search -i ' answers ' ' antibodies ' Paperqa2 es altamente configurable, cuando se ejecuta desde la línea de comandos, pqa --help muestra todas las opciones y descripciones cortas. Por ejemplo, ejecutar con una temperatura más alta:
$ pqa --temperature 0.5 ask ' What manufacturing challenges are unique to bispecific antibodies? ' Puede ver todas las configuraciones con pqa view . Otra cosa útil es cambiar a otras configuraciones plantadas; por ejemplo, fast es una configuración que responde más rápidamente y puede verla con pqa -s fast view
¿Quizás tienes una nueva configuración que quieres guardar? Puedes hacer eso con
pqa -s my_new_settings --temperature 0.5 --llm foo-bar-5 saveY luego puedes usarlo con
pqa -s my_new_settings ask ' What manufacturing challenges are unique to bispecific antibodies? ' Si ejecuta pqa con un comando que requiere una nueva indexación, digamos que si cambia el CHUNK_SIZE predeterminado, se creará automáticamente un nuevo índice para usted.
pqa --parsing.chunk_size 5000 ask ' What manufacturing challenges are unique to bispecific antibodies? ' También puede usar pqa para realizar una búsqueda de texto completo con el uso de LLMS ver el comando de búsqueda. Por ejemplo, guardemos el índice de un directorio y le dé un nombre:
pqa -i nanomaterials indexAhora puedo buscar documentos sobre termoeléctrico:
pqa -i nanomaterials search thermoelectricso puedo usar la pregunta normal
pqa -i nanomaterials ask ' Are there nm scale features in thermoelectric materials? 'Tanto la CLI como el módulo tienen configuraciones preconfiguradas basadas en el rendimiento anterior y nuestras publicaciones, se pueden invocar de la siguiente manera:
pqa --settings < setting name > ask ' Are there nm scale features in thermoelectric materials? ' Inside paperqa/configs Agrupamos configuraciones útiles conocidas:
| Nombre de configuración | Descripción |
|---|---|
| alta calidad | Altamente desempeñada, relativamente costosa (debido a la consulta evidence_k = 15) utilizando un agente ToolSelector . |
| rápido | Configuración para obtener respuestas de manera económica y rápida. |
| wikicrow | Establecimiento para emular la redacción de artículos de Wikipedia utilizados en nuestra publicación de Wikicrow. |
| contracio | Configuración para encontrar contradicciones en los documentos, su consulta debe ser una afirmación que debe marcarse como una contradicción (o no). |
| depurar | Establecer útil únicamente para la depuración, pero no en ninguna aplicación real más allá de la depuración. |
| Tier1_limits | Configuración que coinciden con los límites de velocidad OpenAI para cada nivel, puede usar tier<1-5>_limits para especificar el nivel. |
Si está llegando a los límites de la velocidad, digamos con el plan de nivel 1 Operai, puede agregarlos a Paperqa2. Para cada nivel Operai, existe una configuración preconstruida para limitar el uso.
pqa --settings ' tier1_limits ' ask ' Are there nm scale features in thermoelectric materials? 'Esto limitará su sistema para usar los Tier1_Limits y ralentizar sus consultas para acomodar.
También puede especificarlos manualmente con cualquier cadena de límite de tasa que coincida con la especificación en el módulo de límites:
pqa --summary_llm_config ' {"rate_limit": {"gpt-4o-2024-08-06": "30000 per 1 minute"}} ' ask ' Are there nm scale features in thermoelectric materials? ' O agregando a un objeto Settings , si llama imperativamente:
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" }},
),
)Se puede acceder al flujo de trabajo completo de Paperqa2 a través de Python directamente:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)Consulte nuestros documentos de instalación sobre cómo instalar el paquete desde PYPI.
ask manualmente El objeto de respuesta tiene los siguientes atributos: formatted_answer , answer (respuesta solo), question y context (los resúmenes de pasajes encontrados para respuesta). ask utilizará la herramienta SearchPapers , que consultará un índice local de archivos, puede especificar esta ubicación a través del objeto 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 es solo un envoltorio de conveniencia alrededor del punto de entrada real, al que se puede acceder si desea ejecutar cargas de trabajo asíncronas concurrentes:
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" ),
)
) El agente predeterminado utilizará un agente basado en LLM, pero también puede especificar un agente "fake" para usar una ruta de búsqueda de llamadas codificada -> recopilar evidencia -> Respuesta para reducir el uso del token.
Si prefiere el control de grano fino y desea agregar objetos al objeto Docs usted mismo (en lugar de usar la herramienta de búsqueda), entonces se puede usar la interfaz de objeto Docs previamente existente:
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 se escribe para ser usado de forma asincrónica. La API sincrónica es solo un envoltorio alrededor del Async. Aquí están los métodos y sus equivalentes async :
| Sincronización | Asíncrata |
|---|---|
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 |
La versión sincrónica solo llama a la versión Async en un bucle. La mayoría de los entornos de Python modernos admiten async forma nativa (¡incluidas los cuadernos Jupyter!). Entonces puedes hacer esto en un cuaderno de 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 ()) De manera predeterminada, utiliza modelos OpenAI con gpt-4o-2024-08-06 tanto para el paso de rango como para el paso de resumen, la configuración summary_llm y para el paso de respuesta, la configuración llm . Puedes ajustar esto fácilmente:
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"
),
) Puede usar antrópico o cualquier otro modelo compatible con 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"
),
)Puede usar llama.cpp para ser el LLM. Tenga en cuenta que debe usar modelos relativamente grandes, porque PaperQA2 requiere seguir muchas instrucciones. No obtendrá un buen rendimiento con modelos 7B.
La forma más fácil de configurar es descargar un archivo de LLAMA y ejecutarlo con -cb -np 4 -a my-llm-model --embedding lo que permitirá lotes e incrustaciones continuas.
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 ,
),
) Los modelos alojados con ollama también son compatibles. Para ejecutar el ejemplo a continuación, asegúrese de haber descargado Llama3.2 y MXbai-Embed-Large a través de 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 es predeterminado para usar incrustaciones de OpenAI ( text-embedding-3-small ), pero tiene opciones flexibles para las tiendas vectoriales y las opciones de incrustación. La forma más sencilla de cambiar una incrustación es a través del argumento embedding al constructor de objeto Settings :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "text-embedding-3-large" ),
) embedding acepta cualquier nombre del modelo de incrustación compatible con Litellm. Paperqa2 también admite una entrada de incrustación de "hybrid-<model_name>" es decir "hybrid-text-embedding-3-small" para usar una palabra clave dispersa híbrida (basada en una incrustación de módulos tokens) e incrustación vectorial densa, donde cualquier modelo de litellm puede ser utilizado en el nombre del modelo denso. "sparse" se puede usar para usar solo una palabra clave escasa.
Los modelos de incrustación se utilizan para crear el índice de PaperQA2 de los vectores de incrustación de texto completo (argumento texts_index ). El modelo de incrustación se puede especificar como una configuración cuando está agregando nuevos documentos al objeto 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" )) Tenga en cuenta que Paperqa2 usa Numpy como una tienda vectorial densa. Su diseño de usar una búsqueda de palabras clave inicialmente reduce el número de fragmentos necesarios para cada respuesta a un número relativamente pequeño <1K. Por lo tanto, NumpyVectorStore es un buen lugar para comenzar, es una tienda simple en memoria, sin un índice. Sin embargo, si se necesita una tienda vectorial más grande que la memoria, actualmente nos falta aquí.
Los incrustaciones híbridas se pueden personalizar:
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 ) Los modelos de incrustación dispersos (palabra clave) predeterminada tienen 256 dimensiones, pero esto se puede especificar a través del argumento ndim .
Puede usar un modelo de SentenceTransformerEmbeddingModel si instala sentence-transformers , que es una biblioteca de incrustación local con soporte para los modelos Huggingface y más. Puede instalarlo agregando los extras local .
pip install paper-qa[local] y luego prefijo incrustar los nombres de los modelos con 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" ),
)o con un modelo híbrido
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" ),
) Puede ajustar el número de fuentes (pasajes del texto) para reducir el uso del token o agregar más contexto. k se refiere a los mejores pasajes más relevantes y diversos (de diferentes fuentes). Cada pasaje se envía al LLM para resumir o determinar si es irrelevante. Después de este paso, se aplica un límite de max_sources para que la respuesta final pueda caber en la ventana de contexto LLM. Por lo tanto, k > max_sources y max_sources es el número de fuentes utilizadas en la respuesta final.
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 ,
)No necesita usar documentos: puede usar código o HTML sin procesar. Tenga en cuenta que esta herramienta se centra en responder preguntas, por lo que no funcionará bien al escribir código. Una nota es que la herramienta no puede inferir citas del código, por lo que deberá proporcionarlas usted mismo.
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 )Es posible que desee almacenar textos e incrustaciones analizados en una base de datos o archivo externa. Luego puede construir un objeto DOCS a partir de aquellos directamente:
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 ) Los índices se colocarán en el directorio de inicio de forma predeterminada. Esto se puede controlar a través de la variable de entorno PQA_HOME .
Los índices se realizan leyendo archivos en la Settings.paper_directory . De manera predeterminada, leemos recursivamente a los subdirectorios del directorio de papel, a menos que se deshabilite usando Settings.index_recursively . El directorio de papel no se modifica de ninguna manera, solo se lee.
El proceso de indexación intenta inferir metadatos en papel como el título y el DOI utilizando el procesamiento de texto con LLM. Puede evitar este punto de incertidumbre utilizando un archivo "manifiesto", que es un CSV que contiene tres columnas (el orden no importa):
file_location : ruta relativa al PDF del documento dentro del directorio de índicedoi : doi del periódicotitle : Título del periódicoAl proporcionar esta información, aseguramos que las consultas a los proveedores de metadatos como CrossRef sean precisos.
Los índices de búsqueda locales se construyen en función de un hash del objeto Settings actual. Así que asegúrese de especificar correctamente el objeto paper_directory a su objeto Settings . En general, es aconsejable:
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 ,
)
) En paperqa/agents/task.py , encontrará:
GradablePaperQAEnvironment : un entorno que puede calificar las respuestas dada una función de evaluación.LitQAv2TaskDataset : un conjunto de datos de tareas diseñado para extraer litqa v2 de abrazando cara y crear un GradablePaperQAEnvironment por preguntaAquí hay un ejemplo de cómo usarlos:
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 )Una de las características más poderosas de Paperqa2 es su capacidad para combinar datos de múltiples fuentes de metadatos. Por ejemplo, UpayWall puede proporcionar un estado de acceso abierto/enlaces directos a PDFS, CrossRef puede proporcionar bibtex y Semantic Scholar puede proporcionar licencias de citas. Aquí hay una breve demostración de cómo hacer esto:
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 El client.query está destinado a verificar si hay coincidencias exactas de título. Es un poco robusto (como cargar, perder una palabra). Sin embargo, hay duplicados para los títulos, por lo que también puede agregar autores para desambiguar. O puede proporcionar un DOI directamente client.query(doi="10.1038/s42256-024-00832-8") .
Si está haciendo esto a gran escala, es posible que no desee usar ALL_CLIENTS (solo omita el argumento) y puede especificar qué campos específicos desea acelerar las consultas. Por ejemplo:
details = await client . query (
title = "Augmenting large language models with chemistry tools" ,
authors = [ "Andres M. Bran" , "Sam Cox" ],
fields = [ "title" , "doi" ],
)Volverá mucho más rápido que la primera consulta y estaremos seguros de que los autores coinciden.
Bueno, ¡esa es una muy buena pregunta! Probablemente sea mejor descargar PDF de documentos que cree que ayudará a responder a su pregunta y comenzará desde allí.
Ha pasado un tiempo desde que probamos esto, ¡así que háganos saber si se encuentra con problemas!
Si usa Zotero para organizar su bibliografía personal, puede usar el paperqa.contrib.ZoteroDB para consultar los documentos de su biblioteca, que se basa en Pyzotero.
Instale pyzotero a través del zotero Extra para esta función:
pip install paperqa[zotero]Primero, tenga en cuenta que PaperQA2 analiza los PDF de los documentos para almacenar en la base de datos, por lo que todos los documentos relevantes deben tener PDF almacenados dentro de su base de datos. Puede hacer que Zotero haga esto automáticamente resaltando las referencias que desea recuperar, hacer clic derecho y seleccionar "Buscar PDFS disponibles" . También puede arrastrar y soltar PDF manualmente en cada referencia.
Para descargar documentos, debe obtener una clave API para su cuenta.
ZOTERO_USER_ID .https://www.zotero.org/groups/groupname , y pasee el enlace de configuración. La identificación es el entero después /grupos /. ( ¡H/T Pyzotero! )ZOTERO_API_KEY .Con esto, podemos descargar documentos de nuestra biblioteca y agregarlos a 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 ) que descargará los primeros 20 documentos en su base de datos Zotero y los agregará al objeto Docs .
También podemos hacer consultas específicas de nuestra biblioteca Zotero e iterar sobre los resultados:
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 ) Puede leer más sobre la sintaxis de búsqueda escribiendo zotero.iterate? En Ipython.
Si desea buscar documentos fuera de su propia colección, he encontrado un proyecto no relacionado llamado scraper de papel que parece que podría ayudar. Pero tenga cuidado, este proyecto parece que utiliza algunas herramientas de raspado que pueden violar los derechos de los editores o estar en un área gris de legalidad.
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 )Para ejecutar una función en cada parte de las completaciones de LLM, debe proporcionar una función que se pueda ejecutar en cada fragmento. Por ejemplo, para obtener una vista de máquina de escribir de las finalizaciones, puede hacer:
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 ],
) En general, las embedidas se almacenan en caché cuando se encoge los Docs independientemente de la tienda vectorial que use. Entonces, siempre que guarde su objeto Docs subyacente, debería poder evitar volver a incrustar sus documentos.
Puede personalizar cualquiera de las indicaciones utilizando la configuración.
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 )Después de la sintaxis anterior, también puede incluir indicaciones que se ejecutan después de la consulta y antes de la consulta. Por ejemplo, puede usar esto para criticar la respuesta.
Internamente en Futurehouse, tenemos un conjunto de herramientas ligeramente diferente. Estamos tratando de llevar algunos de ellos, como el recorrido de citas, en este repositorio. Sin embargo, tenemos API y licencias para acceder a trabajos de investigación que no podemos compartir abiertamente. Del mismo modo, en los resultados de nuestros trabajos de investigación no comenzamos con los PDF relevantes conocidos. Nuestro agente tiene que identificarlos utilizando la búsqueda de palabras clave en todos los documentos, en lugar de solo un subconjunto. Poco a poco estamos alineando estas dos versiones de Paperqa, pero hasta que haya una forma de código abierto de acceder libremente a los documentos (incluso solo documentos de código abierto), deberá proporcionar PDFS usted mismo.
Langchain y Llamaindex son marcos para trabajar con aplicaciones LLM, con abstracciones hechas para flujos de trabajo de agente y generación aumentada de recuperación.
Con el tiempo, el equipo de Paperqa con el tiempo eligió convertirse en el agnóstico del marco, en lugar de externalizar a los conductores de LLM a litellm y ningún marco además de Pydantic para sus herramientas. Paperqa se centra en los documentos científicos y sus metadatos.
Paperqa se puede reimplementar usando llameAndex o langchain. Por ejemplo, nuestra herramienta GatherEvidence puede reimplementar como un retriever con un resumen de rango y contextual basado en LLM. Existe un trabajo similar con el método de respuesta del árbol en Llamaindex.
La clase Docs puede ser encurtido y sin matorral. Esto es útil si desea guardar los incrustaciones de los documentos y luego cargarlos más tarde.
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 )Contenido en DOCS/2024-10-16_LITQA2-SPLITS.JSON5 son las IDS de la pregunta (correspondientes con los ID de preguntas de Lab-Bench Litqa2) utilizados en las divisiones de tren y evaluación, así como el DOIS de papel utilizado para construir las divisiones de tren y evaluación de los índices de las divisiones de evaluación ' . La división de la prueba permanece resistida.
Lea y cita los siguientes documentos si usa este software:
@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 }
}