用 Sciverse 做论文图表提取与分析 Demo
多模态检索Agent高级

用 Sciverse 做论文图表提取与分析 Demo

先检索论文,再从全文 Markdown 中定位图表路径并下载,结合多模态模型分析

用户场景
研究人员需要从论文中提取特定图表并进行分析。流程是先通过语义检索找到相关论文,再从全文中定位图表路径,下载后用多模态模型提取信息。
预估调用量
~8–20 次 API 调用
适用工具
agentic-searchcontentresource
调用链路
agentic-search(论文主题)→ content(提取图表路径)→ resource(下载图片)→ 多模态 LLM 分析

输入示例

用户提问:
"找到 AlphaFold2 论文中展示预测精度的图表,帮我分析其中的 GDT-TS 分布。"

输出示例

## 图表分析结果

### Figure 2 - AlphaFold2 vs Experimental (Nature 2021)
来源: doc_id=<由 agentic-search 返回>, 路径: dt=<doc_id>/p_5/fig2.png

分析:
- GDT-TS 中位数: 92.4
- 超过 90 的比例: 67%
- 关键发现: 在单域蛋白上接近实验精度

Agent Prompt 示例

你是一个论文图表提取与分析 Agent。工作流程:
1. 用 agentic-search 检索包含目标图表的论文
2. 用 content 读取全文 Markdown,提取 ![...](path) 中的图表路径
3. 用 resource(file_name=path) 下载图表图片
4. 用多模态模型分析图表内容
5. 返回结构化的图表信息和分析结果

注意:这不是"按视觉内容直接检索图表",而是先找论文再提取图表

分步实现

Step 1: 环境准备

安装依赖并配置环境变量

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

Step 2: 检索论文并提取图表路径

先通过语义检索找到相关论文,再从全文中定位图表

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 search_papers(query: str, top_k: int = 10):
    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()
        return (resp.json().get("hits") or [])

async def get_figures_from_doc(doc_id: str):
    """读取全文并提取图表路径"""
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.get(
            f"{BASE}/content", headers=HEADERS,
            params={"doc_id": doc_id, "offset": 0, "limit": 4000}
        )
        resp.raise_for_status()
        text = resp.json()["text"]  # 注意:字段是 text
        figure_paths = re.findall(r'!\\[.*?\\]\\((.*?)\\)', text)
        return figure_paths

async def main():
    hits = await search_papers("AlphaFold2 protein structure prediction accuracy")
    print(f"Found {len(hits)} relevant papers")
    # 对 top 3 论文提取图表
    all_figures = []
    for hit in hits[:3]:
        paths = await get_figures_from_doc(hit["doc_id"])
        print(f"  {hit['title'][:50]}: {len(paths)} figures")
        all_figures.extend([(hit["doc_id"], p) for p in paths])
    return all_figures

all_figures = await main()

Step 3: 下载图表并用多模态模型分析

调用 resource 下载图片,传给多模态 LLM 分析

import base64
from anthropic import Anthropic

async def download_figure(file_name: str, save_dir: str = "./figures"):
    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 = f"{save_dir}/{file_name.split('/')[-1]}"
        Path(local).write_bytes(resp.content)
        return local

def analyze_figure(image_path: str, question: str) -> str:
    """用多模态 LLM 分析图表"""
    client = Anthropic()
    with open(image_path, "rb") as f:
        img_data = base64.b64encode(f.read()).decode()

    msg = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=2048,
        messages=[{
            "role": "user",
            "content": [
                {"type": "image", "source": {
                    "type": "base64", "media_type": "image/png", "data": img_data
                }},
                {"type": "text", "text": question}
            ]
        }]
    )
    return msg.content[0].text

async def main():
    if all_figures:
        doc_id, path = all_figures[0]
        try:
            local = await download_figure(path)
            analysis = analyze_figure(local, "请描述这张图表的主要发现,提取关键数值。")
            print(f"\
Figure from {doc_id}:\
{analysis}")
        except httpx.HTTPStatusError as e:
            print(f"Download failed: {e.response.status_code}")

await main()

注意事项

  • 这不是按视觉内容直接检索图表的功能,而是:先找论文 → 提取图表路径 → 下载 → 分析
  • resource 接口参数是 file_name,传入 content 中提取的相对路径
  • 部分论文可能没有可下载的图表资源(resource 返回 404)
  • 多模态分析质量取决于图表清晰度和 LLM 能力
  • 建议对图表分析结果做结构化提取(JSON schema)便于下游使用

FAQ

适合什么场景?

适合需要查找论文图、表、流程图、实验结果图的多模态科研任务。

和 download-figures 有什么区别?

本案例从语义问题开始检索论文,再定位图表;download-figures 更偏给定论文后的资源下载。

需要哪些 API?

通常先用 agentic-search 找论文,再用 content 定位路径,最后用 resource 获取资源。

Sciverse 是否直接解释图片?

不直接解释图片,Sciverse 提供图表资源,上层多模态模型负责理解。

下一步

还没有 API Key?

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

前往控制台