Systematic Review Screening Assistant
ReviewAgentAdvanced

Systematic Review Screening Assistant

Use meta-catalog, meta-search, and agentic-search for PRISMA-style initial screening

Scenario
Researchers in medicine, life sciences, materials, and related fields need PRISMA-style initial screening to select candidate papers from a large literature pool.
Estimated calls
~30-80 API calls per screening task
Tools
meta-catalogmeta-searchagentic-searchcontent
Pipeline
meta-catalog→ 确认可筛字段→ meta-search 广撒网→ agentic-search 精筛→ PRISMA 流程图

Input example

Screening criteria:
- population: patients with Alzheimer disease
- intervention: blood-based biomarkers
- year: 2020-2025
- include clinical studies only

Output example

Screening table:
- paper_id, title, year, include/exclude, reason, evidence quote
- PRISMA counts: retrieved, screened, included, excluded

Agent Prompt example

You are a systematic review screening assistant. Use structured filters to build the candidate pool, then semantic search and source verification to judge inclusion criteria.

Implementation steps

Step 1: Set up the environment

Configure token and dependencies

!pip install httpx pandas
import os
os.environ["SCIVERSE_API_TOKEN"] = "sv-your-token-here"  # 替换为你的真实值

Step 2: Query available screening fields

Use meta-catalog to identify useful filter fields

import os
import asyncio
import httpx

BASE = "https://api.sciverse.space"
TOKEN = os.environ["SCIVERSE_API_TOKEN"]
HEADERS = {"Authorization": f"Bearer {TOKEN}"}

async def get_catalog():
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.get(f"{BASE}/meta-catalog", headers=HEADERS)
        resp.raise_for_status()
        return resp.json()["fields"]

fields = await get_catalog()
for f in fields:
    print(f"{f['name']} ({f.get('type','')}): operators={f.get('operators', [])}")

Step 3: Run broad retrieval

Use meta-search to build the candidate set

import pandas as pd

async def broad_search(query: str, year_from: int, year_to: int, page_size: int = 100):
    """\u5e7f\u6492\u7f51: \u6309\u5e74\u4efd\u8303\u56f4\u68c0\u7d22\u6240\u6709\u5019\u9009\u6587\u732e"""
    all_results = []
    page = 1
    while True:
        async with httpx.AsyncClient(timeout=30) as client:
            resp = await client.post(
                f"{BASE}/meta-search", headers=HEADERS,
                json={
                    "query": query,
                    "filters": [
                        {"field": "publication_published_year", "operator": "FILTER_OP_GTE", "value": year_from},
                        {"field": "publication_published_year", "operator": "FILTER_OP_LTE", "value": year_to},
                    ],
                    "page": page, "page_size": page_size
                }
            )
            resp.raise_for_status()
            data = resp.json()
            all_results.extend((data.get("results") or []))
            if len(all_results) >= data.get("total_count", 0) or len((data.get("results") or [])) < page_size:
                break
            page += 1
    return all_results, data.get("total_count", 0)

INCLUSION_QUERY = "CAR-T cell therapy solid tumor clinical trial"
results, total = await broad_search(INCLUSION_QUERY, 2019, 2024)
print(f"Identification: {total} records found")

Step 4: Semantic screening and inclusion judgment

Use agentic-search and content to judge inclusion criteria with evidence

async def semantic_screen(candidates: list[dict], query: str, top_k: int = 100):
    """\u8bed\u4e49\u7cbe\u7b5b: \u7528 agentic-search \u5bf9\u5019\u9009\u6587\u732e\u8bc4\u5206"""
    candidate_ids = {r["doc_id"] for r in candidates if r.get("doc_id")}
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.post(
            f"{BASE}/agentic-search", headers=HEADERS,
            json={"query": query, "top_k": top_k}
        )
        resp.raise_for_status()
        hits = (resp.json().get("hits") or [])
    return [h for h in hits if h.get("doc_id") in candidate_ids]

hits = await semantic_screen(
    results,
    "CAR-T cell therapy clinical trial solid tumor patients outcomes"
)

# \u6309\u76f8\u5173\u6027\u5206\u6570\u7b5b\u9009
# screening 现在是 identification 候选池的子集
screened = [h for h in hits if h["score"] >= 0.7]
print(f"Screening: {len(screened)} records (score >= 0.7)")

# \u8f93\u51fa PRISMA \u6d41\u7a0b\u6570\u636e
prisma = {
    "identification": total,
    "screening": len(screened),
    "included": len([h for h in screened if h["score"] >= 0.85])
}
print(f"\
PRISMA Flow: {prisma}")

# \u5bfc\u51fa CSV
df = pd.DataFrame(screened)
df.to_csv("screened_papers.csv", index=False)
print("Exported to screened_papers.csv")

Notes

  • Keep inclusion and exclusion criteria explicit.
  • Store reasons for every excluded paper.
  • Use structured filters for the first pass and semantic evidence for the second pass.
  • Do not make final clinical conclusions without human review.
  • Record PRISMA-style counts for auditability.

FAQ

是否能替代人工系统综述?

不能,只适合自动化初筛和候选集整理,最终纳入仍需人工判断。

如何控制筛选条件?

用 meta-catalog 确认字段,再用 meta-search 和 agentic-search 逐步筛选。

输出应包含什么?

建议包含候选数量、纳入理由、排除理由、关键字段和可复核证据。

如何降低漏筛?

先用宽条件构建候选池,再逐步加入语义筛选和人工复核。

Next steps

Need an API key?

Create one in Console > Tokens.The same API key works for enabled Sciverse, DianShi, and Skills capabilities, with starter quota available according to account permissions.

Open console