用 Sciverse 下载论文图表资源
多模态检索入门

用 Sciverse 下载论文图表资源

从全文 Markdown 中提取图表路径,通过 resource 接口获取二进制文件

用户场景
用户需要提取论文中的图表(如实验结果图、流程图、表格截图)用于报告、演示或多模态 RAG。
预估调用量
~3–10 次 API 调用
适用工具
contentresource
调用链路
content→ Markdown 中 ![](path)→ resource(file_name=path)→ 图片二进制

输入示例

content 返回的 Markdown 中包含:
![Figure 3](dt=<doc_id>/p_12/f3.png)
![Table 2](dt=<doc_id>/p_15/t2.png)

注:<doc_id> 为实际检索返回的 ID

输出示例

成功下载:
- f3.png (image/png, 245KB) → ./figures/f3.png
- t2.png (image/png, 180KB) → ./figures/t2.png

Agent Prompt 示例

当你需要论文中的图表时:
1. 先调用 content 获取全文 Markdown
2. 用正则提取所有 ![...](path) 中的 path
3. 对每个 path 调用 resource(file_name=path) 下载
4. 返回图片供用户查看或传给多模态模型分析

分步实现

Step 1: 环境准备

安装依赖并配置环境变量

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

Step 2: 从全文中提取图表路径

content 返回的 Markdown 中,图表以标准 Markdown 图片语法引用

import os
import re
import asyncio
import httpx
from pathlib import Path

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

async def get_content(doc_id: str, offset: int = 0, limit: int = 4000):
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.get(
            f"{BASE}/content", headers=HEADERS,
            params={"doc_id": doc_id, "offset": offset, "limit": limit}
        )
        resp.raise_for_status()
        return resp.json()

async def find_doc_id(query: str) -> str:
    """Use agentic-search to get a real doc_id for the figure example."""
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.post(
            f"{BASE}/agentic-search",
            headers=HEADERS,
            json={"query": query, "top_k": 3},
        )
        resp.raise_for_status()
        hits = (resp.json().get("hits") or [])
        if not hits:
            raise ValueError(f"No papers found for query: {query}")
        return hits[0]["doc_id"]

async def main():
    # 先通过 agentic-search 获取真实 doc_id
    doc_id = await find_doc_id("AlphaFold2 protein structure")
    result = await get_content(doc_id, offset=0, limit=4000)
    # 注意:响应字段是 text
    markdown_text = result["text"]
    # 提取所有图片路径
    figure_paths = re.findall(r'!\\[.*?\\]\\((.*?)\\)', markdown_text)
    print(f"Found {len(figure_paths)} figures:")
    for p in figure_paths:
        print(f"  {p}")
    return figure_paths

figure_paths = await main()

Step 3: 调用 resource 下载图表

对每个路径调用 resource 接口获取二进制数据。参数是 file_name(非 path)

async def download_resource(file_name: str, save_dir: str = "./figures"):
    """下载资源文件。参数 file_name 为 content 中提取的相对路径"""
    Path(save_dir).mkdir(exist_ok=True)
    async with httpx.AsyncClient(timeout=60) as client:
        resp = await client.get(
            f"{BASE}/resource",
            headers=HEADERS,
            params={"file_name": file_name}  # 注意:参数是 file_name
        )
        resp.raise_for_status()
        local_name = file_name.split("/")[-1]
        save_path = f"{save_dir}/{local_name}"
        Path(save_path).write_bytes(resp.content)
        print(f"  Saved: {save_path} ({len(resp.content)} bytes)")
        return save_path

async def download_all(paths: list):
    results = []
    for p in paths:
        try:
            saved = await download_resource(p)
            results.append(saved)
        except httpx.HTTPStatusError as e:
            print(f"  Failed: {p} ({e.response.status_code})")
    return results

saved_files = await download_all(figure_paths)

注意事项

  • resource 接口参数是 file_name(不是 path),传入 content 中提取的相对路径即可
  • resource 接口返回原始二进制流,Content-Type 为实际 MIME 类型
  • 图表路径格式通常为 dt=文献ID/p_页码/文件名,由 content 接口给出
  • 部分文档可能没有图表资源(resource 返回 404),需做异常处理
  • 建议在 Agent 侧缓存已下载的图表,避免重复请求

FAQ

如何获取论文图表?

先用 content 读取 Markdown 中的图表路径,再用 resource 获取资源文件。

resource API 是否负责图像理解?

不负责,resource 只返回资源,图像理解由上层多模态模型完成。

适合哪些资源?

适合论文中的 Figure、Table、实验图、流程图和补充图表资源。

找不到图表怎么办?

需要先确认论文全文中是否包含可解析的资源路径,再决定是否回退到文本证据。

下一步

还没有 API Key?

登录控制台「密钥」即可创建。同一套 API Key 可用于已开通的 Sciverse、点石与 Skills 能力,提供基础试用额度,具体以账号权限为准。

前往控制台