用 Sciverse 做结构化论文筛选
检索Agent进阶
用 Sciverse 做结构化论文筛选
通过 meta-catalog 获取可用字段,用 meta-search 精确过滤论文
用户场景
用户需要按年份、期刊、作者、学科等条件精确筛选论文,类似学术搜索引擎的高级检索功能。
预估调用量
~2–5 次 API 调用
适用工具
meta-catalogmeta-search调用链路
meta-catalog→ 可用字段 + 算子→ meta-search(filters, sort)→ 结构化结果
输入示例
用户需求: "帮我找 2022–2024 年发表在 Nature 或 Science 上关于 CRISPR 基因编辑的论文,按引用数排序。"
输出示例
{
"total_count": 47,
"results": [
{"title": "Prime editing for...", "publication_published_year": 2023, "publication_venue_name_unified": "Nature", "citation_count": 892},
{"title": "CRISPR-Cas13...", "publication_published_year": 2022, "publication_venue_name_unified": "Science", "citation_count": 654}
]
}Agent Prompt 示例
当用户需要按条件筛选论文时:
1. 先调用 meta-catalog 获取可用字段和算子
2. 根据用户条件构造 filters(使用 FILTER_OP_* 枚举)
3. 调用 meta-search 执行检索
4. 如果用户条件模糊,先用 meta-catalog 确认字段名和可用值分步实现
Step 1: 环境准备
安装依赖并配置环境变量
!pip install httpx
import os
os.environ["SCIVERSE_API_TOKEN"] = "sv-your-token-here" # 替换为你的真实值
Step 2: 查询可用字段
meta-catalog 返回所有可过滤、可排序的字段及其算子
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()
async def main():
catalog = await get_catalog()
print("Available fields:")
for field in catalog["fields"]:
print(f" {field['name']} ({field.get('type','')}) - operators: {field.get('operators', [])}")
return catalog
catalog = await main()
Step 3: 构造过滤条件并检索
使用 FILTER_OP_* 枚举构造 filters,SORT_ORDER_* 构造排序
async def search_papers(filters: list, query: str = None, sort: list = None, page_size: int = 20):
"""调用 meta-search 进行结构化检索
提示: query 与 sort 可共用(传 sort 按字段硬排)。常见用法:
- 要相关性排序:传 query,不传 sort
- 要字段排序(如引用数):传 sort,不传 query
filters 格式: [{field, operator, value}]
operator 枚举: FILTER_OP_EQ / FILTER_OP_IN / FILTER_OP_GTE / FILTER_OP_LTE
sort 格式: [{field, order}]
order 枚举: SORT_ORDER_ASC / SORT_ORDER_DESC
"""
async with httpx.AsyncClient(timeout=30) as client:
body = {"filters": filters, "page_size": page_size}
if query:
body["query"] = query
if sort:
body["sort"] = sort
resp = await client.post(
f"{BASE}/meta-search", headers=HEADERS, json=body
)
resp.raise_for_status()
return resp.json()
async def main():
# 示例 1: 按引用数排序(不传 query)
results = await search_papers(
filters=[
{"field": "publication_published_year", "operator": "FILTER_OP_GTE", "value": 2022},
{"field": "publication_published_year", "operator": "FILTER_OP_LTE", "value": 2024},
{"field": "publication_venue_name_unified", "operator": "FILTER_OP_IN", "value": ["Nature", "Science"]}
],
sort=[{"field": "citation_count", "order": "SORT_ORDER_DESC"}]
)
print(f"Found {results.get('total_count', 0)} papers")
for h in (results.get("results") or [])[:5]:
print(f" {h['title']} ({h.get('publication_published_year','')}, "
f"{h.get('publication_venue_name_unified','')}, "
f"citations: {h.get('citation_count', 'N/A')})")
# 示例 2: 按相关性排序(传 query,不传 sort)
results2 = await search_papers(
query="CRISPR gene editing delivery",
filters=[
{"field": "publication_published_year", "operator": "FILTER_OP_GTE", "value": 2023}
]
)
print(f"\
Relevance search: {results2.get('total_count', 0)} papers")
await main()
注意事项
- meta-catalog 建议缓存结果(字段列表变化频率低),避免每次查询都调用
- query 与 sort 可共用:传 sort 按字段硬排(query 退化为命中过滤);只传 query 则按相关性排序
- filters 中的 operator 必须使用 FILTER_OP_* 枚举(如 FILTER_OP_GTE),不能用 gte/lte 等缩写
- sort 中的 order 必须使用 SORT_ORDER_ASC 或 SORT_ORDER_DESC
- 响应中论文列表字段是 results(非 hits),总数字段是 total_count(非 total)
- 常用字段名:publication_published_year、publication_venue_name_unified、author、citation_count
- 分页使用 page 和 page_size 参数
FAQ
什么时候用 meta-search?
当需要按 DOI、年份、期刊、引用数等结构化字段检索时使用。
为什么先调用 meta-catalog?
meta-catalog 可以确认哪些字段和操作符可用,避免 Agent 生成非法查询。
和 agentic-search 有什么区别?
meta-search 偏结构化筛选,agentic-search 偏自然语言语义证据召回。
适合批量任务吗?
适合构建候选论文池、排序列表和后续语义筛选输入。
下一步
还没有 API Key?
登录控制台「密钥」即可创建。同一套 API Key 可用于已开通的 Sciverse、点石与 Skills 能力,提供基础试用额度,具体以账号权限为准。