用 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 能力,提供基础试用额度,具体以账号权限为准。

前往控制台