PaperQA2-это пакет для выполнения высокого количества извлечения доработа (RAG) на PDF-файлах или текстовых файлах с акцентом на научную литературу. Посмотрите на нашу недавнюю статью 2024 года, чтобы увидеть примеры сверхчеловеческого исполнения PaperQA2 в научных задачах, таких как ответ на вопрос, суммирование и обнаружение противоречия.
ask вручнуюВ этом примере мы берем папку исследовательских документов PDF, волшебным образом превращаем их метаданные, включая количество цитат с проверкой для отсека, затем анализ и кэш -файлы в полнотекстовый индекс поиска и, наконец, ответьте на вопрос пользователя с помощью агента LLM.
pip install paper-qa
cd my_papers
pqa ask ' How can carbon nanotubes be manufactured at a large scale? 'Вопрос: Разработали ли кто -нибудь нейронные сети, которые вычисляют с белками или ДНК?
Утверждение о том, что нейронные сети были разработаны для вычисления с ДНК, поддерживается несколькими источниками. Работа Qian, Winfree и Bruck демонстрирует использование каскадов смещения границ ДНК для построения компонентов нейронной сети, таких как искусственные нейроны и ассоциативные воспоминания, с использованием системы на основе ДНК (Qian2011Nural Pages 1-2, Qian2011Neural Pages 15-16, Qian2011Neral Pages 54-56). Это исследование включает в себя реализацию 3-битного xor Gate и ассоциативную память Hopfield с четырьмя нейронами, демонстрируя потенциал ДНК для вычислений нейронной сети. Кроме того, применение методов глубокого обучения к геномике, которая включает в себя вычисление с последовательностями ДНК, хорошо документировано. Исследования применяли сверточные нейронные сети (CNNS) для прогнозирования геномных признаков, таких как связывание фактора транскрипции и доступность ДНК (Eraslan2019-Deeep Pages 4-5, Eraslan2019-Deep Pages 5-6). Эти модели используют последовательности ДНК в качестве входных данных, эффективно используя нейронные сети для вычисления с ДНК. В то время как в предоставленных выдержках явно не упоминается вычисление нейронной сети на основе белков, они подчеркивают использование нейронных сетей в задачах, связанных с последовательностями белков, такими как прогнозирование связывания ДНК-белок (Zeng2016convolutional Pages 1-2). Тем не менее, основное внимание уделяется вычислению на основе ДНК.
PaperQA2 спроектирован как лучшая модель агента для работы с научными статьями. Вот некоторые функции:
По умолчанию он использует встроенные и модели Openai с Numpy Vector DB для встраивания и поиска документов. Тем не менее, вы можете легко использовать другие модели с открытым исходным кодом или встроенные модели с открытым исходным кодом (см. Подробности ниже).
PaperQA2 зависит от некоторых удивительных библиотек/API, которые делают наш репо. Вот некоторые не в определенном порядке:
Некоторое время мы усердно работали над фундаментальными обновлениями и в основном следили за Semver. Это означает, что мы увеличили основной номер версии при каждом нарушении изменения. Это подводит нас к текущей основной версии № V5. Так зачем звонить, репо называется Paperqa2? Мы хотели отметить тот факт, что мы превзошли человеческие показатели во многих важных показателях. Таким образом, мы произвольно называем версию 5 и далее PaperQA2 и версии перед ним в качестве PaperQA1, чтобы обозначить значительное изменение производительности. Мы признаем, что нам бросают вызов на наименование и подсчет в FutureHouse, поэтому мы оставляем за собой право в любое время, чтобы произвольно изменить название на Papercrow.
Версия 5 добавлена:
pqaDocs Обратите внимание, что объекты Docs , маринованные от предыдущих версий PaperQA , несовместимы с версией 5 и должны быть восстановлены. Кроме того, наша минимальная версия Python была увеличена до Python 3.11.
Чтобы понять PaperQA2, давайте начнем с кусков базового алгоритма. Рабочий процесс по умолчанию PaperQA2 заключается в следующем:
| Фаза | PaperQA2 действия |
|---|---|
| 1. Поиск бумаги | - Получите кандидаты из запроса ключевого слова, генерируемого LLM |
| - кусок, внедрять и добавить кандидаты в заявление | |
| 2. Соберите доказательства | - встраивать запрос в вектор |
| - Ранг Top K Document Thunks в текущем состоянии | |
| - Создать оценку краткого изложения каждого чанка в контексте текущего запроса | |
| - Используйте LLM для повторного балла и выбора наиболее соответствующих резюме | |
| 3. генерируйте ответ | - Поместите лучшие резюме в быстрое контекст |
| - генерировать ответ с помощью приглашения |
Инструменты могут быть вызваны в любом порядке языковым агентом. Например, агент LLM может выполнять узкий и широкий поиск или использовать различные формулировки для шага сборов с шага Generate ответа.
Для настройки, не связанной с разработкой, установите PaperQA2 (он же версия 5) из PYPI. Примечание версии 5 требует Python 3.11+.
pip install paper-qa > =5Для настройки разработки, пожалуйста, обратитесь к файлу Anforming.md.
PaperQA2 использует LLM для работы, поэтому вам нужно либо установить соответствующую переменную среды API-ключа (то есть export OPENAI_API_KEY=sk-... ), либо настроить сервер LLM с открытым исходным кодом (то есть с помощью llamafile. быть настроенным для использования с PaperQA2.
Если вам нужно индексировать большой набор документов (100+), вам, вероятно, понадобится ключ API как для CrossRef, так и для семантического ученых, который позволит вам избежать достижения ограничений по общественным ценам, используя эти услуги метаданных. Они могут быть экспортированы как переменные CROSSREF_API_KEY и SEMANTIC_SCHOLAR_API_KEY .
Самый быстрый способ протестировать PaperQA2 - через CLI. Сначала перейдите в каталог с некоторыми бумагами и используйте pqa CLI:
$ pqa ask ' What manufacturing challenges are unique to bispecific antibodies? 'Вы увидите индекс PaperQA2 ваших локальных файлов PDF, собирая необходимые метаданные для каждого из них (с использованием CrossRef и Semantic Scholar), поиск по этому индексу, а затем разбивайте файлы в контексты с учетом доказательств, ранжируйте их и в конечном итоге генерируют ответ. В следующий раз, когда этот каталог будет запрашивается, ваш индекс уже будет построен (за исключением любых обнаруженных различий, таких как новые добавленные бумаги), поэтому он пропустит шаги индексации и поднятия.
Все предыдущие ответы будут проиндексированы и хранятся, вы можете просмотреть их, запрашивая через подкоманду search или получить доступ к ним в своем каталоге PQA_HOME , который по умолчанию по умолчанию ~/.pqa/ .
$ pqa search -i ' answers ' ' antibodies ' PaperQA2 очень настраивается, при запуске из командной строки pqa --help показывает все параметры и короткие описания. Например, чтобы работать с более высокой температурой:
$ pqa --temperature 0.5 ask ' What manufacturing challenges are unique to bispecific antibodies? ' Вы можете просмотреть все настройки с pqa view . Еще одна полезная вещь - изменить другие настройки шаблонов - например, fast - это настройка, которая отвечает быстрее, и вы можете увидеть его с помощью pqa -s fast view
Может быть, у вас есть новые настройки, которые вы хотите сохранить? Вы можете сделать это с
pqa -s my_new_settings --temperature 0.5 --llm foo-bar-5 saveИ тогда вы можете использовать его с
pqa -s my_new_settings ask ' What manufacturing challenges are unique to bispecific antibodies? ' Если вы запускаете pqa с помощью команды, которая требует новой индексации, скажем, если вы измените по умолчанию chunk_size, для вас будет создан новый индекс.
pqa --parsing.chunk_size 5000 ask ' What manufacturing challenges are unique to bispecific antibodies? ' Вы также можете использовать pqa для выполнения полнотекстового поиска с использованием LLMS Просмотреть команду поиска. Например, давайте сохраним индекс из каталога и дадим ему имя:
pqa -i nanomaterials indexТеперь я могу искать документы о термоэлектриках:
pqa -i nanomaterials search thermoelectricsИли я могу использовать обычную просьбу
pqa -i nanomaterials ask ' Are there nm scale features in thermoelectric materials? 'И CLI, и модуль имеют предварительно настроенные настройки, основанные на предыдущей производительности и наших публикациях, их можно использовать следующим образом:
pqa --settings < setting name > ask ' Are there nm scale features in thermoelectric materials? ' Inside paperqa/configs Мы связываем известные полезные настройки:
| Настройка названия | Описание |
|---|---|
| высокое качество | Высокопрофессиональный, относительно дорогой (из -за наличия запроса evidence_k = 15) с использованием агента ToolSelector . |
| быстрый | Настройка, чтобы получить ответы дешево и быстро. |
| Викичроу | Постановление для эмуляции написания статьи в Википедии, используемой в нашей публикации Wikicrow. |
| противоречие | Установка, чтобы найти противоречия в документах, ваш запрос должен быть утверждением, которое необходимо пометить как противоречие (или нет). |
| отлаживать | Установка полезного исключительно для отладки, но не в каком -либо фактическом приложении, кроме отладки. |
| tier1_limits | Настройки, которые соответствуют пределам ставки Open для каждого уровня, вы можете использовать tier<1-5>_limits чтобы указать уровень. |
Если вы попадаете в ограничения по ставке, скажем, с планом Openai Tier 1, вы можете добавить их в PaperQA2. Для каждого уровня Openai существует предварительно построенная настройка для ограничения использования.
pqa --settings ' tier1_limits ' ask ' Are there nm scale features in thermoelectric materials? 'Это ограничит вашу систему для использования TIER1_LIMITS и замедлить ваши запросы для размещения.
Вы также можете указать их вручную с любой строкой ограничения скорости, которая соответствует спецификации в модуле ограничения:
pqa --summary_llm_config ' {"rate_limit": {"gpt-4o-2024-08-06": "30000 per 1 minute"}} ' ask ' Are there nm scale features in thermoelectric materials? ' Или добавив в объект Settings , если вы позвоните в обязанность:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm_config = { "rate_limit" : { "gpt-4o-2024-08-06" : "30000 per 1 minute" }},
summary_llm_config = { "rate_limit" : { "gpt-4o-2024-08-06" : "30000 per 1 minute" }},
),
)Полный рабочий процесс PaperQA2 можно получить напрямую через Python:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)Пожалуйста, смотрите наши документы по установке, чтобы установить пакет из PYPI.
ask вручную Объект ответа имеет следующие атрибуты: formatted_answer , answer (один ответ), question и context (резюме отрывков, найденных для ответа). ask будет использовать инструмент SearchPapers , который будет запросить локальный индекс файлов, вы можете указать это место с помощью объекта Settings :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
) ask - это просто удобная обертка вокруг реальной точки входа, к которой можно получить доступ, если вы хотите запустить одновременные асинхронные рабочие нагрузки:
from paperqa import Settings , agent_query , QueryRequest
answer = await agent_query (
QueryRequest (
query = "What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( temperature = 0.5 , paper_directory = "my_papers" ),
)
) Агент по умолчанию будет использовать агент на основе LLM, но вы также можете указать "fake" агент для использования жестко закодированного пути вызова
Если вы предпочитаете мелкозернистый элемент управления и хотите добавить объекты в объект DOCS Сам (вместо того, чтобы использовать инструмент поиска), может использоваться ранее существующий интерфейс объекта Docs :
from paperqa import Docs , Settings
# valid extensions include .pdf, .txt, and .html
doc_paths = ( "myfile.pdf" , "myotherfile.pdf" )
docs = Docs ()
for doc in doc_paths :
docs . add ( doc )
settings = Settings ()
settings . llm = "claude-3-5-sonnet-20240620"
settings . answer . answer_max_sources = 3
answer = docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)
print ( answer . formatted_answer ) PaperQA2 написан для использования асинхронно. Синхронный API - это просто обертка вокруг асинхронности. Вот методы и их async эквиваленты:
| Синхронизированный | Асинхро |
|---|---|
Docs.add | Docs.aadd |
Docs.add_file | Docs.aadd_file |
Docs.add_url | Docs.aadd_url |
Docs.get_evidence | Docs.aget_evidence |
Docs.query | Docs.aquery |
Синхронная версия просто называет асинхронную версию в цикле. Большинство современных среды Python поддерживают async ноутбуки!). Итак, вы можете сделать это в ноутбуке Jupyter:
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 ()) По умолчанию он использует модели OpenAI с gpt-4o-2024-08-06 как для переоборудования, так и для резюме, настройки summary_llm и для шага ответа, настройки llm . Вы можете легко отрегулировать:
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "gpt-4o-mini" , summary_llm = "gpt-4o-mini" , paper_directory = "my_papers"
),
) Вы можете использовать антропную или любую другую модель, поддерживаемую litellm :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "claude-3-5-sonnet-20240620" , summary_llm = "claude-3-5-sonnet-20240620"
),
)Вы можете использовать llama.cpp, чтобы быть LLM. Обратите внимание, что вы должны использовать относительно большие модели, потому что PaperQA2 требует следования многим инструкциям. Вы не получите хорошую производительность с моделями 7B.
Самый простой способ настройки -это загрузить файл LLAMA и выполнить его с помощью -cb -np 4 -a my-llm-model --embedding которое обеспечит непрерывное количество и вторжения.
from paperqa import Settings , ask
local_llm_config = dict (
model_list = [
dict (
model_name = "my_llm_model" ,
litellm_params = dict (
model = "my-llm-model" ,
api_base = "http://localhost:8080/v1" ,
api_key = "sk-no-key-required" ,
temperature = 0.1 ,
frequency_penalty = 1.5 ,
max_tokens = 512 ,
),
)
]
)
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "my-llm-model" ,
llm_config = local_llm_config ,
summary_llm = "my-llm-model" ,
summary_llm_config = local_llm_config ,
),
) Модели, размещенные с ollama также поддерживаются. Чтобы запустить пример ниже, убедитесь, что вы загрузили Llama3.2 и Mxbai-Embed-Large через 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 по умолчанию использует встроенные вставки OpenAI ( text-embedding-3-small ), но имеет гибкие варианты как для векторных магазинов, так и для выбора встраивания. Самый простой способ изменить внедрение - это аргумент embedding в конструктор объекта Settings :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "text-embedding-3-large" ),
) embedding принимает любое имя модели встраивания, поддерживаемое Litellm. PaperQA2 также поддерживает ввод вводки "hybrid-<model_name>" , т.е. "hybrid-text-embedding-3-small" для использования гибридного разреженного ключевого слова (на основе модуля токенов) и плотного вектора, где может любая модель Litellm, модель использоваться в имени плотного модели. "sparse" может использоваться только для использования только разреженного ключевого слова.
Модели встраивания используются для создания индекса PaperQA2 полнотекстовых векторов встраивания (аргумент texts_index ). Модель встраивания может быть указана как настройка, когда вы добавляете новые документы в объект Docs :
from paperqa import Docs , Settings
docs = Docs ()
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
docs . add ( doc , settings = Settings ( embedding = "text-embedding-large-3" )) Обратите внимание, что PaperQa2 использует Numpy в качестве плотного векторного магазина. Его дизайн использования поиска ключевых слов изначально уменьшает количество кусков, необходимых для каждого ответа на относительно небольшое число <1K. Следовательно, NumpyVectorStore -хорошее место для начала, это простой магазин в памяти, без индекса. Однако, если необходим векторный магазин с большей памяти, в настоящее время нам здесь не хватает.
Гибридные встроения могут быть настроены:
from paperqa import (
Docs ,
HybridEmbeddingModel ,
SparseEmbeddingModel ,
LiteLLMEmbeddingModel ,
)
model = HybridEmbeddingModel (
models = [ LiteLLMEmbeddingModel (), SparseEmbeddingModel ( ndim = 1024 )]
)
docs = Docs ()
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
docs . add ( doc , embedding_model = model ) Модели разреженного встраивания (ключевое слово) по умолчанию имеют 256 измерений, но это может быть указано с помощью аргумента ndim .
Вы можете использовать модель SentenceTransformerEmbeddingModel , если вы установите sentence-transformers , которая представляет собой локальную библиотеку встраивания с поддержкой моделей HuggingFace и многое другое. Вы можете установить его, добавив local дополнения.
pip install paper-qa[local] и затем префикс встроенный имена моделей с помощью st- :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "st-multi-qa-MiniLM-L6-cos-v1" ),
)или с гибридной моделью
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings ( embedding = "hybrid-st-multi-qa-MiniLM-L6-cos-v1" ),
) Вы можете настроить количество источников (отрывки текста), чтобы уменьшить использование токенов или добавить больше контекста. k относится к самым актуальным и разнообразным (может из разных источников). Каждый отрывок отправляется в LLM, чтобы суммировать или определить, не имеет значения. После этого шага применяется предел max_sources , чтобы окончательный ответ мог вписаться в окно контекста LLM. Таким образом, k > max_sources и max_sources - это количество источников, используемых в окончательном ответе.
from paperqa import Settings
settings = Settings ()
settings . answer . answer_max_sources = 3
settings . answer . k = 5
docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)Вам не нужно использовать документы - вы можете использовать код или необработанный HTML. Обратите внимание, что этот инструмент ориентирован на ответы на вопросы, поэтому он не преуспевает при написании кода. Одним из заметок является то, что инструмент не может вывести ссылки из кода, поэтому вам нужно будет предоставить их самостоятельно.
import glob
import os
from paperqa import Docs
source_files = glob . glob ( "**/*.js" )
docs = Docs ()
for f in source_files :
# this assumes the file names are unique in code
docs . add ( f , citation = "File " + os . path . name ( f ), docname = os . path . name ( f ))
answer = docs . query ( "Where is the search bar in the header defined?" )
print ( answer )Вы можете захотеть кэшировать проанализированные тексты и встраивания в внешней базе данных или файле. Затем вы можете построить объект DOCS из них напрямую:
from paperqa import Docs , Doc , Text
docs = Docs ()
for ... in my_docs :
doc = Doc ( docname = ..., citation = ..., dockey = ..., citation = ...)
texts = [ Text ( text = ..., name = ..., doc = doc ) for ... in my_texts ]
docs . add_texts ( texts , doc ) Индексы будут размещены в домашнем каталоге по умолчанию. Это можно контролировать с помощью переменной среды PQA_HOME .
Индексы производятся путем чтения файлов в Settings.paper_directory . По умолчанию мы рекурсивно читаем из подкаталогов бумажного каталога, если не отключено с использованием Settings.index_recursively . Бумажный каталог никоим образом не изменяется, он просто читается.
Процесс индексации пытается вывести метаданные бумаги, такие как заголовок, и DOI с использованием обработки текста с LLM. Вы можете избежать этой точки неопределенности, используя файл «манифеста», который представляет собой CSV, содержащий три столбца (порядок не имеет значения):
file_location : относительный путь к PDF бумаги в каталоге индексаdoi : doi бумагиtitle : Название бумагиПредоставляя эту информацию, мы обеспечиваем точные запросы для поставщиков метаданных, таких как Crossref.
Локальные индексы поиска создаются на основе хэша объекта текущих Settings . Поэтому убедитесь, что вы правильно указали paper_directory в объекте Settings . В общем, желательно:
import os
from paperqa import Settings
from paperqa . agents . main import agent_query
from paperqa . agents . models import QueryRequest
from paperqa . agents . search import get_directory_index
async def amain ( folder_of_papers : str | os . PathLike ) -> None :
settings = Settings ( paper_directory = folder_of_papers )
# 1. Build the index. Note an index name is autogenerated when unspecified
built_index = await get_directory_index ( settings = settings )
print ( settings . get_index_name ()) # Display the autogenerated index name
print ( await built_index . index_files ) # Display the index contents
# 2. Use the settings as many times as you want with ask
answer_response_1 = await agent_query (
query = QueryRequest (
query = "What is the best way to make a vaccine?" , settings = settings
)
)
answer_response_2 = await agent_query (
query = QueryRequest (
query = "What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)
) В paperqa/agents/task.py вы найдете:
GradablePaperQAEnvironment бумага.LitQAv2TaskDataset : набор данных задач, предназначенный для вытягивания Litqa V2 от обнимающего лица, и создать одну GradablePaperQAEnvironment на вопрос на вопросВот пример того, как их использовать:
import os
from aviary . env import TaskDataset
from ldp . agent import SimpleAgent
from ldp . alg . callbacks import MeanMetricsCallback
from ldp . alg . runners import Evaluator , EvaluatorConfig
from paperqa import QueryRequest , Settings
from paperqa . agents . task import TASK_DATASET_NAME
async def evaluate ( folder_of_litqa_v2_papers : str | os . PathLike ) -> None :
base_query = QueryRequest (
settings = Settings ( paper_directory = folder_of_litqa_v2_papers )
)
dataset = TaskDataset . from_name ( TASK_DATASET_NAME , base_query = base_query )
metrics_callback = MeanMetricsCallback ( eval_dataset = dataset )
evaluator = Evaluator (
config = EvaluatorConfig ( batch_size = 3 ),
agent = SimpleAgent (),
dataset = dataset ,
callbacks = [ metrics_callback ],
)
await evaluator . evaluate ()
print ( metrics_callback . eval_means )Одной из самых мощных особенностей PaperQA2 является его способность объединять данные из нескольких источников метаданных. Например, UnpayWall может предоставить статус открытого доступа/прямые ссылки на PDF -файлы, CrossRef может предоставить Bibtex, а Semantic Scholar может предоставить лицензии на цитату. Вот короткая демонстрация того, как это сделать:
from paperqa . clients import DocMetadataClient , ALL_CLIENTS
client = DocMetadataClient ( clients = ALL_CLIENTS )
details = await client . query ( title = "Augmenting language models with chemistry tools" )
print ( details . formatted_citation )
# Andres M. Bran, Sam Cox, Oliver Schilter, Carlo Baldassari, Andrew D. White, and Philippe Schwaller.
# Augmenting large language models with chemistry tools. Nature Machine Intelligence,
# 6:525-535, May 2024. URL: https://doi.org/10.1038/s42256-024-00832-8,
# doi:10.1038/s42256-024-00832-8.
# This article has 243 citations and is from a domain leading peer-reviewed journal.
print ( details . citation_count )
# 243
print ( details . license )
# cc-by
print ( details . pdf_url )
# https://www.nature.com/articles/s42256-024-00832-8.pdf client.query предназначен для проверки точных совпадений заголовка. Это немного надежно (например, к корпусу, пропуская слово). Хотя есть дубликаты для названий - так что вы также можете добавить авторов к устранению дисковидов. Или вы можете предоставить DOI напрямую client.query(doi="10.1038/s42256-024-00832-8") .
Если вы делаете это в больших масштабах, вы можете не захотеть использовать ALL_CLIENTS (просто опустите аргумент), и вы можете указать, какие конкретные поля вы хотите ускорить запросы. Например:
details = await client . query (
title = "Augmenting large language models with chemistry tools" ,
authors = [ "Andres M. Bran" , "Sam Cox" ],
fields = [ "title" , "doi" ],
)Вернутся намного быстрее, чем первый запрос, и мы будем уверены, что авторы совпадают.
Ну, это действительно хороший вопрос! Вероятно, лучше просто загрузить PDF -файлы документов, которые, по вашему мнению, помогут ответить на ваш вопрос и начать оттуда.
Прошло много времени с тех пор, как мы протестировали это - так что дайте нам знать, если это столкнется с проблемами!
Если вы используете Zotero для организации своей личной библиографии, вы можете использовать paperqa.contrib.ZoteroDB для запроса документов из вашей библиотеки, которая опирается на Pyzotero.
Установите pyzotero через zotero Extra для этой функции:
pip install paperqa[zotero]Во -первых, обратите внимание, что PaperQA2 анализирует PDF -файлы бумаг для хранения в базе данных, поэтому все соответствующие бумаги должны были храниться в вашей базе данных. Вы можете заставить Zotero автоматически сделать это, выделяя ссылки, которые вы хотите получить, щелкнуть правой кнопкой мыши и выбрав «Найти доступные PDFS» . Вы также можете вручную перетаскивать PDF-файлы на каждую ссылку.
Чтобы загрузить документы, вам нужно получить ключ API для вашей учетной записи.
ZOTERO_USER_ID .https://www.zotero.org/groups/groupname и наведите на ссылку на настройки. Идентификатор - целое число после /групп /. ( H/T Pyzotero! )ZOTERO_API_KEY .При этом мы можем загрузить бумаги из нашей библиотеки и добавить их в PaperQA2:
from paperqa import Docs
from paperqa . contrib import ZoteroDB
docs = Docs ()
zotero = ZoteroDB ( library_type = "user" ) # "group" if group library
for item in zotero . iterate ( limit = 20 ):
if item . num_pages > 30 :
continue # skip long papers
docs . add ( item . pdf , docname = item . key ) который загрузит первые 20 документов в вашей базе данных Zotero и добавит их в объект Docs .
Мы также можем выполнить конкретные запросы нашей библиотеки Zotero и повторно итерации по результатам:
for item in zotero . iterate (
q = "large language models" ,
qmode = "everything" ,
sort = "date" ,
direction = "desc" ,
limit = 100 ,
):
print ( "Adding" , item . title )
docs . add ( item . pdf , docname = item . key ) Вы можете прочитать больше о синтаксисе поиска, набрав zotero.iterate? в ipython.
Если вы хотите искать документы за пределами вашей собственной коллекции, я нашел не связанный проект под названием Paper-Scraper, который выглядит так, как будто это может помочь. Но будьте осторожны, этот проект выглядит так, как будто он использует некоторые инструменты для соскоба, которые могут нарушать права издателя или быть в серой области законности.
from paperqa import Docs
keyword_search = "bispecific antibody manufacture"
papers = paperscraper . search_papers ( keyword_search )
docs = Docs ()
for path , data in papers . items ():
try :
docs . add ( path )
except ValueError as e :
# sometimes this happens if PDFs aren't downloaded or readable
print ( "Could not read" , path , e )
answer = docs . query (
"What manufacturing challenges are unique to bispecific antibodies?"
)
print ( answer )Чтобы выполнить функцию на каждом куске завершений LLM, вам необходимо предоставить функцию, которая может быть выполнена на каждом куске. Например, чтобы получить вид на машинку, вы можете сделать:
def typewriter ( chunk : str ) -> None :
print ( chunk , end = "" )
docs = Docs ()
# add some docs...
docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
callbacks = [ typewriter ],
) В целом, встраивания кэшируются, когда вы омрачиваете Docs независимо от того, какой векторный магазин вы используете. Поэтому, пока вы сохраняете свой основной объект Docs , вы должны быть в состоянии избежать повторного внесения ваших документов.
Вы можете настроить любое из подсказок, используя настройки.
from paperqa import Docs , Settings
my_qa_prompt = (
"Answer the question '{question}' n "
"Use the context below if helpful. "
"You can cite the context using the key like (Example2012). "
"If there is insufficient context, write a poem "
"about how you cannot answer. n n "
"Context: {context}"
)
docs = Docs ()
settings = Settings ()
settings . prompts . qa = my_qa_prompt
docs . query ( "Are covid-19 vaccines effective?" , settings = settings )Следуя синтаксису выше, вы также можете включить подсказки, которые выполняются после запроса и до запроса. Например, вы можете использовать это, чтобы критиковать ответ.
Внутренне в FutureHouse у нас есть несколько другой набор инструментов. Мы пытаемся довести некоторых из них, таких как обход цитирования, в это репо. Тем не менее, у нас есть API и лицензии для доступа к исследовательским статьям, которыми мы не можем разделить открыто. Точно так же в результатах наших исследовательских работ мы не начинаем с известных соответствующих PDF. Наш агент должен идентифицировать их, используя поиск по ключевым словам по всем документам, а не просто подмножество. Мы постепенно выровняем эти две версии Paperqa, но до тех пор, пока не появится способ свободного доступа к бумагам с открытым исходным кодом (даже только с открытым исходным кодом), вам нужно будет предоставить PDFS самостоятельно.
Langchain и Llamaindex являются основой для работы с приложениями LLM, с абстракциями, созданными для агентских рабочих процессов и получения добычи.
Со временем команда PaperQA с течением времени решила стать основательными, вместо этого аутсорсинга водителей LLM Litellm и без рамки, кроме Pydantic для своих инструментов. Paperqa фокусируется на научных статьях и их метаданных.
PaperQA может быть переосмыслит с использованием либо llamainDex, либо Langchain. Например, наш инструмент GatherEvidence может быть переосмыслен как ретривер с переосмыслением на основе LLM и контекстуальной сводке. Существует аналогичная работа с методом ответа дерева в LlamainDex.
Класс Docs может быть маризован и незаметный. Это полезно, если вы хотите сохранить вставки документов, а затем загрузить их позже.
import pickle
# save
with open ( "my_docs.pkl" , "wb" ) as f :
pickle . dump ( docs , f )
# load
with open ( "my_docs.pkl" , "rb" ) as f :
docs = pickle . load ( f )Содержится в DOCS/2024-10-16_LITQA2-SPLITS.JSON5-это идентификаторы вопросов (соответствующие идентификаторам вопросов Lab-Bench LITQA2), используемые в поезде и сплитах оценки, а также Paper DOI, используемые для строительства поезда и индексов сплит. Полем Испытательный раскол остается удерживаемым.
Пожалуйста, прочитайте и процитируйте следующие документы, если вы используете это программное обеспечение:
@article { skarlinski2024language ,
title = { Language agents achieve superhuman synthesis of scientific knowledge } ,
author = {
Michael D. Skarlinski and
Sam Cox and
Jon M. Laurent and
James D. Braza and
Michaela Hinks and
Michael J. Hammerling and
Manvitha Ponnapati and
Samuel G. Rodriques and
Andrew D. White } ,
year = { 2024 } ,
journal = { arXiv preprent arXiv:2409.13740 } ,
url = { https://doi.org/10.48550/arXiv.2409.13740 }
} @article { lala2023paperqa ,
title = { PaperQA: Retrieval-Augmented Generative Agent for Scientific Research } ,
author = {
Jakub Lála and
Odhran O'Donoghue and
Aleksandar Shtedritski and
Sam Cox and
Samuel G. Rodriques and
Andrew D. White } ,
journal = { arXiv preprint arXiv:2312.07559 } ,
year = { 2023 }
}