Chạy paper-qa đối chiếu với một endpoint tương thích OpenAI tùy chỉnh.
Updated 2026-07-30
paper-qa cấu hình model của nó qua các dict router LiteLLM, và litellm_params chấp nhận api_base. Trỏ nó vào https://api.apisrouter.com/v1, truyền một key, và các slot trả lời, tóm tắt, và agent mỗi cái có thể chạy bất kỳ model catalog nào trên thư viện bài báo riêng của bạn.
Câu trả lời nhanh: một dict router với api_base, tái dùng theo từng slot.
Object Settings của paper-qa nhận một tên model cộng một cấu hình router LiteLLM tùy chọn theo từng slot. Cấu hình router là một model_list mà litellm_params của nó mang api_base và api_key, đây chính là mẫu hình đã tài liệu hóa mà README dùng cho các server tương thích OpenAI lưu trữ cục bộ; một gateway đơn giản là mẫu hình đó với một URL công khai và một key thật. Đặt llm và summary_llm thành model_name bạn đã khai báo, gắn cấu hình vào cả hai slot, và paper-qa định tuyến qua gateway. Chuỗi model bên trong litellm_params giữ quy ước provider của litellm: openai/<id> báo litellm nói chat-completions tới api_base của bạn, và chuỗi sau dấu gạch chéo được chuyển tiếp tới endpoint, nên id Claude, GPT, Gemini, và GLM đều gọi được với cùng một dict.
gateway_config = dict(
model_list=[
dict(
model_name="claude-sonnet-4-6",
litellm_params=dict(
model="openai/claude-sonnet-4-6",
api_base="https://api.apisrouter.com/v1",
api_key=os.getenv("APISROUTER_API_KEY"),
temperature=0.1,
),
)
]
)Nơi paper-qa tiêu token: ba slot cộng embedding.
paper-qa (Future-House trên GitHub, khoảng 9K star) thực hiện trả lời câu hỏi có căn cứ truy xuất trên các PDF khoa học với một vòng lặp agentic bên trên: một agent quyết định khi nào tìm kiếm thư viện của bạn, thu thập các đoạn bằng chứng, tóm tắt độ liên quan của chúng, và soạn một câu trả lời có trích dẫn. Điều đó ánh xạ lên ba slot LLM có thể cấu hình riêng biệt. summary_llm đánh giá và cô đọng bằng chứng theo từng đoạn đã truy xuất, đây là slot khối lượng. llm viết câu trả lời cuối cùng từ bằng chứng đã lắp ráp, bước quan trọng về chất lượng. Và agent_llm (bên trong cài đặt agent) đưa ra các quyết định chọn tool điều khiển vòng lặp. Cả ba mặc định là một model OpenAI, và mỗi cái có một trường _config tương ứng (llm_config, summary_llm_config, agent_llm_config) chấp nhận cùng một dict router, nên một object cấu hình gateway có thể gắn vào từng slot trong khi tên model theo từng slot vẫn độc lập. Một sự phân chia phổ biến là một id nhanh tóm tắt bằng chứng và một id frontier viết câu trả lời, cả hai qua một endpoint và một key. Embedding là khối lượng công việc thứ tư và tách biệt có chủ đích: cài đặt embedding (mặc định text-embedding-3-small) xây chỉ mục vector của các bài báo của bạn. Chuyển các slot chat sang một gateway không di chuyển embedding, và paper-qa hỗ trợ sentence-transformers cục bộ (tiền tố st-, qua các extra cục bộ) nếu bạn muốn chỉ mục hoàn toàn độc lập với bất kỳ endpoint từ xa nào.
Cài đặt đầy đủ: Settings với cấu hình theo từng slot.
Mẫu hình đầy đủ khai báo một entry router cho mỗi model bạn muốn gọi được và gắn cấu hình theo từng slot. Khai báo hai entry, một entry nhanh cho tóm tắt và một entry mạnh cho trả lời, giữ toàn bộ thiết lập trong một dict. Cùng định tuyến hoạt động từ CLI, vì pqa phơi bày bề mặt settings, nhưng đường Python là đường tái tạo được cho việc dùng nghiên cứu: object Settings đã tạo ra một câu trả lời có thể ghi log cạnh chính câu trả lời đó.
import os
from paperqa import Settings, ask
from paperqa.settings import AgentSettings
def entry(model_id, **params):
return dict(
model_name=model_id,
litellm_params=dict(
model=f"openai/{model_id}",
api_base="https://api.apisrouter.com/v1",
api_key=os.getenv("APISROUTER_API_KEY"),
**params,
),
)
gateway = dict(model_list=[
entry("claude-sonnet-4-6", temperature=0.1),
entry("claude-haiku-4-5-20251001", temperature=0.1),
])
answer = ask(
"What is the evidence for LK-99 room-temperature superconductivity?",
settings=Settings(
llm="claude-sonnet-4-6",
llm_config=gateway,
summary_llm="claude-haiku-4-5-20251001",
summary_llm_config=gateway,
agent=AgentSettings(
agent_llm="claude-sonnet-4-6",
agent_llm_config=gateway,
),
paper_directory="./papers",
),
)Chọn model theo từng slot.
Tinh chỉnh với pipeline bằng chứng cố định: cùng thư viện, cùng câu hỏi, hoán đổi một slot mỗi lần. Sau một endpoint mỗi ứng viên là một chuỗi model_name, và log sử dụng theo từng key định giá mỗi cấu hình theo từng câu hỏi, đây là con số một phòng lab thực sự lập ngân sách.
- summary_llm chạy một lần cho mỗi đoạn bằng chứng, mỗi câu hỏi. Trên một thư viện nghiêm túc đây là phần lớn áp đảo các lệnh gọi, nên một id nhanh (claude-haiku-4-5-20251001) đặt sàn chi phí cho toàn hệ thống trong khi chỉ cần phán đoán độ liên quan, không cần viết văn xuôi.
- llm soạn câu trả lời có trích dẫn từ bằng chứng đã lắp ráp. Đây là nơi văn phong khoa học chính xác, thận trọng xảy ra hoặc không; claude-sonnet-4-6 và gpt-5.5 là lựa chọn đáng tin cậy, và slot này ít lệnh gọi mỗi câu hỏi nên phần chi trả thêm bị giới hạn.
- agent_llm điều khiển vòng lặp: liệu có tìm kiếm lại, thu thập thêm bằng chứng, hay trả lời. Quyết định yếu ở đây lãng phí token ở mọi nơi khác, khiến một id tầng trung trở lên là lựa chọn kinh tế dù khối lượng của slot này thấp.
- Các id long-context như gemini-3.1-pro-preview đáng thử làm slot trả lời khi câu hỏi kéo bằng chứng từ nhiều bài báo cùng lúc.
Trả theo mức sử dụng · thấp hơn giá chính thức
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| Mô hình | Giá chính thức | Giá của chúng tôi |
|---|---|---|
| Claude Sonnet 4.6 | $3.00 / $15.00 per M | $2.40 / $12.00 per M |
| Claude Haiku 4.5 20251001 | $1.00 / $5.00 per M | $0.80 / $4.00 per M |
| GPT-5.5 | $5.00 / $30.00 per M | $4.00 / $24.00 per M |
| Gemini 3.1 Pro Preview | $2.00 / $12.00 per M | $1.60 / $9.60 per M |
| GLM-5.2 | $1.14 / $4.00 per M | $1.10 / $4.00 per M |
Các kiểu lỗi đặc thù của paper-qa.
Một slot bị bỏ ở mặc định. Đặt llm và llm_config nhưng không đặt summary_llm_config để việc tóm tắt ở model OpenAI mặc định, thứ khi đó đòi hỏi OPENAI_API_KEY và thất bại (hoặc âm thầm chia định tuyến của bạn thành hai endpoint nếu key đó tồn tại). Mỗi slot có trường _config riêng của nó; gắn dict gateway vào mọi slot bạn định di chuyển, kể cả agent_llm_config. Tên không khớp nhau. Settings.llm phải bằng một model_name trong model_list; litellm_params.model là thứ thực sự đi trên đường dây. Sai tên bên ngoài và router không có route; gõ sai id bên trong và gateway trả về model-not-found. Khi debug, kiểm tra hai chuỗi riêng biệt vì chúng thất bại khác nhau. Giả định embedding đi theo. Slot embedding xây và truy vấn chỉ mục vector và có mặc định cùng cấu hình riêng của nó. Nếu bạn không có key OpenAI cho embedding mặc định, cấu hình embedding một cách tường minh, hoặc dùng sentence-transformers cục bộ qua tiền tố st-. Trỏ lại embedding sau này cũng nghĩa là phải đánh chỉ mục lại: vector từ các model embedding khác nhau không trộn lẫn được. Thiếu giới hạn sinh cho câu trả lời dài. litellm_params chấp nhận max_tokens theo từng entry, và các ví dụ endpoint cục bộ upstream đặt nó có chủ đích. Một slot trả lời không có giới hạn hợp lý có thể cắt cụt các câu trả lời có trích dẫn dài, biểu hiện như điểm yếu model nhưng thực ra là một tham số. Đổ lỗi định tuyến cho vấn đề phân tích. Chất lượng của paper-qa phụ thuộc vào việc phân tích PDF và chia mẩu trước khi bất kỳ model nào thấy văn bản. Nếu câu trả lời không trích dẫn gì trên một thư viện bạn biết là liên quan, hãy kiểm tra bước lập chỉ mục; gateway chỉ thấy những gì truy xuất gửi cho nó.
Ai định tuyến paper-qa qua một gateway.
- Nhóm nghiên cứu chạy QA văn học trên các thư viện chia sẻ, nơi sử dụng theo từng key biến "phòng lab tốn bao nhiêu mỗi câu hỏi" từ một phỏng đoán thành một báo cáo.
- Đội muốn văn phong khoa học chất lượng Claude trong slot trả lời trong khi giữ khối lượng tóm tắt trên một id nhanh, một key cho cả hai.
- Người xây dựng nhúng paper-qa vào công cụ nội bộ, thay thế một bó secret vendor bằng một credential gateway mỗi môi trường.
- Người làm benchmark so sánh model trả lời trên các pipeline bằng chứng cố định, nơi mỗi ứng viên là một chuỗi cấu hình thay vì một tích hợp vendor.
- Lập trình viên không có quyền truy cập billing của một vendor cụ thể. Truy cập dựa trên nạp tiền không yêu cầu thẻ loại bỏ phụ thuộc đăng ký theo từng provider.
Xác minh endpoint và debug câu hỏi đầu tiên.
Xác nhận gateway phục vụ các id bạn đã khai báo; chuỗi litellm_params.model sau openai/ phải khớp chính xác một id đã phục vụ. Bậc thang lỗi trên lần ask() đầu tiên: một lỗi đòi OPENAI_API_KEY nghĩa là một slot nào đó vẫn ở model mặc định không gắn cấu hình; tìm xem bạn chưa di chuyển cái nào trong số llm, summary_llm, và agent_llm. Một lỗi 401 từ gateway là api_key bên trong litellm_params. Một lỗi router về một model không xác định nghĩa là Settings.llm không khớp bất kỳ model_name nào trong danh sách. Lỗi trong lúc lập chỉ mục thay vì trả lời chỉ tới cài đặt embedding hoặc phân tích PDF, không phải định tuyến chat. Một câu hỏi tỏa ra nhiều lệnh gọi tóm tắt cộng các bước agent cộng câu trả lời cuối, nên sau lần chạy thành công đầu tiên, góc nhìn theo từng request của console APIsRouter hiển thị sự phân chia slot bằng token thực. Đó là con số cần theo dõi khi thư viện lớn lên, vì khối lượng tóm tắt tăng theo bằng chứng đã truy xuất, không chỉ theo số câu hỏi.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50Câu hỏi thường gặp
paper-qa hỗ trợ một base URL tương thích OpenAI tùy chỉnh như thế nào?
Qua các cấu hình router LiteLLM của nó: mỗi cái trong llm_config, summary_llm_config, và agent_llm_config chấp nhận một model_list mà litellm_params bao gồm api_base và api_key. Đây là đúng mẫu hình đã tài liệu hóa mà paper-qa dùng cho các server tương thích OpenAI lưu trữ cục bộ, chỉ đổi thành một URL gateway.
Model trả lời và tóm tắt có thể đến từ các vendor khác nhau không?
Có. Mỗi slot ghép một tên model với cấu hình riêng của nó, nên một id Claude nhanh có thể tóm tắt bằng chứng trong khi GPT-5.5 hoặc Gemini viết câu trả lời cuối cùng, tất cả qua một api_base và một key. Khai báo một entry model_list cho mỗi id và tham chiếu chúng theo từng slot.
Tôi có cần đổi model embedding không?
Không, và thường bạn không nên làm ở cùng bước. Cài đặt embedding độc lập với các slot chat, và đổi model embedding làm mất hiệu lực chỉ mục vector hiện có của bạn. Nếu bạn thiếu key cho embedding mặc định, đặt embedding tường minh hoặc dùng sentence-transformers cục bộ với tiền tố st-.
Slot agent_llm là gì và nó có cần cấu hình không?
agent_llm, bên trong AgentSettings, điều khiển việc chọn tool: khi nào tìm kiếm, thu thập bằng chứng, hoặc trả lời. Nó mặc định là một model OpenAI như các slot khác, nên hãy gắn agent_llm_config với cùng dict gateway hoặc nó vẫn sẽ cố định tuyến tới provider mặc định.
Vì sao paper-qa vẫn đòi OPENAI_API_KEY sau khi tôi ghi đè?
Ít nhất một slot vẫn ở model mặc định không gắn cấu hình router. Kiểm tra llm, summary_llm, và agent_llm cùng các trường _config của chúng; lỗi nêu tên model nó đã thử gọi, giúp xác định slot bạn đã bỏ sót.
Điều này có hoạt động từ CLI pqa cũng như Python không?
CLI phơi bày cùng bề mặt settings, nhưng với định tuyến gateway đường Python là đường thực tế: các dict router bất tiện khi làm flag dòng lệnh, và một object Settings ghi log cạnh kết quả khiến các lần chạy nghiên cứu tái tạo được.