[ blog · tutorial ]10 min read

Cara Membangun Agen Tinjauan Literatur Ilmiah Tanpa Terkena Rate Limit

Sarah ChoyDiterbitkan 3 Mei 202610 menit baca
Cara Membangun Agen Tinjauan Literatur Ilmiah Tanpa Terkena Rate Limit

Bangun agen tinjauan literatur di atas arXiv + PubMed + Semantic Scholar mentah hari ini dan Anda akan menabrak 429 sebelum menyelesaikan sepuluh paper. Berikut alasan rate limit makin parah, apa yang sebenarnya dilakukan PaperQA / Undermind di balik layar, dan pola kerja yang sanggup bertahan dalam sesi tinjauan nyata.

TL;DR

  • arXiv mulai menerapkan throttling agresif pada akhir 2024 setelah scraper LLM memicu badai 429; batas yang terdokumentasi adalah 1 request setiap 3 detik, tetapi toleransi burst di dunia nyata lebih rendah.
  • 1.000 req/dtk milik Semantic Scholar dibagi di antara semua pemanggil yang tidak terautentikasi — praktis tidak dapat dipakai untuk agen produksi.
  • PubMed E-utils membatasi trafik tak terautentikasi pada 3 req/dtk; dengan API key, 10 req/dtk.
  • Agen yang benar-benar berfungsi (PaperQA2, Undermind, Elicit) semuanya memakai lapisan proxy / cache di depan sumber-sumber ini.
  • API Pick Academic Search membungkus arXiv, PubMed, bioRxiv, dan medRxiv dalam satu endpoint terkelola lajunya — 5 kredit per panggilan, hanya saat berhasil.

Masalahnya dalam satu paragraf

API akademik gratis itu luar biasa dan sedang dilahap hidup-hidup. arXiv, PubMed, dan Semantic Scholar dirancang di era ketika "seorang peneliti menulis skrip yang melakukan polling setiap beberapa detik" adalah skenario beban terburuk. Kini setiap mahasiswa S1 dengan Python menulis agen LLM yang menyebar lima puluh panggilan paralel untuk membaca referensi satu paper. Kalikan dengan ribuan agen serupa dan Anda mendapatkan pola yang staf arXiv sebut di X sebagai "arXiv-pocalypse" akhir 2024 — respons Rate Exceeded yang terus-menerus, layanan yang menurun, dan gelombang aturan throttling baru yang memukul para pengembang indie lebih keras daripada para pelaku jahat.

Hasilnya: agen tinjauan literatur yang berfungsi pada lima paper di lingkungan dev malah ambruk di tengah sesi tinjauan nyata. Pengguna mendapat jawaban setengah jadi dengan tiga kutipan alih-alih lima belas.

Artikel ini tentang cara membangun agen agar itu tidak terjadi.

Apa yang sebenarnya kena rate limit dan di mana

Rate limit terdokumentasi pada saat penulisan. arXiv dan Semantic Scholar sama-sama berhak menerapkan throttling lebih keras saat terjadi insiden — verifikasi sebelum integrasi bervolume tinggi.
arXivPubMed E-utilsSemantic ScholarOpenAlexAPI Pick Academic
CakupanPreprint fisika, matematika, CS, bioBiomedis (35M+ record)Lintas-disiplin (>200M)Lintas-disiplin (250M+)arXiv + PubMed + bioRxiv + medRxiv
Rate limit (tanpa auth)1 req / 3 dtk3 req / dtkPool bersama 1k/dtk (efektifnya rendah)100k req / hariBayar per panggilan, tanpa throttle per pengguna
Rate limit (dengan key)Sama — key hanya untuk volume besar10 req / dtkBucket per-key (diberikan perlahan)Sama
Mengembalikan teks lengkap?Ya (XML / tautan PDF)Abstrak sajaAbstrak + sebagian bebas paywallAbstrak + sebagianJudul + URL + cuplikan berbentuk abstrak
Format ramah-LLMTidak — Atom XMLTidak — XMLYa — JSONYa — JSONYa — JSON, cuplikan sudah dibentuk
BiayaGratisGratis (key disarankan)Gratis, key wajib untuk produksiGratis5 kredit/panggilan (~$0.005)

Apa yang sebenarnya dilakukan produk yang berhasil

PaperQA2, Undermind, Elicit, ResearchRabbit, dan paper-paper RAG agentik (mis. Open-Source Agentic Hybrid RAG Framework, arXiv 2508.05660) semuanya bertemu pada pola yang mirip. Tiga langkah rekayasa paling penting:

1. Cache berdasarkan DOI / arXiv ID, bukan berdasarkan query

Paper yang sama diminta oleh banyak query berbeda. Caching pada level hasil pencarian hampir tidak membantu; caching pada level pengenal paper membantu. Lapisan Redis kecil (atau bahkan SQLite) yang di-key pada doi:10.1038/... membayar dirinya sendiri dalam satu sore trafik agen.

2. Perlakukan citation graph sebagai indeks yang berubah lambat

Kekuatan Semantic Scholar bukan pada pencarian kata kunci; melainkan citation graph-nya. PaperQA2 memakainya untuk meluas dari satu paper benih ke klaster terkait, bukan untuk menemukan paper dari nol. Itu volume request yang jauh lebih kecil — satu panggilan per paper, bukan ratusan — dan tetap jauh di bawah rate limit.

3. Terima latensi sebagai kompromi, ATAU jadikan proxy untuk rate limit

Entah Anda membuat pengguna menunggu 30-60 detik untuk query cermat yang menghormati throttle (pilihan PaperQA2), atau Anda menambahkan lapisan yang mengagregasi trafik lintas pengguna dan menyodorkan satu antarmuka toleran-burst kepada agen (pilihan API Pick). Keduanya berhasil. Mencampurnya — UX latensi rendah di atas API publik yang ber-rate limit tanpa buffer — itulah yang gagal.

Kode yang berfungsi: agen literatur yang menyelesaikan

Agen minimum yang layak dan sanggup bertahan dalam sesi tinjauan nyata:

import requests
from anthropic import Anthropic

KEY = "pk_yourkey"
client = Anthropic()

def fetch_tool(path: str) -> dict:
    return requests.get(f"https://www.apipick.com{path}/tool-schema").json()["claude"]

# Two tools: academic search + URL extract for the full body
TOOLS = [
    fetch_tool("/api/search/academic"),
    fetch_tool("/api/extract"),
]

SYSTEM = """You are a literature-review research assistant. Process:

1. Use academic_search with the user's question to find relevant papers
   from arXiv, PubMed, bioRxiv, and medRxiv. One call usually returns
   the right set of seed papers.

2. For papers worth citing in detail, use extract_urls on the paper's URL
   to pull the body. Batch up to 5 URLs per call.

3. Answer the user's question with inline citations in the form
   [Author Year, doi/arxiv URL]. Quote findings verbatim where possible.

4. If the search returned <3 substantive results, expand the query and
   try once more. Don't loop indefinitely — say "I couldn't find a strong
   answer in the indexed literature" if nothing matches.

Be precise. Cite every factual claim. Distinguish preprints (arXiv,
bioRxiv, medRxiv) from peer-reviewed (PubMed) when it matters."""

def call_tool(block):
    name_to_path = {"academic_search": "/api/search/academic", "extract_urls": "/api/extract"}
    r = requests.post(
        f"https://www.apipick.com{name_to_path[block.name]}",
        json=block.input,
        headers={"x-api-key": KEY},
        timeout=60,
    )
    return {"type": "tool_result", "tool_use_id": block.id,
            "content": r.text, "is_error": r.status_code != 200}

def review(question: str) -> str:
    msgs = [{"role": "user", "content": question}]
    while True:
        r = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=4096,
            system=SYSTEM,
            tools=TOOLS,
            messages=msgs,
        )
        msgs.append({"role": "assistant", "content": r.content})
        if r.stop_reason == "end_turn":
            return "\n".join(b.text for b in r.content if b.type == "text")
        if r.stop_reason == "tool_use":
            results = [call_tool(b) for b in r.content if b.type == "tool_use"]
            msgs.append({"role": "user", "content": results})

print(review("Recent advances in LLM-based protein structure prediction (2025)"))

Biaya per pertanyaan:

  • 1-2 panggilan academic_search (5-10 kredit = $0.005-$0.010)
  • 1 panggilan extract yang mencakup 3-5 paper (6-10 kredit = $0.006-$0.010)
  • ~5.000 token input + 1.200 output ke Claude (~$0.04)

Angka bulat: ~5 sen per jawaban tinjauan literatur dengan kutipan. Pada 100 pertanyaan/hari itu $5/hari — kira-kira sama dengan biaya kafein harian seorang peneliti yang wajar.

Penyesuaian per sub-vertikal

Literatur biomedis

Condongkan agen ke PubMed (peer-reviewed) dan tandai secara eksplisit hit bioRxiv/medRxiv sebagai preprint. Ketika menanyakan "apa kata bukti terbaru", agen seharusnya memberi bobot lebih tinggi pada yang peer-reviewed. Satu baris di system prompt — "Jika sumber preprint dan peer-reviewed berbeda, dahulukan yang peer-reviewed dan catat perbedaannya" — menangani ini dengan rapi.

Matematika / CS

Di sini arXiv mendominasi. Rasio sinyal-terhadap-derau lebih baik daripada di biomedis, dan untuk karya fundamental kutipan lebih penting daripada kebaruan. Cari dengan query yang lebih luas dan biarkan agen yang memangkas.

Penemuan obat / klinis

Padukan dengan Clinical Search (ClinicalTrials.gov + label FDA + ChEMBL + DrugBank) untuk dimensi regulasi dan bioaktivitas yang tak bisa dicakup pencarian akademik. Kombinasi itu — literatur peer-reviewed + registri uji klinis + data struktural — adalah cara agen drug-repurposing atau farmakovigilans menjadi berguna.

Di mana ini berlaku umum

Masalah rate limit bukan eksklusif untuk pencarian akademik. Dataset publik terbuka mana pun yang merilis API di era pra-LLM kini dikenai pola beban yang sama: SEC EDGAR, USPTO, EPO, basis data catatan publik, layanan cuaca, data terbuka pemerintah. Pola rekayasa yang sama berlaku untuk semuanya — cache pada level entitas, lapisi dengan proxy terkelola, terima latensi sebagai alternatif ketika Anda tidak mampu membiayai proxy.

Pergeseran yang lebih dalam: pada 2026 sudah tidak masuk akal lagi mengharapkan API publik gratis menyerap beban agen LLM secara langsung. Endpoint-nya tidak hilang — tetapi sedang dibungkus oleh lapisan layanan terkelola berbayar yang hadir untuk menerjemahkan rate limit "peneliti manusia yang sopan" menjadi trafik "agen toleran-burst". API Pick Academic Search adalah salah satu lapisan tersebut untuk kasus penggunaan tinjauan literatur. Akan ada lebih banyak lagi.

Pertanyaan yang Sering Diajukan

Mengapa arXiv mulai menerapkan rate limit yang begitu agresif pada 2024?

Karena scraper berbasis LLM. Staf arXiv telah tegas menyatakannya di milis developer mereka dan di @arxiv di X tentang polanya: sebuah agen LLM menyebar 50 request paralel untuk mengambil referensi satu paper, kalikan dengan ribuan pengguna yang menjalankan alur kerja serupa, dan seluruh indeks pun menurun kinerjanya. Aturan 3 detik antar-request selalu terdokumentasi, tetapi penegakannya menjadi ketat mulai akhir 2024 / awal 2025.

Apakah 1.000 req/dtk milik Semantic Scholar benar-benar dibagi bersama?

Ya — itu adalah kumpulan (pool) tak terautentikasi, dibagi di antara setiap IP yang mengakses API publik. Dalam praktiknya, request tak terautentikasi mulai gagal pada jam sibuk terlepas dari laju individu Anda. Saran resminya adalah mengajukan API key, yang memindahkan Anda ke bucket per-key. Pengajuan memakan waktu berminggu-minggu dan diberikan dengan asumsi penggunaan akademik, bukan komersial.

Bagaimana dengan E-utils milik PubMed?

Lebih baik daripada yang lain — 3 req/dtk tanpa key, 10 req/dtk dengan key. Ajukan API key NCBI melalui email; biasanya diberikan pada hari yang sama untuk tujuan riset yang dinyatakan. Tetap saja: 10 req/dtk cukup untuk satu pengguna tetapi tidak memadai untuk produk multi-pengguna di mana setiap pertanyaan pengguna menyebar ke beberapa panggilan PubMed.

Mengapa PaperQA2 berhasil di tempat agen buatan sendiri saya gagal?

Tiga alasan. (1) PaperQA2 melakukan batching dan caching secara agresif — lookup DOI yang sama tidak pernah dilakukan dua kali. (2) Ia memakai Semantic Scholar terutama untuk citation graph-nya (satu panggilan per paper), bukan sebagai indeks pencarian. (3) Ia menerima wall-clock yang lebih lama per pertanyaan sebagai gantinya tidak melampaui batas. Jika Anda ingin UX yang sama dalam produk di mana pengguna mengharapkan respons 5 detik, Anda butuh lapisan dengan throughput lebih tinggi.

Apa yang sebenarnya dipecahkan oleh API Pick Academic Search?

Ia mengelola rate limit dan cakupan sumber sehingga agen Anda tidak perlu melakukannya. Satu panggilan POST /api/search/academic mengembalikan hasil yang sudah di-ranking dari arXiv, PubMed, bioRxiv, dan medRxiv sekaligus, sudah dibentuk untuk konsumsi LLM. 5 kredit per panggilan (≈$0.005), hanya dipotong saat HTTP 200. Anda cukup fokus pada loop agen dan prompt; throttling adalah masalah kami.

API yang digunakan dalam artikel ini

Sarah Choy
Ditulis oleh
Sarah Choy
CEO, API Pick

Sarah Choy adalah CEO API Pick. Ia menulis tentang membangun API siap produksi untuk AI agent dan alur kerja LLM.