PACERQA2는 과학 문헌에 중점을 둔 PDF 또는 텍스트 파일에서 고 진수 검색 증강 생성 (RAG)을 수행하기위한 패키지입니다. 질문 답변, 요약 및 모순 탐지와 같은 과학 작업에서 PaperQA2의 초인간적 성과의 예를 보려면 최근 2024 논문을 참조하십시오.
ask이 예에서 우리는 리서치 페이퍼 PDF 폴더를 취하고, 후퇴 검사를 포함한 인용 수를 포함하여 메타 데이터를 마술처럼 얻은 다음 PDF를 전체 텍스트 검색 인덱스로 구문 분석하고 캐시하고 LLM 에이전트와 함께 사용자 질문에 대답합니다.
pip install paper-qa
cd my_papers
pqa ask ' How can carbon nanotubes be manufactured at a large scale? '질문 : 단백질이나 DNA로 계산하는 신경망을 설계 한 사람이 있습니까?
신경망이 DNA로 계산하도록 설계되었다는 주장은 여러 소스에 의해 지원됩니다. Qian, Winfree 및 Bruck의 연구는 DNA 기반 시스템을 사용하여 인공 뉴런 및 연관성 기억과 같은 신경망 구성 요소를 구성하기 위해 DNA 가닥 변위 캐스케이드를 사용하는 것을 보여줍니다 (Qian20111neural Pages 1-2, Qian2011Neural Pages 15-16, Qian2011neural 페이지 54-56). 이 연구에는 신경망 계산을위한 DNA의 잠재력을 보여주는 3 비트 XOR 게이트와 4- 뉴런 홉 필드 연관 메모리의 구현이 포함됩니다. 또한, DNA 서열과의 계산을 포함하는 유전체학에 딥 러닝 기술을 적용하는 것은 잘 문서화되어있다. 연구는 전사 인자 결합 및 DNA 접근성과 같은 게놈 특징을 예측하기 위해 CNN (Convolutional Neural Networks)을 적용했습니다 (ESASLAN2019DEEP Pages 4-5, ESASLAN2019DEEP Pages 5-6). 이들 모델은 DNA 서열을 입력 데이터로 활용하여 신경망을 효과적으로 사용하여 DNA로 계산합니다. 제공된 발췌문은 단백질 기반 신경망 계산을 명시 적으로 언급하지는 않지만, DNA- 단백질 결합 예측과 같은 단백질 서열과 관련된 작업에서 신경망의 사용을 강조한다 (Zeng2016convolutional Pages 1-2). 그러나 주요 초점은 DNA 기반 계산에 남아 있습니다.
PaperQA2는 과학 논문 작업을위한 최고의 에이전트 래그 모델로 설계되었습니다. 다음은 몇 가지 기능입니다.
기본적으로 Numpy Vector DB가있는 OpenAi 임베딩 및 모델을 사용하여 문서를 포함하고 검색합니다. 그러나 다른 폐쇄 소스, 오픈 소스 모델 또는 임베딩을 쉽게 사용할 수 있습니다 (아래 세부 사항 참조).
PaperQA2는 우리의 리포지토리를 가능하게하는 멋진 라이브러리/API에 따라 다릅니다. 특별한 순서는 다음과 같습니다.
우리는 기본 업그레이드를 한동안 열심히 노력해 왔으며 대부분 Semver를 따랐습니다. 즉, 우리는 각 파괴 변경에서 주요 버전 번호를 증가 시켰습니다. 이것은 우리를 현재 주요 버전 번호 v5로 가져옵니다. 그렇다면 왜 Repo가 이제 PaperQA2라고 불리는 전화입니까? 우리는 많은 중요한 메트릭에서 인간의 성과를 초과 했음에도 불구하고 사실에 대해 언급하고 싶었습니다. 따라서 우리는 성능의 중요한 변화를 나타 내기 위해 PaperQA1로 버전 5와 앞으로의 PaperQA2를 임의로 호출합니다. 우리는 Future House에서 이름을 지정하고 계산하는 데 어려움을 겪고 있음을 알고 있으므로 언제든지 PaperCrow로 이름을 임의로 변경할 권리가 있습니다.
추가 된 버전 5
pqaDocs 객체에서 많은 상태를 제거했습니다 PaperQA 의 이전 버전에서 절인 Docs 객체는 버전 5와 호환되지 않으므로 재구성해야합니다. 또한 최소 Python 버전은 Python 3.11로 증가했습니다.
PaperQA2를 이해하려면 기본 알고리즘 조각부터 시작하겠습니다. PaperQA2의 기본 워크 플로우는 다음과 같습니다.
| 단계 | PaperQA2 동작 |
|---|---|
| 1. 종이 검색 | -LLM 생성 키워드 쿼리에서 후보 논문을 받으십시오 |
| - 청크, 포함 및 후보자를 추가하십시오 | |
| 2. 증거를 수집하십시오 | - 쿼리를 벡터에 포함시킵니다 |
| - 현재 상태에서 상단 K 문서 덩어리를 순위를 매 깁니다 | |
| - 현재 쿼리의 맥락에서 각 청크의 점수 요약 작성 | |
| - LLM을 사용하여 다시 스코어링하고 가장 관련성있는 요약을 선택하십시오. | |
| 3. 답을 생성하십시오 | - 컨텍스트와 함께 프롬프트에 최상의 요약을 넣습니다 |
| - 프롬프트로 답을 생성합니다 |
언어 에이전트가 도구를 순서대로 호출 할 수 있습니다. 예를 들어, LLM 에이전트는 좁고 광범위한 검색을 수행하거나 답변 단계에서 증거 수집 단계를 위해 다른 문구를 사용할 수 있습니다.
비 개발 설정의 경우 PIPI에서 PaperQA2 (일명 버전 5)를 설치하십시오. 참고 버전 5에는 Python 3.11+가 필요합니다.
pip install paper-qa > =5개발 설정은 Contributing.md 파일을 참조하십시오.
PaperQA2는 LLM을 사용하여 작동하므로 적절한 API 키 환경 변수를 설정하거나 export OPENAI_API_KEY=sk-... )를 설정하거나 오픈 소스 LLM 서버 (예 : LlamaFile을 사용하여 LlamaFile. PaperQA2와 함께 사용하도록 구성되어야합니다.
대규모 종이 세트 (100+)를 색인 해야하는 경우 CrossRef 및 Semantic Scholar에 대한 API 키를 원할 것입니다. 이는 이러한 메타 데이터 서비스를 사용하여 공개 요금 제한을 피할 수 있습니다. 그것들은 CROSSREF_API_KEY 및 SEMANTIC_SCHOLAR_API_KEY 변수로 내보낼 수 있습니다.
PaperQA2를 테스트하는 가장 빠른 방법은 CLI를 통한 것입니다. 먼저 일부 논문이있는 디렉토리로 이동하여 pqa CLI를 사용하십시오.
$ pqa ask ' What manufacturing challenges are unique to bispecific antibodies? 'PaperQA2가 로컬 PDF 파일을 인덱싱하고 (CrossRef 및 Semantic Scholar 사용) 각각에 필요한 메타 데이터를 수집하고 해당 색인을 검색 한 다음 파일을 청크 증거 컨텍스트로 나누고 순위를 매기고 궁극적으로 답변을 생성 할 수 있습니다. 다음 에이 디렉토리가 쿼리 될 때, 당신의 색인은 이미 구축 될 것입니다 (새로운 추가 서류와 같이 감지 된 차이점에 대해 저장) 인덱싱 및 청크 단계를 건너 뛸 것입니다.
모든 사전 답변은 색인화 및 저장되며 search 서브 명령을 통해 쿼리 ~/.pqa/ 통해 보거나 PQA_HOME 디렉토리에서 직접 액세스 할 수 있습니다.
$ pqa search -i ' answers ' ' antibodies ' PaperQA2는 명령 줄에서 실행될 때 구성 가능합니다. pqa --help 모든 옵션과 짧은 설명을 보여줍니다. 예를 들어 더 높은 온도로 실행하려면 :
$ pqa --temperature 0.5 ask ' What manufacturing challenges are unique to bispecific antibodies? ' pqa view 로 모든 설정을 볼 수 있습니다. 또 다른 유용한 점은 다른 템플릿 설정 설정으로 변경하는 것입니다. 예를 들어 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 를 사용하여 전체 텍스트 검색을 수행하여 검색 명령을 볼 수 있습니다. 예를 들어 디렉토리에서 인덱스를 저장하고 이름을 알려 드리겠습니다.
pqa -i nanomaterials index이제 열전에 관한 논문을 검색 할 수 있습니다.
pqa -i nanomaterials search thermoelectrics아니면 정상적인 질문을 사용할 수 있습니다
pqa -i nanomaterials ask ' Are there nm scale features in thermoelectric materials? 'CLI와 모듈에는 사전 성능과 출판물을 기반으로 미리 구성된 설정이 있으며 다음과 같이 호출 할 수 있습니다.
pqa --settings < setting name > ask ' Are there nm scale features in thermoelectric materials? ' paperqa/configs 내부 유용한 설정을 묶습니다.
| 설정 이름 | 설명 |
|---|---|
| High_quality | ToolSelector 에이전트를 사용한 쿼리 ( evidence_k = 15가 있기 때문에 비교적 비싸고 비교적 비쌉니다. |
| 빠른 | 저렴하고 빠르게 답을 얻기 위해 설정. |
| 위키 르 | Wikicrow 출판물에 사용 된 Wikipedia 기사 작성을 모방합니다. |
| 피임 | 논문에서 모순을 찾으려면 쿼리는 모순으로 표시되어야한다는 주장이어야합니다. |
| 디버그 | 디버깅에만 유용하지만 디버깅 이외의 실제 응용 프로그램에서는 유용하지 않습니다. |
| Tier1_Limits | 각 계층의 개방 속도 제한과 일치하는 설정은 tier<1-5>_limits 사용하여 계층을 지정할 수 있습니다. |
OpenAi Tier 1 계획을 사용하여 속도 한도를 치는 경우 PACERQA2에 추가 할 수 있습니다. 각 개방 계층에 대해 사용량을 제한하기 위해 사전 구축 된 설정이 존재합니다.
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의 전체 워크 플로우는 파이썬을 통해 직접 액세스 할 수 있습니다.
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 |
동기 버전은 루프에서 비동기 버전을 호출합니다. 대부분의 현대적인 파이썬 환경은 기본적으로 async 지원합니다 (Jupyter 노트 포함!). 따라서 Jupyter 노트 에서이 작업을 수행 할 수 있습니다.
import asyncio
from paperqa import Docs
async def main () -> None :
docs = Docs ()
# valid extensions include .pdf, .txt, and .html
for doc in ( "myfile.pdf" , "myotherfile.pdf" ):
await docs . aadd ( doc )
answer = await docs . aquery (
"What manufacturing challenges are unique to bispecific antibodies?"
)
print ( answer . formatted_answer )
asyncio . run ( main ()) 기본적으로, 재 순위 및 요약 단계, summary_llm 설정 및 답변 단계 인 llm 설정 모두에 gpt-4o-2024-08-06 과 함께 OpenAI 모델을 사용합니다. 당신은 이것을 쉽게 조정할 수 있습니다 :
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "gpt-4o-mini" , summary_llm = "gpt-4o-mini" , paper_directory = "my_papers"
),
) litellm 에서 지원하는 Anthropic 또는 기타 모델을 사용할 수 있습니다.
from paperqa import Settings , ask
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "claude-3-5-sonnet-20240620" , summary_llm = "claude-3-5-sonnet-20240620"
),
)llama.cpp를 사용하여 LLM이 될 수 있습니다. PaperQA2에는 많은 지침을 따라야하기 때문에 비교적 큰 모델을 사용해야합니다. 7B 모델로는 좋은 성능을 얻지 못할 것입니다.
설정을 얻는 가장 쉬운 방법은 Llama 파일을 다운로드하여 -cb -np 4 -a my-llm-model --embedding 으로 실행하여 연속 배치 및 임베딩을 가능하게하는 것입니다.
from paperqa import Settings , ask
local_llm_config = dict (
model_list = [
dict (
model_name = "my_llm_model" ,
litellm_params = dict (
model = "my-llm-model" ,
api_base = "http://localhost:8080/v1" ,
api_key = "sk-no-key-required" ,
temperature = 0.1 ,
frequency_penalty = 1.5 ,
max_tokens = 512 ,
),
)
]
)
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "my-llm-model" ,
llm_config = local_llm_config ,
summary_llm = "my-llm-model" ,
summary_llm_config = local_llm_config ,
),
) ollama 와 함께 호스팅 된 모델도 지원됩니다. 아래 예제를 실행하려면 Ollama를 통해 llama3.2 및 mxbai-embed-large를 다운로드했는지 확인하십시오.
from paperqa import Settings , ask
local_llm_config = {
"model_list" : [
{
"model_name" : "ollama/llama3.2" ,
"litellm_params" : {
"model" : "ollama/llama3.2" ,
"api_base" : "http://localhost:11434" ,
},
}
]
}
answer = ask (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = Settings (
llm = "ollama/llama3.2" ,
llm_config = local_llm_config ,
summary_llm = "ollama/llama3.2" ,
summary_llm_config = local_llm_config ,
embedding = "ollama/mxbai-embed-large" ,
),
) PaperQA2 기본값은 OpenAI ( text-embedding-3-small ) 임베딩을 사용하는 것의 기본값이지만 벡터 스토어 및 임베딩 선택에 유연한 옵션이 있습니다. 임베딩을 변경하는 가장 간단한 방법은 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" 의 임베딩 입력을 지원하여 하이브리드 스파 스 키워드 (토큰 모듈로 임베딩을 기반으로) 및 조밀 한 벡터 임베드를 사용합니다. 밀도가 높은 모델 이름으로 사용됩니다. "sparse" 스파 스 키워드 임베딩 만 사용하는 데 사용될 수 있습니다.
임베딩 모델은 전체 텍스트 임베딩 벡터 ( texts_index 인수)의 PACERQA2의 인덱스를 만드는 데 사용됩니다. 포함 모델은 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 인수를 통해 지정할 수 있습니다.
Huggingface 모델 등을 지원하는 로컬 임베딩 라이브러리 인 sentence-transformers 설치하면 SentenceTransformerEmbeddingModel 모델을 사용할 수 있습니다. 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으로 보내져 요약하거나 관련이 있는지 확인합니다. 이 단계 후에 최종 답변이 LLM 컨텍스트 창에 적합 할 수 있도록 max_sources 한계가 적용됩니다. 따라서 k > max_sources 및 max_sources 최종 답변에 사용 된 소스 수입니다.
from paperqa import Settings
settings = Settings ()
settings . answer . answer_max_sources = 3
settings . answer . k = 5
docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
settings = settings ,
)논문을 사용할 필요가 없으므로 코드 또는 원시 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 )외부 데이터베이스 또는 파일에 구문 분석 된 텍스트와 임베딩을 캐시 할 수 있습니다. 그런 다음 직접 문서로부터 문서 개체를 구축 할 수 있습니다.
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 사용하지 않는 한 용지 디렉토리의 하위 디렉토리에서 재귀 적으로 읽습니다. 용지 디렉토리는 어떤 식 으로든 수정되지 않았으며 단지 읽습니다.
인덱싱 프로세스는 LLM 기반 텍스트 처리를 사용하여 제목 및 DOI와 같은 종이 메타 데이터를 추론하려고 시도합니다. 3 개의 열이 포함 된 CSV 인 "Manifest"파일을 사용 하여이 불확실성을 피할 수 있습니다 (순서는 중요하지 않음).
file_location : 인덱스 디렉토리 내에서 논문의 PDF에 대한 상대 경로doi : 종이의 doititle : 논문 제목이 정보를 제공함으로써 Crossref와 같은 메타 데이터 제공 업체에 대한 쿼리가 정확합니다.
로컬 검색 인덱스는 현재 Settings 객체의 해시를 기반으로 구축됩니다. 따라서 Settings 객체에 paper_directory 를 올바르게 지정하십시오. 일반적으로 다음과 같은 것이 좋습니다.
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 : hugging 얼굴에서 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를 사용하여 개인 참고 문헌을 구성하는 경우 PyzoTero에 의존하는 Library의 쿼리 용지에 paperqa.contrib.ZoteroDB 사용하여 PyzoTero에 의존 할 수 있습니다.
이 기능을 위해 zotero Extra를 통해 pyzotero 설치하십시오.
pip install paperqa[zotero]먼저 PaperQA2는 데이터베이스에 저장할 논문의 PDF를 구문 분석하므로 모든 관련 논문에는 데이터베이스 내부에 PDF가 저장되어 있어야합니다. 검색하려는 참조, 오른쪽 클릭 및 "사용 가능한 PDFS 찾기"를 선택하여 ZoTero가 자동으로이를 수행 할 수 있습니다. 각 참조로 PDF를 수동으로 드래그 앤 드롭 할 수도 있습니다.
논문을 다운로드하려면 계정에 대한 API 키를 가져와야합니다.
ZOTERO_USER_ID 로 설정하십시오.https://www.zotero.org/groups/groupname 을 방문하여 설정 링크를 통해 호버링하십시오. ID는 /groups / /그룹의 정수입니다. ( h/t pyzotero! )ZOTERO_API_KEY 로 설정하십시오.이를 통해 라이브러리에서 논문을 다운로드하여 PaperQa2에 추가 할 수 있습니다.
from paperqa import Docs
from paperqa . contrib import ZoteroDB
docs = Docs ()
zotero = ZoteroDB ( library_type = "user" ) # "group" if group library
for item in zotero . iterate ( limit = 20 ):
if item . num_pages > 30 :
continue # skip long papers
docs . add ( item . pdf , docname = item . key ) ZoTero 데이터베이스에서 처음 20 개의 논문을 다운로드하여 Docs 객체에 추가합니다.
또한 ZoTero 라이브러리의 특정 쿼리를 수행하고 결과를 반복 할 수 있습니다.
for item in zotero . iterate (
q = "large language models" ,
qmode = "everything" ,
sort = "date" ,
direction = "desc" ,
limit = 100 ,
):
print ( "Adding" , item . title )
docs . add ( item . pdf , docname = item . key ) zotero.iterate? Ipython에서.
자신의 컬렉션 이외의 서류를 찾고 싶다면 Paper-Scraper라는 관련이없는 프로젝트를 찾았습니다. 그러나이 프로젝트는 게시자의 권리를 위반하거나 합법성의 회색 영역에있을 수있는 일부 스크래핑 도구를 사용하는 것처럼 보입니다.
from paperqa import Docs
keyword_search = "bispecific antibody manufacture"
papers = paperscraper . search_papers ( keyword_search )
docs = Docs ()
for path , data in papers . items ():
try :
docs . add ( path )
except ValueError as e :
# sometimes this happens if PDFs aren't downloaded or readable
print ( "Could not read" , path , e )
answer = docs . query (
"What manufacturing challenges are unique to bispecific antibodies?"
)
print ( answer )LLM 완료의 각 청크에서 함수를 실행하려면 각 청크에서 실행할 수있는 함수를 제공해야합니다. 예를 들어, 완성의 타자기보기를 얻으려면 다음을 수행 할 수 있습니다.
def typewriter ( chunk : str ) -> None :
print ( chunk , end = "" )
docs = Docs ()
# add some docs...
docs . query (
"What manufacturing challenges are unique to bispecific antibodies?" ,
callbacks = [ typewriter ],
) 일반적으로 사용하는 벡터 스토어에 관계없이 Docs 피울 때 임베딩이 캐시됩니다. 기본 Docs 객체를 저장하는 한 문서를 다시 구축하지 않아도됩니다.
설정을 사용하여 프롬프트를 사용자 정의 할 수 있습니다.
from paperqa import Docs , Settings
my_qa_prompt = (
"Answer the question '{question}' n "
"Use the context below if helpful. "
"You can cite the context using the key like (Example2012). "
"If there is insufficient context, write a poem "
"about how you cannot answer. n n "
"Context: {context}"
)
docs = Docs ()
settings = Settings ()
settings . prompts . qa = my_qa_prompt
docs . query ( "Are covid-19 vaccines effective?" , settings = settings )위의 구문에 이어 쿼리 후 및 쿼리 전에 실행되는 프롬프트도 포함 할 수도 있습니다. 예를 들어, 이것을 사용하여 답을 비판 할 수 있습니다.
내부적으로 Future House에서는 약간 다른 도구 세트가 있습니다. 우리는 인용 트래버스와 같은 일부를이 저장소에 넣으려고 노력하고 있습니다. 그러나 공개적으로 공유 할 수없는 연구 논문에 액세스 할 수있는 API와 라이센스가 있습니다. 마찬가지로, 연구 논문의 결과에서 우리는 알려진 관련 PDF로 시작하지 않습니다. 에이전트는 하위 집합이 아닌 모든 논문을 통해 키워드 검색을 사용하여 이들을 식별해야합니다. 우리는이 두 가지 버전의 PaperQA를 점차적으로 정렬하지만, 오픈 소스 용지 만 자유롭게 액세스 할 수있는 오픈 소스 방법이있을 때까지 PDF를 직접 제공해야합니다.
Langchain과 Llamaindex는 모두 LLM 애플리케이션과 협력하기위한 프레임 워크이며, 에이전트 워크 플로우 및 검색 증강 생성에 대한 추상화와 함께.
시간이 지남에 따라 PaperQA 팀은 시간이 지남에 따라 프레임 워크 공제가되어 LLM 드라이버를 Litellm으로 아웃소싱하고 Pydantic 외에 도구에 대한 프레임 워크를 아웃소싱했습니다. PaperQA는 과학 논문과 메타 데이터에 중점을 둡니다.
Llamaindex 또는 Langchain을 사용하여 PaperQa를 상환 할 수 있습니다. 예를 들어, 우리의 GatherEvidence 도구는 LLM 기반 리 랭킹 및 상황에 맞는 요약을 가진 리트리버로 상환 할 수 있습니다. llamaindex에는 트리 응답 방법과 비슷한 작업이 있습니다.
Docs 클래스는 절인 및 꼬집어 줄 수 있습니다. 문서의 임베딩을 저장 한 다음 나중에로드하려는 경우 유용합니다.
import pickle
# save
with open ( "my_docs.pkl" , "wb" ) as f :
pickle . dump ( docs , f )
# load
with open ( "my_docs.pkl" , "rb" ) as f :
docs = pickle . load ( f )DOCS/2024-10-16_LITQA2-SPLITS.JSON5에는 기차 및 평가 분할에 사용되는 질문 ID (Lab-Bench의 LITQA2 질문 ID에 해당) 및 기차 및 평가 스플릿 '지수를 구축하는 데 사용되는 종이 DOI입니다. . 테스트 분할은 계속 유지됩니다.
이 소프트웨어를 사용하는 경우 다음 논문을 읽고 인용하십시오.
@article { skarlinski2024language ,
title = { Language agents achieve superhuman synthesis of scientific knowledge } ,
author = {
Michael D. Skarlinski and
Sam Cox and
Jon M. Laurent and
James D. Braza and
Michaela Hinks and
Michael J. Hammerling and
Manvitha Ponnapati and
Samuel G. Rodriques and
Andrew D. White } ,
year = { 2024 } ,
journal = { arXiv preprent arXiv:2409.13740 } ,
url = { https://doi.org/10.48550/arXiv.2409.13740 }
} @article { lala2023paperqa ,
title = { PaperQA: Retrieval-Augmented Generative Agent for Scientific Research } ,
author = {
Jakub Lála and
Odhran O'Donoghue and
Aleksandar Shtedritski and
Sam Cox and
Samuel G. Rodriques and
Andrew D. White } ,
journal = { arXiv preprint arXiv:2312.07559 } ,
year = { 2023 }
}