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-searchcontentPipeline
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.