Future-House/paper-qa
Độ chính xác cao RAG để trả lời các câu hỏi từ tài liệu khoa học có trích dẫn
README
GiấyQA2
PaperQA2 là gói để thực hiện tạo tăng cường truy xuất có độ chính xác cao (RAG) trên các tệp PDF, tệp văn bản, tài liệu Microsoft Office và tệp mã nguồn, tập trung vào tài liệu khoa học. Xem của chúng tôi bài báo gần đây năm 2024 để xem các ví dụ về hiệu suất siêu phàm của PaperQA2 trong các nhiệm vụ khoa học như trả lời câu hỏi, tóm tắt và phát hiện mâu thuẫn.
Mục lục
- Bắt đầu nhanh
- PaperQA2 là gì
- Cài đặt
- CLI Cách sử dụng
- Sử dụng thư viện
- Bảng tóm tắt cài đặt
- Tôi lấy giấy tờ ở đâu?
- Cuộc gọi lại
- Tùy chỉnh lời nhắc
- Câu hỏi thường gặp
- sinh sản
- Trích dẫn
Bắt đầu nhanh
Trong ví dụ này, chúng tôi lấy một thư mục chứa các tệp PDF của bài nghiên cứu, lấy siêu dữ liệu của chúng một cách kỳ diệu - bao gồm số lượng trích dẫn bằng tính năng kiểm tra rút lại, sau đó phân tích cú pháp và lưu các tệp PDF vào bộ nhớ đệm vào chỉ mục tìm kiếm toàn văn bản và cuối cùng trả lời câu hỏi của người dùng bằng tác nhân LLM.
pip install paper-qa
mkdir my_papers
curl -o my_papers/PaperQA2.pdf https://arxiv.org/pdf/2409.13740
cd my_papers
pqa ask 'What is PaperQA2?'
Đầu ra ví dụ
Câu hỏi: Đã có ai thiết kế mạng lưới thần kinh tính toán bằng protein hoặc DNA chưa?
Tuyên bố rằng mạng lưới thần kinh đã được thiết kế để tính toán bằng DNA được hỗ trợ bởi nhiều nguồn. Công trình của Qian, Winfree và Bruck chứng minh việc sử dụng các tầng dịch chuyển chuỗi DNA để xây dựng các thành phần mạng lưới thần kinh, chẳng hạn như tế bào thần kinh nhân tạo và ký ức liên kết, bằng cách sử dụng hệ thống dựa trên DNA (Qian2011Neural trang 1-2, Qian2011Neural trang 15-16, Qian2011Neural trang 54-56). Nghiên cứu này bao gồm việc triển khai cổng XOR 3 bit và bộ nhớ kết hợp Hopfield bốn nơ-ron, cho thấy tiềm năng của DNA trong tính toán mạng nơ-ron. Ngoài ra, việc áp dụng các kỹ thuật học sâu vào bộ gen, bao gồm việc tính toán các chuỗi DNA, đã được ghi chép rõ ràng. Các nghiên cứu đã áp dụng mạng thần kinh tích chập (CNN) để dự đoán các đặc điểm của bộ gen như liên kết yếu tố phiên mã và khả năng tiếp cận DNA (Eraslan2019Deep trang 4-5, Eraslan2019Deep trang 5-6). Những mô hình này tận dụng chuỗi DNA làm dữ liệu đầu vào, sử dụng hiệu quả mạng lưới thần kinh để tính toán DNA. Mặc dù các đoạn trích được cung cấp không đề cập rõ ràng đến việc tính toán mạng lưới thần kinh dựa trên protein, nhưng chúng nêu bật việc sử dụng mạng lưới thần kinh trong các nhiệm vụ liên quan đến trình tự protein, chẳng hạn như dự đoán liên kết DNA-protein (Zeng2016Convolutional pages 1-2). Tuy nhiên, trọng tâm chính vẫn là tính toán dựa trên DNA.
PaperQA2 là gì
PaperQA2 được thiết kế để trở thành mô hình RAG tác nhân tốt nhất để làm việc với các bài báo khoa học. Dưới đây là một số tính năng:
- Một giao diện đơn giản để nhận được câu trả lời hay với những câu trả lời có căn cứ có chứa trích dẫn trong văn bản.
- Triển khai tiên tiến bao gồm nhận thức siêu dữ liệu tài liệu trong các phần nhúng và xếp hạng lại và tóm tắt theo ngữ cảnh (RCS) dựa trên LLM.
- Hỗ trợ cho tác nhân RAG, trong đó tác nhân ngôn ngữ có thể tinh chỉnh lặp lại các truy vấn và câu trả lời.
- Tự động tìm nạp dự phòng siêu dữ liệu giấy, bao gồm dữ liệu chất lượng tạp chí và trích dẫn từ nhiều nhà cung cấp.
- Một công cụ tìm kiếm toàn văn bản có thể sử dụng được cho kho lưu trữ cục bộ các tệp PDF/văn bản.
- Giao diện mạnh mẽ để tùy chỉnh, với sự hỗ trợ mặc định cho tất cả LiteLLM các mô hình.
Theo mặc định, nó sử dụng nhúng OpenAI và mô hình với DB vectơ Numpy để nhúng và tìm kiếm tài liệu. Tuy nhiên, bạn có thể dễ dàng sử dụng các mô hình hoặc phần nhúng mã nguồn đóng, nguồn mở khác (xem chi tiết bên dưới).
PaperQA2 phụ thuộc vào một số thư viện/API tuyệt vời giúp cho kho lưu trữ của chúng tôi có thể thực hiện được. Dưới đây là một số không theo thứ tự cụ thể:
PaperQA2 và PaperQA
Chúng tôi đã làm việc chăm chỉ để nâng cấp cơ bản trong một thời gian và chủ yếu làm theo SemVer, cho đến khi tháng 12 năm 2025. Có nghĩa là chúng tôi đã tăng số phiên bản chính cho mỗi thay đổi quan trọng. Điều này đưa chúng ta đến số phiên bản chính hiện tại v5. Vậy tại sao gọi repo bây giờ được gọi là PaperQA2? Chúng tôi muốn nhận xét về thực tế là chúng tôi đã vượt quá hiệu suất của con người trên nhiều chỉ số quan trọng. Vì vậy, chúng tôi tùy ý gọi phiên bản 5 trở đi là PaperQA2 và các phiên bản trước đó là PaperQA1 để biểu thị sự thay đổi đáng kể về hiệu suất. Chúng tôi nhận thấy rằng chúng tôi gặp khó khăn trong việc đặt tên và đếm tại FutureHouse, vì vậy chúng tôi có quyền tùy ý đổi tên thành PaperCrow bất cứ lúc nào.
PaperQA2 đi vào CalVer vào tháng 12 năm 2025
Trước tháng 12 năm 2025, chúng tôi đã sử dụng phiên bản ngữ nghĩa. Điều này cuối cùng dẫn đến sự nhầm lẫn theo hai cách:
- Nhà phát triển: chúng ta có nên nâng cấp phiên bản chính dựa trên cài đặt hoặc khả năng cơ bản của hệ thống không? Điều gì sẽ xảy ra nếu việc sửa lỗi yêu cầu phá vỡ các thay đổi đối với hành vi của tổng đài viên?
- Nói: người ta có nên sử dụng thuật ngữ từ các ấn phẩm của chúng ta không (ví dụ: GiấyQA1, GiấyQA2) hoặc thẻ Git (ví dụ v5) từ kho/gói này? Khi ai đó nói "PaperQA" -- ý họ là phiên bản nào?
Để giải quyết những nhầm lẫn này, vào tháng 12 năm 2025, chúng tôi đã chuyển sang phiên bản lịch. Gánh nặng của nhà phát triển được giảm bớt vì về cơ bản chúng tôi đang loại bỏ các đảm bảo về khả năng tương thích ngược giữa các bản phát hành (như CalVer ZeroVer ràng buộc với ngày tháng). Nó giải quyết vấn đề "nói" vì thẻ Git hiện khá khác so với thuật ngữ xuất bản (ví dụ: PaperQA2 so với v2025.12.17). Khi ai đó nói "PaperQA", nó sẽ chỉ đề cập đến hệ thống chứ không phải là ảnh chụp nhanh cụ thể về các hành vi tác nhân. Khi ai đó nói "PaperQA2" nó sẽ đề cập đến paper-qa>=5, áp dụng cho cả hai thẻ SemVer v5.0.0 và các thẻ CalVer mới v2025.12.17.
Công tắc này tương thích ngược với SemVer của phiên bản 5, vì năm 2025 lớn hơn phiên bản chính 5.
Có gì mới trong Phiên bản 5 (còn gọi là PaperQA2)?
Đã thêm phiên bản 5:
- Một CLI
pqa - Quy trình làm việc của tác nhân gọi các công cụ để tìm kiếm trên giấy, thu thập bằng chứng và tạo câu trả lời
- Đã loại bỏ phần lớn trạng thái khỏi
Docsvật thể - Di chuyển sang LiteLLM để tương thích với nhiều nhà cung cấp LLM cũng như giới hạn tốc độ tập trung và theo dõi chi phí
- Một tập hợp các cấu hình (đọc phần này ở đây)) chứa các siêu tham số đã biết
Lưu ý rằng Docs các đối tượng được chọn từ các phiên bản trước của PaperQA không tương thích với phiên bản 5 và sẽ cần phải được xây dựng lại. Ngoài ra, phiên bản Python tối thiểu của chúng tôi đã được tăng lên Python 3.11.
Có gì mới vào tháng 12 năm 2025?
Bốn tháng qua kể từ phiên bản 5.29.1 đã thấy nhiều thay đổi:
- Phương thức mới: bảng, hình, ngôn ngữ không phải tiếng Anh, phương trình toán học
- Ngày càng có nhiều độc giả tốt hơn
- Hai cái mới dựa trên mô hình Trình đọc PDF: Tài liệu và Phân tích cú pháp nemotron của Nvidia
- Tất cả các trình đọc PDF giờ đây có thể phân tích hình ảnh và bảng biểu, báo cáo số trang, hỗ trợ DPI
- Trình đọc các loại dữ liệu Microsoft Office
- Tóm tắt theo ngữ cảnh đa phương thức
- Các đối tượng media cũng được chuyển tới
summary_llmtrong quá trình tạo - Không gian nhúng của các đối tượng đa phương tiện được nâng cao bằng cách sử dụng
enrichment_llmnhắc nhở
- Các đối tượng media cũng được chuyển tới
- Ngăn xếp HTTP đơn giản hơn và hiệu quả hơn
- Hợp nhất từ
aiohttpvàhttpxchỉ đểhttpx - Tích hợp với
httpx-aiohttpcho hiệu suất
- Hợp nhất từ
Contextmức độ liên quan được đơn giản hóa và một số giả định đã bị loại bỏ- Nhiều tính năng nhỏ như thử lại
Contexttạo dựa trên JSON không hợp lệ, khả năng tương thích với LLM biên giới của mùa thu năm 2025 và các mẫu lời nhắc được cải tiến - Nhiều bản sửa lỗi trong xử lý siêu dữ liệu thông qua Semantic Scholar và OpenAlex cũng như xử lý siêu dữ liệu (ví dụ: suy ra không chính xác các ID tài liệu giống hệt nhau cho văn bản chính và SI)
- Đã hoàn thành số tiền khấu hao đã tích lũy trong năm qua
Thuật toán PaperQA2
Để hiểu PaperQA2, hãy bắt đầu với các phần của thuật toán cơ bản. Quy trình làm việc mặc định của PaperQA2 như sau:
| Giai đoạn | Hành động PaperQA2 |
|---|---|
| 1. Tìm kiếm giấy | - Nhận bài viết ứng viên từ truy vấn từ khóa do LLM tạo |
| - Chunk, nhúng và thêm các bài viết ứng cử viên vào tiểu bang | |
| 2. Thu thập bằng chứng | - Nhúng truy vấn vào vector |
| - Xếp hạng hàng đầu k khối tài liệu ở trạng thái hiện tại | |
| - Tạo bản tóm tắt tính điểm của từng đoạn trong ngữ cảnh của truy vấn hiện tại | |
| - Sử dụng LLM để chấm điểm lại và chọn ra những tóm tắt phù hợp nhất | |
| 3. Tạo câu trả lời | - Đưa ra những bản tóm tắt hay nhất, phù hợp với ngữ cảnh |
| - Tạo câu trả lời có dấu nhắc |
Tác nhân ngôn ngữ có thể gọi các công cụ này theo bất kỳ thứ tự nào. Ví dụ: tác nhân LLM có thể thực hiện tìm kiếm hẹp và rộng hoặc sử dụng các cụm từ khác nhau cho bước thu thập bằng chứng từ bước tạo câu trả lời.
Cài đặt
Đối với thiết lập không phát triển, hãy cài đặt PaperQA2 (còn gọi là phiên bản 5) từ PyPI. Lưu ý phiên bản 5 yêu cầu Python 3.11+.
pip install paper-qa>=5
Để thiết lập phát triển, vui lòng tham khảo ĐÓNG GÓP.md tập tin.
PaperQA2 sử dụng LLM để vận hành, do đó bạn cần đặt giá trị thích hợp Biến môi trường khóa API
(tức là export OPENAI_API_KEY=sk-...) hoặc thiết lập máy chủ nguồn mở LLM (tức là sử dụng tập tin llama. Mọi kiểu máy tương thích LiteLLM đều có thể được cấu hình để sử dụng với PaperQA2.
Nếu bạn cần lập chỉ mục một bộ giấy tờ lớn (100+), bạn có thể sẽ muốn có khóa API cho cả hai
tham khảo chéo
và Học giả ngữ nghĩa, điều này sẽ cho phép bạn tránh đạt đến giới hạn tỷ lệ công khai khi sử dụng các dịch vụ siêu dữ liệu này. Chúng có thể được xuất khẩu dưới dạng CROSSREF_API_KEY và SEMANTIC_SCHOLAR_API_KEY các biến.
CLI Cách sử dụng
Cách nhanh nhất để kiểm tra PaperQA2 là thông qua CLI. Đầu tiên hãy điều hướng đến một thư mục có một số giấy tờ và sử dụng pqa CLI:
pqa ask 'What is PaperQA2?'
Bạn sẽ thấy PaperQA2 lập chỉ mục các tệp PDF cục bộ của mình, thu thập siêu dữ liệu cần thiết cho từng tệp (sử dụng tham khảo chéo và Học giả ngữ nghĩa), tìm kiếm chỉ mục đó, sau đó chia tệp thành các bối cảnh bằng chứng được chia nhỏ, xếp hạng chúng và cuối cùng tạo ra câu trả lời. Lần tiếp theo khi thư mục này được truy vấn, chỉ mục của bạn sẽ được tạo sẵn (lưu lại những khác biệt được phát hiện, chẳng hạn như các giấy tờ mới được thêm vào), do đó, nó sẽ bỏ qua các bước lập chỉ mục và phân nhóm.
Tất cả các câu trả lời trước đó sẽ được lập chỉ mục và lưu trữ, bạn có thể xem chúng bằng cách truy vấn qua search lệnh phụ hoặc tự mình truy cập chúng trong PQA_HOME thư mục, mặc định là ~/.pqa/.
pqa -i 'answers' search 'ranking and contextual summarization'
PaperQA2 có cấu hình cao, khi chạy từ dòng lệnh,
pqa --help hiển thị tất cả các tùy chọn và mô tả ngắn. Ví dụ để chạy với nhiệt độ cao hơn:
pqa --temperature 0.5 ask 'What is PaperQA2?'
Bạn có thể xem tất cả các cài đặt với pqa view. Một điều hữu ích khác là thay đổi sang các cài đặt theo khuôn mẫu khác - ví dụ:
fast là cài đặt trả lời nhanh hơn và bạn có thể thấy nó bằng pqa -s fast view
Có thể bạn có một số cài đặt mới muốn lưu? Bạn có thể làm điều đó với
pqa -s my_new_settings --temperature 0.5 --llm foo-bar-5 save
và sau đó bạn có thể sử dụng nó với
pqa -s my_new_settings ask 'What is PaperQA2?'
Nếu bạn chạy pqa với lệnh yêu cầu lập chỉ mục mới, giả sử nếu bạn thay đổi chunk_size mặc định, một chỉ mục mới sẽ tự động được tạo cho bạn.
pqa --parsing.chunk_size 5000 ask 'What is PaperQA2?'
Bạn cũng có thể sử dụng pqa để thực hiện tìm kiếm toàn văn bằng cách sử dụng LLM, hãy xem lệnh tìm kiếm. Ví dụ: hãy lưu chỉ mục từ một thư mục và đặt tên cho nó:
pqa -i nanomaterials index
Bây giờ tôi có thể tìm kiếm các bài viết về nhiệt điện:
pqa -i nanomaterials search thermoelectrics
hoặc tôi có thể sử dụng câu hỏi thông thường
pqa -i nanomaterials ask 'Are there nm scale features in thermoelectric materials?'
Cả CLI và mô-đun đều có cài đặt được định cấu hình trước dựa trên hiệu suất trước đó và các ấn phẩm của chúng tôi, chúng có thể được gọi như sau:
pqa --settings <setting name> \
ask 'Are there nm scale features in thermoelectric materials?'
Cài đặt đi kèm
Bên trong src/paperqa/configs chúng tôi gói các cài đặt hữu ích đã biết:
| Tên cài đặt | Mô tả |
|---|---|
| chất lượng cao | Hiệu suất cao, tương đối đắt tiền (do có evidence_k = 15) truy vấn bằng cách sử dụng ToolSelector đại lý. |
| nhanh | Thiết lập để nhận được câu trả lời với giá rẻ và nhanh chóng. |
| wikicrow | Cài đặt mô phỏng cách viết bài trên Wikipedia được sử dụng trong ấn phẩm WikiCrow của chúng tôi. |
| co lại | Cài đặt để tìm mâu thuẫn trong các bài báo, truy vấn của bạn phải là một khẳng định cần được gắn cờ là mâu thuẫn (hoặc không). |
| gỡ lỗi | Cài đặt chỉ hữu ích cho việc gỡ lỗi chứ không hữu ích trong bất kỳ ứng dụng thực tế nào ngoài việc gỡ lỗi. |
| cấp1_limits | Cài đặt phù hợp với giới hạn tỷ lệ OpenAI cho từng cấp, bạn có thể sử dụng tier<1-5>_limits để chỉ định cấp độ. |
Giới hạn tỷ lệ
Nếu bạn đạt đến giới hạn tỷ lệ, chẳng hạn như với gói Cấp 1 OpenAI, bạn có thể thêm chúng vào PaperQA2. Đối với mỗi bậc OpenAI, có một cài đặt dựng sẵn để hạn chế mức sử dụng.
pqa --settings 'tier1_limits' ask 'What is PaperQA2?'
Điều này sẽ hạn chế hệ thống của bạn sử dụng cấp1_limitsvà làm chậm các truy vấn của bạn để phù hợp.
Bạn cũng có thể chỉ định chúng theo cách thủ công bằng bất kỳ chuỗi giới hạn tốc độ nào phù hợp với thông số kỹ thuật trong giới hạn mô-đun:
pqa --summary_llm_config '{"rate_limit": {"gpt-4o-2024-11-20": "30000 per 1 minute"}}' \
ask 'What is PaperQA2?'
Hoặc bằng cách thêm vào một Settings đối tượng, nếu gọi mệnh lệnh:
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm_config={"rate_limit": {"gpt-4o-2024-11-20": "30000 per 1 minute"}},
summary_llm_config={"rate_limit": {"gpt-4o-2024-11-20": "30000 per 1 minute"}},
),
)
Sử dụng thư viện
Có thể truy cập trực tiếp toàn bộ quy trình làm việc của PaperQA2 qua Python:
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(temperature=0.5, paper_directory="my_papers"),
)
Xin vui lòng xem của chúng tôi tài liệu cài đặt để biết cách cài đặt gói từ PyPI.
Tài liệu thêm/truy vấn tác nhân
Đối tượng câu trả lời có các thuộc tính sau:
formatted_answer, answer (trả lời một mình), question và context (tóm tắt các đoạn văn được tìm thấy để trả lời).
ask sẽ sử dụng SearchPapers công cụ này sẽ truy vấn chỉ mục cục bộ của các tệp, bạn có thể chỉ định vị trí này thông qua Settings đối tượng:
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
temperature=0.5, agent={"index": {"paper_directory": "my_papers"}}
),
)
ask chỉ là một trình bao bọc tiện lợi xung quanh điểm vào thực, có thể được truy cập nếu bạn muốn chạy khối lượng công việc không đồng bộ đồng thời:
from paperqa import Settings, agent_query
answer_response = await agent_query(
query="What is PaperQA2?",
settings=Settings(
temperature=0.5, agent={"index": {"paper_directory": "my_papers"}}
),
)
Tác nhân mặc định sẽ sử dụng tác nhân dựa trên LLM, nhưng bạn cũng có thể chỉ định một tác nhân "fake" đại lý sử dụng đường dẫn cuộc gọi được mã hóa cứng để tìm kiếm -> thu thập bằng chứng -> trả lời để giảm mức sử dụng mã thông báo.
Thủ công (Không có tác nhân) Thêm/Truy vấn tài liệu
Thông thường thông qua việc thực thi tác nhân, tác nhân sẽ gọi công cụ tìm kiếm để thêm tài liệu vào Docs đối tượng cho bạn ở hậu trường. Tuy nhiên, nếu bạn thích kiểm soát chi tiết hơn, bạn có thể tương tác trực tiếp với Docs đối tượng.
Lưu ý rằng việc thêm và truy vấn theo cách thủ công Docs không ảnh hưởng đến hiệu suất. Nó chỉ loại bỏ tính năng tự động hóa liên quan đến tác nhân chọn tài liệu để thêm vào.
from paperqa import Docs, Settings
# valid extensions include .pdf, .txt, .md, .html, .docx, .xlsx, .pptx, and code files (e.g., .py, .ts, .yaml)
doc_paths = ("myfile.pdf", "myotherfile.pdf")
# Prepare the Docs object by adding a bunch of documents
docs = Docs()
for doc_path in doc_paths:
await docs.aadd(doc_path)
# Set up how we want to query the Docs object
settings = Settings()
settings.llm = "claude-3-5-sonnet-20240620"
settings.answer.answer_max_sources = 3
# Query the Docs object to get an answer
session = await docs.aquery("What is PaperQA2?", settings=settings)
print(session)
Không đồng bộ
PaperQA2 được viết để sử dụng không đồng bộ. API đồng bộ chỉ là một trình bao bọc xung quanh async. Dưới đây là các phương pháp và chúng async tương đương:
| Đồng bộ hóa | Không đồng bộ |
|---|---|
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 |
Phiên bản đồng bộ chỉ gọi phiên bản không đồng bộ trong một vòng lặp. Hỗ trợ môi trường Python hiện đại nhất async nguyên bản (bao gồm cả sổ ghi chép Jupyter!). Vì vậy, bạn có thể thực hiện việc này trong Notebook Jupyter:
import asyncio
from paperqa import Docs
async def main() -> None:
docs = Docs()
# valid extensions include .pdf, .txt, .md, .html, .docx, .xlsx, .pptx, and code files (e.g., .py, .ts, .yaml)
for doc in ("myfile.pdf", "myotherfile.pdf"):
await docs.aadd(doc)
session = await docs.aquery("What is PaperQA2?")
print(session)
asyncio.run(main())
Chọn mẫu
Theo mặc định, PaperQA2 sử dụng OpenAI's gpt-4o-2024-11-20 mô hình cho
summary_llm, llmvà agent_llm. Xin vui lòng xem Bảng tóm tắt cài đặt
để biết thêm thông tin về các cài đặt này. PaperQA2 cũng mặc định sử dụng OpenAI text-embedding-3-small mô hình cho embedding thiết lập. Nếu không có khóa OpenAI API, bạn có thể sử dụng mô hình nhúng khác. Thông tin thêm về các mô hình nhúng có thể được tìm thấy trong phần "Mô hình nhúng".
Chúng tôi sử dụng lmi gói cho giao diện LLM của chúng tôi, do đó sử dụng litellm để hỗ trợ nhiều nhà cung cấp LLM. Bạn có thể điều chỉnh điều này một cách dễ dàng để sử dụng bất kỳ mô hình nào được hỗ trợ bởi litellm:
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="gpt-4o-mini", summary_llm="gpt-4o-mini", agent={"index": {"paper_directory": "my_papers"}}
),
)
Để sử dụng Claude, hãy đảm bảo bạn đặt ANTHROPIC_API_KEY biến môi trường. Trong ví dụ này, chúng tôi cũng sử dụng một mô hình nhúng khác. Hãy chắc chắn rằng pip install paper-qa[local] để sử dụng mô hình nhúng cục bộ.
from paperqa import Settings, ask
from paperqa.settings import AgentSettings
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="claude-3-5-sonnet-20240620",
summary_llm="claude-3-5-sonnet-20240620",
agent=AgentSettings(agent_llm="claude-3-5-sonnet-20240620"),
# SEE: https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1
embedding="st-multi-qa-MiniLM-L6-cos-v1",
),
)
Hoặc Gemini, bằng cách đặt GEMINI_API_KEY từ Google AI Studio
from paperqa import Settings, ask
from paperqa.settings import AgentSettings
answer_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="gemini/gemini-2.0-flash",
summary_llm="gemini/gemini-2.0-flash",
agent=AgentSettings(agent_llm="gemini/gemini-2.0-flash"),
embedding="gemini/text-embedding-004",
),
)
Được lưu trữ cục bộ
Bạn có thể sử dụng Llama.cpp làm LLM. Lưu ý rằng bạn nên sử dụng các mô hình tương đối lớn, vì PaperQA2 yêu cầu phải tuân theo rất nhiều hướng dẫn. Bạn sẽ không có được hiệu suất tốt với mô hình 7B.
Cách dễ nhất để thiết lập là tải xuống một tập tin Llama
và thực hiện nó với -cb -np 4 -a my-llm-model --embedding
điều này sẽ cho phép phân khối và nhúng liên tục.
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_response = ask(
"What is PaperQA2?",
settings=Settings(
llm="my-llm-model",
llm_config=local_llm_config,
summary_llm="my-llm-model",
summary_llm_config=local_llm_config,
),
)
Các mô hình được lưu trữ với ollama cũng được hỗ trợ. Để chạy ví dụ bên dưới, hãy đảm bảo bạn đã tải xuống llama3.2 và mxbai-embed-large qua 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_response = ask(
"What is PaperQA2?",
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",
),
)
Nhúng mô hình
Phần nhúng được sử dụng để truy xuất k văn bản (trong đó k được chỉ định thông qua Settings.answer.evidence_k) để sắp xếp lại và tóm tắt theo ngữ cảnh. Nếu bạn không muốn sử dụng phần nhúng mà thay vào đó chỉ tìm nạp tất cả các đoạn, hãy tắt "truy xuất bằng chứng" thông qua Settings.answer.evidence_retrieval thiết lập.
PaperQA2 mặc định sử dụng OpenAI (text-embedding-3-small) nhúng, nhưng có các tùy chọn linh hoạt cho cả cửa hàng vectơ và lựa chọn nhúng.
Chỉ định mô hình nhúng
Cách đơn giản nhất để xác định mô hình nhúng là thông qua Settings.embedding:
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(embedding="text-embedding-3-large"),
)
embedding chấp nhận mọi tên mô hình nhúng được hỗ trợ bởi litellm. PaperQA2 cũng hỗ trợ đầu vào nhúng của "hybrid-<model_name>"
tức là "hybrid-text-embedding-3-small" để sử dụng từ khóa thưa thớt kết hợp (dựa trên việc nhúng mã thông báo modulo) và nhúng vectơ dày đặc, trong đó bất kỳ mô hình Litellm nào cũng có thể được sử dụng trong tên mô hình dày đặc.
"sparse" chỉ có thể được sử dụng để sử dụng việc nhúng từ khóa thưa thớt.
Các mô hình nhúng được sử dụng để tạo chỉ mục của PaperQA2 cho các vectơ nhúng toàn văn bản (texts_index luận cứ). Mô hình nhúng có thể được chỉ định làm cài đặt khi bạn thêm giấy tờ mới vào Docs đối tượng:
from paperqa import Docs, Settings
docs = Docs()
for doc in ("myfile.pdf", "myotherfile.pdf"):
await docs.aadd(doc, settings=Settings(embedding="text-embedding-large-3"))
Lưu ý rằng PaperQA2 sử dụng Numpy làm kho lưu trữ vectơ dày đặc. Thiết kế sử dụng tìm kiếm từ khóa ban đầu giúp giảm số lượng đoạn cần thiết cho mỗi câu trả lời xuống một con số tương đối nhỏ <1k. Vì vậy, NumpyVectorStore là một nơi tốt để bắt đầu, đó là một kho lưu trữ trong bộ nhớ đơn giản, không có chỉ mục. Tuy nhiên, nếu cần một kho lưu trữ vectơ lớn hơn bộ nhớ, bạn có thể sử dụng cơ sở dữ liệu vectơ bên ngoài như Qdrant thông qua QdrantVectorStore lớp học.
Các phần nhúng kết hợp có thể được tùy chỉnh:
from paperqa import (
Docs,
HybridEmbeddingModel,
SparseEmbeddingModel,
LiteLLMEmbeddingModel,
)
model = HybridEmbeddingModel(
models=[LiteLLMEmbeddingModel(), SparseEmbeddingModel(ndim=1024)]
)
docs = Docs()
for doc in ("myfile.pdf", "myotherfile.pdf"):
await docs.aadd(doc, embedding_model=model)
Các mô hình nhúng thưa (từ khóa) mặc định có 256 thứ nguyên, nhưng điều này có thể được chỉ định thông qua ndim lý lẽ.
Mô hình nhúng cục bộ (Biến đổi câu)
Bạn có thể sử dụng một SentenceTransformerEmbeddingModel mô hình nếu bạn cài đặt sentence-transformers, đó là một thư viện nhúng cục bộ với sự hỗ trợ cho các mẫu HuggingFace và hơn thế nữa. Bạn có thể cài đặt nó bằng cách thêm local tính năng bổ sung.
pip install paper-qa[local]
và sau đó nhúng tiền tố tên mô hình với st-:
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(embedding="st-multi-qa-MiniLM-L6-cos-v1"),
)
hoặc với một mô hình lai
from paperqa import Settings, ask
answer_response = ask(
"What is PaperQA2?",
settings=Settings(embedding="hybrid-st-multi-qa-MiniLM-L6-cos-v1"),
)
Điều chỉnh số lượng nguồn
Bạn có thể điều chỉnh số lượng nguồn (đoạn văn bản) để giảm mức sử dụng mã thông báo hoặc thêm ngữ cảnh.
k đề cập đến k đoạn văn có liên quan và đa dạng nhất (có thể từ các nguồn khác nhau). Mỗi đoạn văn được gửi đến LLM để tóm tắt hoặc xác định xem nó có liên quan hay không. Sau bước này, giới hạn max_sources được áp dụng sao cho câu trả lời cuối cùng có thể vừa với cửa sổ ngữ cảnh LLM. Như vậy, k > max_sources và max_sources là số lượng nguồn được sử dụng trong câu trả lời cuối cùng.
from paperqa import Settings
settings = Settings()
settings.answer.answer_max_sources = 3
settings.answer.evidence_k = 5
await docs.aquery(
"What is PaperQA2?",
settings=settings,
)
Sử dụng Mã hoặc HTML
Bạn không cần sử dụng giấy tờ -- bạn có thể sử dụng mã hoặc HTML thô. Lưu ý rằng công cụ này tập trung vào việc trả lời các câu hỏi nên sẽ không hoạt động tốt trong việc viết mã. Một lưu ý là công cụ không thể suy ra trích dẫn từ mã nên bạn sẽ phải tự cung cấp.
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
await docs.aadd(
f, citation="File " + os.path.basename(f), docname=os.path.basename(f)
)
session = await docs.aquery("Where is the search bar in the header defined?")
print(session)
Hỗ trợ đa phương thức
Các trung tâm hỗ trợ đa phương thức về:
- Hình ảnh độc lập
- Hình ảnh hoặc bảng trong tệp PDF
các Docs đối tượng lưu trữ phương tiện thông qua một ParsedMedia đối tượng. Khi phân đoạn một tài liệu, phương tiện không bị phân chia ở ranh giới khối, do đó có thể có hơn 2 khối có thể tương ứng với cùng một phương tiện. Điều này có nghĩa là trong PaperQA, mỗi đoạn có mối quan hệ một-nhiều giữa ParsedMedia và khối.
Tùy thuộc vào tài liệu nguồn, cùng một hình ảnh có thể xuất hiện nhiều lần (ví dụ: mỗi trang của tệp PDF có logo ở lề). Vì vậy, khách hàng nên coi cơ sở dữ liệu đa phương tiện có mối quan hệ nhiều-nhiều với các khối.
Do quy trình thu thập bằng chứng của PaperQA tập trung vào truy xuất dựa trên văn bản nên có thể (các) hình ảnh hoặc (các) bảng có liên quan không được truy xuất vì nội dung văn bản liên quan của chúng không liên quan. Để có một ví dụ cụ thể, hãy tưởng tượng hình ảnh trong một bài báo có chú thích ngắn gọn và được đặt một trang sau phần thảo luận văn bản chính có liên quan. Để giải quyết vấn đề này, PaperQA hỗ trợ làm giàu phương tiện tại thời điểm đọc tài liệu. Về cơ bản sau khi đọc bản PDF, parsing.enrichment_llm được đưa ra parsing.enrichment_prompt
và văn bản cùng vị trí để tạo chú thích tổng hợp cho mọi hình ảnh/bảng. Chú thích tổng hợp được sử dụng để thay đổi phần nhúng của từng đoạn văn bản nhưng được giữ tách biệt với văn bản nguồn thực tế. Bằng cách này, việc thu thập bằng chứng có thể tìm nạp các hình ảnh/bảng có liên quan mà không có nguy cơ làm ô nhiễm các tóm tắt theo ngữ cảnh với chú thích do LLM tạo.
Nếu bạn muốn đọc PDF đa phương thức nhưng không muốn làm giàu (vì đã thêm một dấu nhắc/phương tiện LLM vào thời gian đọc), có thể tắt tính năng làm giàu bằng cách cài đặt parsing.multimodal để ON_WITHOUT_ENRICHMENT.
Khi tạo các bản tóm tắt theo ngữ cảnh trên một đoạn nhất định (một Text), bản tóm tắt LLM được truyền cả văn bản của đoạn và phương tiện liên quan của đoạn đó, nhưng bản thân bản tóm tắt theo ngữ cảnh đầu ra vẫn chỉ ở dạng văn bản.
Nếu bạn muốn, chỉ định lời nhắc paperqa.prompts.summary_json_multimodal_system_prompt
đến cài đặt prompt.summary_json_system
sẽ bao gồm một used_images gắn cờ ghi nhận việc sử dụng hình ảnh trong bất kỳ tóm tắt theo ngữ cảnh nào.
Sử dụng DB/Vector DB bên ngoài và bộ nhớ đệm
Bạn có thể muốn lưu trữ các văn bản được phân tích cú pháp và các phần nhúng trong cơ sở dữ liệu hoặc tệp bên ngoài. Sau đó, bạn có thể trực tiếp xây dựng một đối tượng Tài liệu từ những đối tượng đó:
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)
Tạo chỉ mục
Các chỉ mục sẽ được đặt trong thư mục chính theo mặc định. Điều này có thể được kiểm soát thông qua PQA_HOME biến môi trường.
Chỉ mục được tạo bằng cách đọc các tập tin trong IndexSettings.paper_directory. Theo mặc định, chúng tôi đọc đệ quy từ các thư mục con của thư mục giấy, trừ khi bị tắt bằng cách sử dụng IndexSettings.recurse_subdirectories. Thư mục giấy không được sửa đổi theo bất kỳ cách nào, nó chỉ được đọc từ đó.
Tệp kê khai
Quá trình lập chỉ mục cố gắng suy ra siêu dữ liệu giấy như tiêu đề và DOI bằng cách sử dụng quy trình xử lý văn bản được hỗ trợ bởi LLM. Bạn có thể tránh điểm không chắc chắn này bằng cách sử dụng tệp "tệp kê khai", là tệp CSV chứa DocDetails các trường (thứ tự không quan trọng). Ví dụ:
file_location: đường dẫn tương đối tới tệp PDF của bài báo trong thư mục chỉ mụcdoi: DOI của giấytitle: tên bài báo
Bằng cách cung cấp thông tin này, chúng tôi đảm bảo các truy vấn tới nhà cung cấp siêu dữ liệu như Crossref là chính xác.
Để dễ dàng tạo một bảng kê khai, có một phương thức lớp trợ giúp Doc.to_csv, cũng hoạt động khi được gọi DocDetails.
Tái sử dụng chỉ mục
Các chỉ mục tìm kiếm cục bộ được xây dựng dựa trên hàm băm của Settings đối tượng. Vì vậy hãy chắc chắn rằng bạn chỉ định đúng paper_directory đến của bạn IndexSettings đối tượng. Nói chung, nên:
- Tạo trước một chỉ mục cho một thư mục giấy tờ (có thể mất vài phút)
- Tái sử dụng chỉ mục để thực hiện nhiều truy vấn
import os
from paperqa import Settings
from paperqa.agents.main import agent_query
from paperqa.agents.search import get_directory_index
async def amain(folder_of_papers: str | os.PathLike) -> None:
settings = Settings(agent={"index": {"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="What is a cool retrieval augmented generation technique?",
settings=settings,
)
answer_response_2 = await agent_query(
query="What is PaperQA2?",
settings=settings,
)
Sử dụng trực tiếp khách hàng
Một trong những tính năng mạnh mẽ nhất của PaperQA2 là khả năng kết hợp dữ liệu từ nhiều nguồn siêu dữ liệu. Ví dụ, Bỏ tường phí có thể cung cấp trạng thái truy cập mở/liên kết trực tiếp tới các tệp PDF, tham khảo chéo có thể cung cấp bibtex, và Học giả ngữ nghĩa có thể cung cấp giấy phép trích dẫn. Đây là bản demo ngắn về cách thực hiện việc này:
from paperqa.clients import DocMetadataClient, ALL_CLIENTS
client = DocMetadataClient(metadata_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
cái client.query có nghĩa là để kiểm tra sự trùng khớp chính xác của tiêu đề. Nó hơi cứng (như đóng vỏ, thiếu chữ). Tuy nhiên, có những tiêu đề trùng lặp - vì vậy bạn cũng có thể thêm tác giả để phân biệt. Hoặc bạn có thể cung cấp doi trực tiếp client.query(doi="10.1038/s42256-024-00832-8").
Nếu bạn đang làm điều này ở quy mô lớn, bạn có thể không muốn sử dụng ALL_CLIENTS (chỉ cần bỏ qua đối số) và bạn có thể chỉ định trường cụ thể nào bạn muốn tăng tốc truy vấn. Ví dụ:
details = await client.query(
title="Augmenting large language models with chemistry tools",
authors=["Andres M. Bran", "Sam Cox"],
fields=["title", "doi"],
)
sẽ trả về nhanh hơn nhiều so với truy vấn đầu tiên và chúng tôi chắc chắn rằng tác giả sẽ khớp.
Bảng tóm tắt cài đặt
| Cài đặt | Mặc định | Mô tả |
|---|---|---|
llm |
"gpt-4o-2024-11-20" |
LLM để sử dụng chung bao gồm suy luận siêu dữ liệu (xem Docs.aadd) và tạo câu trả lời (xem công cụ Docs.aquery và gen_answer). |
llm_config |
None |
Cấu hình tùy chọn cho llm. |
summary_llm |
"gpt-4o-2024-11-20" |
LLM để tạo bản tóm tắt theo ngữ cảnh (xem công cụ Docs.aget_evidence và Gather_evidence). |
summary_llm_config |
None |
Cấu hình tùy chọn cho summary_llm. |
embedding |
"text-embedding-3-small" |
Mô hình nhúng để nhúng các đoạn văn bản khi thêm giấy tờ. |
embedding_config |
None |
Cấu hình tùy chọn cho embedding. |
temperature |
0.0 |
Nhiệt độ cho LLM. |
batch_size |
1 |
Kích thước lô để gọi LLM. |
texts_index_mmr_lambda |
1.0 |
Lambda cho MMR trong chỉ mục văn bản. |
verbosity |
0 |
Mức độ chi tiết của số nguyên để ghi nhật ký (0-3). 3 = tất cả các cuộc gọi LLM/Embeddings đã được ghi lại. |
custom_context_serializer |
None |
Chức năng không đồng bộ tùy chỉnh (xem phần nhập chữ ký) để ghi đè tuần tự hóa bối cảnh câu trả lời mặc định. |
answer.evidence_k |
10 |
Số lượng bằng chứng cần lấy. |
answer.evidence_retrieval |
True |
Sử dụng truy xuất và xử lý tất cả tài liệu. |
answer.evidence_summary_length |
"about 100 words" |
Độ dài của bản tóm tắt bằng chứng. |
answer.evidence_skip_summary |
False |
Có nên bỏ qua phần tóm tắt hay không. |
answer.evidence_text_only_fallback |
False |
Có cho phép thử lại việc tạo ngữ cảnh mà không có phương tiện hay không. |
answer.answer_max_sources |
5 |
Số lượng nguồn tối đa cho một câu trả lời. |
answer.max_answer_attempts |
None |
Max cố gắng tìm ra câu trả lời. |
answer.answer_length |
"about 200 words, but can be longer" |
Độ dài của câu trả lời cuối cùng. |
answer.max_concurrent_requests |
4 |
Yêu cầu đồng thời tối đa tới LLM. |
answer.answer_filter_extra_background |
False |
Có nên trích dẫn thông tin cơ bản từ mô hình hay không. |
answer.get_evidence_if_no_contexts |
True |
Cho phép thu thập bằng chứng lười biếng. |
answer.group_contexts_by_question |
False |
Nhóm các bối cảnh cuối cùng theo bối cảnh cơ bản gather_evidence câu hỏi trong lời nhắc ngữ cảnh cuối cùng. |
answer.evidence_relevance_score_cutoff |
1 |
Điểm giới hạn mức độ liên quan của bằng chứng cần đưa vào bối cảnh câu trả lời (bao gồm) |
answer.skip_evidence_citation_strip |
False |
Bỏ qua việc xóa trích dẫn khỏi gather_evidence bối cảnh |
parsing.page_size_limit |
1,280,000 |
Giới hạn ký tự trên mỗi trang. |
parsing.use_doc_details |
True |
Có nhận thông tin chi tiết về siêu dữ liệu cho tài liệu hay không. |
parsing.reader_config |
dict |
Đối số từ khóa tùy chọn cho trình đọc tài liệu. |
parsing.multimodal |
True |
Kiểm soát phân tích cú pháp cả văn bản và phương tiện từ các tài liệu hiện hành, cũng như có khả năng làm phong phú chúng bằng mô tả văn bản. |
parsing.defer_embedding |
False |
Có nên trì hoãn việc nhúng cho đến khi tóm tắt hay không. |
parsing.parse_pdf |
paperqa_pypdf.parse_pdf_to_pages |
Chức năng phân tích tập tin PDF. |
parsing.configure_pdf_parser |
Không hoạt động | Có thể gọi để định cấu hình trình phân tích cú pháp PDF trong parse_pdf, hữu ích cho các hành vi như cho phép ghi nhật ký. |
parsing.doc_filters |
None |
Bộ lọc tùy chọn cho các tài liệu được phép. |
parsing.use_human_readable_clinical_trials |
False |
Phân tích JSON thử nghiệm lâm sàng thành văn bản có thể đọc được. |
parsing.enrichment_llm |
"gpt-4o-2024-11-20" |
LLM để làm giàu phương tiện truyền thông. |
parsing.enrichment_llm_config |
None |
Cấu hình tùy chọn cho enrichment_llm. |
parsing.enrichment_page_radius |
1 |
Bán kính trang dành cho văn bản ngữ cảnh đang được làm phong phú. |
parsing.enrichment_prompt |
image_enrichment_prompt_template |
Mẫu nhắc nhở để làm phong phú phương tiện truyền thông. |
parsing.citation_prompt |
citation_prompt |
Nhắc tạo trích dẫn từ việc xem qua một đoạn. |
parsing.structured_citation_prompt |
structured_citation_prompt |
Nhắc tạo trích dẫn (trong JSON) khi xem qua một đoạn. |
parsing.disable_doc_valid_check |
False |
Gắn cờ để tắt tính năng kiểm tra xem tài liệu có giống văn bản hay không (được phân tích cú pháp chính xác). |
prompts.summary |
summary_prompt |
Mẫu tóm tắt văn bản phải chứa các biến phù hợp summary_prompt. |
prompts.qa |
qa_prompt |
Mẫu cho QA, phải chứa các biến phù hợp qa_prompt. |
prompts.select |
select_paper_prompt |
Mẫu chọn bài phải có biến phù hợp select_paper_prompt. |
prompts.pre |
None |
Mẫu lời nhắc trước tùy chọn chỉ có câu hỏi ban đầu để nối thêm thông tin trước lời nhắc qa. |
prompts.post |
None |
Lời nhắc xử lý hậu kỳ tùy chọn có thể truy cập các trường PQASession. |
prompts.system |
default_system_prompt |
Lời nhắc hệ thống cho mô hình. |
prompts.use_json |
True |
Có sử dụng định dạng JSON hay không. |
prompts.summary_json |
summary_json_prompt |
Lời nhắc tóm tắt dành riêng cho JSON. |
prompts.summary_json_system |
summary_json_system_prompt |
Lời nhắc của hệ thống về bản tóm tắt JSON. |
prompts.context_outer |
CONTEXT_OUTER_PROMPT |
Nhắc cách định dạng tất cả các ngữ cảnh trong câu trả lời tạo. |
prompts.context_inner |
CONTEXT_INNER_PROMPT |
Nhắc cách định dạng một ngữ cảnh trong câu trả lời được tạo. Phải chứa các biến 'tên' và 'văn bản'. |
prompts.answer_iteration_prompt |
answer_iteration_prompt_template |
Nhắc thêm các câu trả lời hiện có trước đó để cho phép lặp lại. Nội dung mặc định không có câu trả lời trước. |
agent.agent_llm |
"gpt-4o-2024-11-20" |
LLM bên trong các lựa chọn công cụ tạo tác nhân. |
agent.agent_llm_config |
None |
Cấu hình tùy chọn cho agent_llm. |
agent.agent_type |
"ToolSelector" |
Loại tác nhân sử dụng. |
agent.agent_config |
None |
Kwarg tùy chọn cho hàm tạo AGENT. |
agent.agent_system_prompt |
env_system_prompt |
Thông báo nhắc nhở hệ thống tùy chọn. |
agent.agent_prompt |
env_reset_prompt |
Đại lý nhắc nhở. |
agent.return_paper_metadata |
False |
Có đưa tiêu đề bài báo/năm vào kết quả của công cụ tìm kiếm hay không. |
agent.search_count |
8 |
Số lượng tìm kiếm. |
agent.timeout |
500.0 |
Thời gian chờ thực thi tác nhân (giây). |
agent.tool_names |
None |
Tùy chọn ghi đè trên các công cụ để cung cấp cho đại lý. |
agent.max_timesteps |
None |
Giới hạn trên tùy chọn đối với các bước môi trường. |
agent.agent_evidence_n |
1 |
Bằng chứng được xếp hạng hàng đầu n được hiển thị cho đại lý sau khi thu thập bằng chứng. |
agent.rebuild_index |
True |
Gắn cờ để xây dựng lại chỉ mục khi bắt đầu chạy tác nhân. |
agent.callbacks |
{} |
Danh sách được đặt tên của các lệnh gọi có thể được gọi với trạng thái môi trường. |
agent.index.name |
None |
Tên tùy chọn của chỉ mục. |
agent.index.paper_directory |
Current working directory |
Thư mục chứa các giấy tờ cần lập chỉ mục. |
agent.index.manifest_file |
None |
Đường dẫn đến tệp kê khai CSV có thuộc tính tài liệu. |
agent.index.index_directory |
pqa_directory("indexes") |
Thư mục lưu trữ các chỉ mục PQA. |
agent.index.use_absolute_paper_directory |
False |
Có sử dụng đường dẫn thư mục giấy tuyệt đối hay không. |
agent.index.recurse_subdirectories |
True |
Có lặp lại vào các thư mục con khi lập chỉ mục hay không. |
agent.index.concurrency |
5 |
Số lần đọc hệ thống tập tin đồng thời. |
agent.index.sync_with_paper_directory |
True |
Có đồng bộ hóa chỉ mục với thư mục giấy khi tải hay không. |
agent.index.batch_size |
1 |
Số lượng tệp cần xử lý trước khi chuyển sang chỉ mục. |
agent.index.files_filter |
lambda f: f.suffix in {...} |
Chức năng lọc để đánh dấu các tập tin trong thư mục giấy để lập chỉ mục. |
Tôi lấy giấy tờ ở đâu?
Vâng, đó thực sự là một câu hỏi hay! Có lẽ tốt nhất bạn chỉ nên tải xuống bản PDF của các bài viết mà bạn cho rằng sẽ giúp trả lời câu hỏi của mình và bắt đầu từ đó.
Xem tài liệu chi tiết về zotero, openreview và phân tích cú pháp
Cuộc gọi lại
Để thực thi một hàm trên mỗi đoạn hoàn thành LLM, bạn cần cung cấp một hàm có thể được thực thi trên mỗi đoạn. Ví dụ: để có được chế độ xem máy đánh chữ về phần hoàn thành, bạn có thể thực hiện:
from paperqa import Docs
def typewriter(chunk: str) -> None:
print(chunk, end="")
docs = Docs()
# add some docs...
await docs.aquery("What is PaperQA2?", callbacks=[typewriter])
Nhúng vào bộ nhớ đệm
Nói chung, các phần nhúng được lưu vào bộ đệm khi bạn chọn một Docs bất kể bạn sử dụng cửa hàng vector nào. Vì vậy, miễn là bạn lưu tài sản cơ bản của mình Docs object, bạn sẽ có thể tránh phải nhúng lại tài liệu của mình.
Tùy chỉnh lời nhắc
Bạn có thể tùy chỉnh bất kỳ lời nhắc nào bằng cách sử dụng cài đặt.
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 (pqac-abcd1234). "
"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
await docs.aquery("What is PaperQA2?", settings=settings)
Lời nhắc trước và sau
Theo cú pháp trên, bạn cũng có thể bao gồm các lời nhắc được thực thi sau truy vấn và trước truy vấn. Ví dụ: bạn có thể sử dụng điều này để phê bình câu trả lời.
Câu hỏi thường gặp
Tại sao tôi nhận được kết quả khác với bài viết của bạn?
Trong nội bộ FutureHouse, chúng tôi có một bộ công cụ hơi khác một chút. Chúng tôi đang cố gắng đưa một số trong số đó, chẳng hạn như truyền tải trích dẫn, vào kho lưu trữ này. Tuy nhiên, chúng tôi có API và giấy phép để truy cập các tài liệu nghiên cứu mà chúng tôi không thể chia sẻ công khai. Tương tự, trong kết quả của tài liệu nghiên cứu của chúng tôi, chúng tôi không bắt đầu với các tệp PDF có liên quan đã biết. Đại lý của chúng tôi phải xác định chúng bằng cách sử dụng tìm kiếm từ khóa trên tất cả các bài báo, thay vì chỉ một tập hợp con. Chúng tôi đang dần điều chỉnh hai phiên bản PaperQA này, nhưng cho đến khi có cách nguồn mở để tự do truy cập các tài liệu (thậm chí chỉ là các tài liệu nguồn mở), bạn sẽ cần phải tự cung cấp các tệp PDF.
Điều này khác với LlamaIndex hay LangChain như thế nào?
LangChain và LlamaIndex đều là các khung để làm việc với các ứng dụng LLM, với các phần trừu tượng được tạo cho quy trình công việc tác nhân và tạo tăng cường truy xuất.
Theo thời gian, nhóm PaperQA đã chọn trở thành người không phụ thuộc vào khung, thay vào đó thuê ngoài trình điều khiển LLM để LiteLLM và không có khuôn khổ nào ngoài Pydantic cho các công cụ của nó. PaperQA tập trung vào các bài báo khoa học và siêu dữ liệu của chúng.
PaperQA có thể được triển khai lại bằng cách sử dụng LlamaIndex hoặc LangChain. Ví dụ, của chúng tôi GatherEvidence công cụ này có thể được triển khai lại dưới dạng một công cụ truy xuất có xếp hạng lại và tóm tắt theo ngữ cảnh dựa trên LLM. Có cách làm tương tự với phương thức phản hồi cây trong LlamaIndex.
Tôi có thể lưu hoặc tải không?
các Docs lớp có thể được ngâm và giải nén. Điều này rất hữu ích nếu bạn muốn lưu phần nhúng của tài liệu và tải chúng sau.
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)
sinh sản
Chứa trong docs/2024-10-16_litqa2-splits.json5 là các ID câu hỏi được sử dụng trong quá trình đào tạo, đánh giá và phân chia kiểm tra, cũng như DOI trên giấy được sử dụng để xây dựng chỉ mục của các phần tách.
- Phân chia đào tạo và đánh giá: ID câu hỏi đến từ ID câu hỏi LitQA2 của LAB-Bench.
- Phân chia bài kiểm tra: ID câu hỏi đến từ ID câu hỏi LitQA2 của aviary-paper-data.
Có nhiều bài viết đang dần xây dựng PaperQA, được hiển thị bên dưới trong Trích dẫn. Để tái tạo:
skarlinski2024language: phân chia đào tạo và đánh giá được áp dụng. Việc phân chia thử nghiệm vẫn được giữ nguyên.narayanan2024aviarytraininglanguageagents: phân chia đào tạo, đánh giá và kiểm tra được áp dụng.
Ví dụ về cách sử dụng LitQA để đánh giá có thể được tìm thấy trong chuồng chim.litqa.
Trích dẫn
Vui lòng đọc và trích dẫn các tài liệu sau nếu bạn sử dụng phần mềm này:
@article{narayanan2024aviarytraininglanguageagents,
title = {Aviary: training language agents on challenging scientific tasks},
author = {
Siddharth Narayanan and
James D. Braza and
Ryan-Rhys Griffiths and
Manu Ponnapati and
Albert Bou and
Jon Laurent and
Ori Kabeli and
Geemi Wellawatte and
Sam Cox and
Samuel G. Rodriques and
Andrew D. White},
journal = {arXiv preprent arXiv:2412.21154},
year = {2024},
url = {https://doi.org/10.48550/arXiv.2412.21154},
}
@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},
journal = {arXiv preprent arXiv:2409.13740},
year = {2024},
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},
url = {https://doi.org/10.48550/arXiv.2312.07559}
}
Dự án cùng danh mục
Nền tảng phát triển Postgres. Supabase cung cấp cho bạn cơ sở dữ liệu Postgres chuyên dụng để xây dựng các ứng dụng web, thiết bị di động và AI của bạn.
Trình phân tích cú pháp PDF cho dữ liệu sẵn sàng cho AI. Tự động hóa khả năng truy cập PDF. Nguồn mở.
Kỹ thuật đảo ngược / Kiểm tra thâm nhập được ủy quyền / Gói bộ định tuyến kỹ năng nghiên cứu bảo mật Định tuyến được hỗ trợ bởi AI + Khởi động chuỗi công cụ theo yêu cầu + Cơ sở kiến thức tự phát triển Hỗ trợ Claude Code, Kiro, Cursor, Cline và các ứng dụng khách mã hóa AI khác 逆向/渗透/安全技能路由包 - AI 自动路由 +按需自举工具链 + 自动进化经验库 | 支持 Claude Code / Kiro / Cursor / Cline 等代码 AI 客户端
Chỉ mục vectơ được xây dựng trên TurboQuant, được viết bằng Rust với các liên kết Python
Khung trí tuệ tài liệu đa ngôn ngữ có lõi Rust. Trích xuất văn bản, siêu dữ liệu, hình ảnh và dữ liệu có cấu trúc từ 101 định dạng (115 phần mở rộng tệp) cộng với mã thông minh cho 371 ngôn ngữ mã. 15 liên kết ngôn ngữ — Rust, Python, Ruby, Java, Go, PHP, Elixir, C#, TypeScript — cộng với máy chủ CLI, REST API và MCP.