导语

当 GPU、模型和科研 Agent 快速进入实验室,一个容易被忽略的瓶颈开始显现:Agent 能计算,却未必能稳定找到、读取并核验科学证据。AI for Science 的下一层基础设施,不只是更多算力,而是把论文、原文上下文和引用关系变成 Agent 可调用的数据接口。

正文

算力基础设施正在扩张,数据接口却仍然碎片化

最近,AMD 计划为牛津大学牵头的 BOLD 实验室提供算力支持。该实验室关注新型学习算法、人机协同发现和多 Agent 探索。这是一个典型信号:AI for Science 正从“给研究者一个模型”走向建设长期运行的科研基础设施。

与此同时,OpenAI 的科学计算实践报告也展示了编码 Agent 在生命科学项目中的应用,并强调科研验证仍然需要专家判断。

问题在于,GPU、模型和 Agent 框架解决的主要是推理与执行能力,并没有自动解决科学数据如何进入工作流的问题。

一个科研 Agent 接到问题后,通常还要完成:

  1. 找到相关论文,而不是只命中几个看似相关的网页;
  2. 区分论文级元数据与段落级证据;
  3. 从命中片段回到原文,检查限定条件和实验上下文;
  4. 保留 DOI、文献身份、页码或偏移量等来源信息;
  5. 在 Cursor、Claude、Codex 或 MCP 工作流中继续处理。

因此,今天更值得讨论的判断是:

AI for Science 的基础设施不能只有算力层,还需要面向科研 Agent 的 AI-ready 科学数据层。

“能检索”为什么不等于“能进入科研工作流”

通用 RAG 通常把文档切成 chunk,向量化后返回相似片段。这对企业知识库很有效,但科学文献有几个更严格的要求。

第一,片段必须有身份。

模型需要知道片段来自哪篇论文、哪个文档、什么位置。否则一段话即使内容正确,也很难成为可复核证据。

第二,片段必须能够返回原文。

摘要中的“显著改善”可能受到样本范围、对照组、置信区间和实验条件限制。只把命中的两句话交给模型,容易丢失这些限定信息。

第三,论文和片段不是同一种检索对象。

“返回 10 个 chunk”不代表“返回 10 篇论文”。多个片段可能来自同一篇论文;论文级筛选也不等同于全文语义检索。Agent 必须明确当前操作的数据粒度。

第四,数据访问必须能够组合。

检索、原文阅读、元数据筛选、引用关系和图表资源如果分别来自不同系统,开发者就要自行处理身份映射、字段差异、鉴权、重试和来源追踪。

这不是模型多想几步就能自动消失的问题,而是数据接口设计问题。

学术数据服务的定位并不相同

能力维度SciverseOpenAlexSemantic ScholarCrossref通用向量数据库
结构化文献元数据支持核心能力支持核心能力需自行导入
语义证据片段agentic-search非核心定位部分场景支持非核心定位取决于自建索引
命中后读取原文上下文content非核心定位非核心定位非核心定位需自行保存原文
引用与相关工作关系支持部分支持需自行建图
Figure/Table 资源支持资源获取非核心定位非核心定位非核心定位需自行解析
Agent 工作流接入REST、Agent Tools、MCP 等通常需封装通常需封装通常需封装需自行设计工具

这些系统不是简单的替代关系。

OpenAlex 适合构建开放学术图谱和宏观分析;Crossref 擅长 DOI 注册元数据;Semantic Scholar 提供论文发现和学术关系能力;向量数据库适合承载开发者自己的语义索引。

Sciverse 的切入点则是:把科学检索、原文上下文及其他科研数据能力组织成可组合的 Agent 调用层。其定位不是普通搜索框,也不是替 Agent 生成最终科学结论,而是面向科研 Agent 的 AI-ready 科学数据层。

一套更完整的科研 Agent 基础设施

可以把 AI for Science 工作流拆成四层:

层级解决的问题典型组件
计算层模型在哪里训练、推理和运行GPU、集群、云计算、任务调度
Agent 层如何规划、调用工具和执行代码Cursor、Claude、Codex、MCP、Agent 框架
科学数据层如何检索、读取和关联科学证据Sciverse 等科学数据接口
验证层如何让研究者复查证据和结论来源记录、原文上下文、评测集、人工审阅

其中,科学数据层负责把模型的自然语言意图转换为具有来源身份的数据对象。

以“某类材料的循环稳定性受哪些机制影响”为例,最小链路可以是:

科研问题
  ↓
agentic-search:检索相关 evidence chunks
  ↓
保留 doc_id、chunk_id、offset、title
  ↓
content:读取命中位置前后的原文
  ↓
Agent 比较证据、标注冲突与适用条件
  ↓
研究者检查来源后决定是否采纳

这里最关键的设计,不是让 Agent 一次生成更长的答案,而是让每个重要判断都能沿着 doc_id + offset 回到来源。

用 Sciverse 构建一个最小“证据回读”流程

以下代码使用当前文档中的 REST 接口。响应中的可选字段应做容错处理,具体字段以最新线上文档或 OpenAPI 为准。

import os
import time
import requests

BASE_URL = "https://api.sciverse.space"
API_TOKEN = os.environ["SCIVERSE_API_TOKEN"]

HEADERS = {
    "Authorization": f"Bearer {API_TOKEN}",
    "Content-Type": "application/json",
}

def request_with_backoff(method, url, **kwargs):
    for attempt in range(4):
        response = requests.request(
            method,
            url,
            headers=HEADERS,
            timeout=30,
            **kwargs,
        )

        if response.status_code == 429:
            # 生产环境可优先读取 Retry-After。
            wait_seconds = int(response.headers.get(
                "Retry-After", 2 ** attempt
            ))
            time.sleep(wait_seconds)
            continue

        response.raise_for_status()
        return response

    raise RuntimeError("Sciverse API 持续限流,请稍后重试")

# 1. 用自然语言检索证据片段。
search_response = request_with_backoff(
    "POST",
    f"{BASE_URL}/agentic-search",
    json={
        "query": (
            "What mechanisms affect the long-term cycling "
            "stability of solid-state lithium batteries?"
        ),
        "top_k": 5,
        "retrieval": "hybrid",
        "sub_queries": 2,
        "filters": {
            "lang": "en",
            "publication_published_year": {"gte": 2020},
        },
        "source_types": ["pdf"],
    },
).json()

hits = search_response.get("hits", [])

for hit in hits:
    print({
        "title": hit.get("title"),
        "chunk_id": hit.get("chunk_id"),
        "doc_id": hit.get("doc_id"),
        "offset": hit.get("offset"),
        "evidence": hit.get("chunk"),
        "score": hit.get("score"),
    })

if not hits or not hits[0].get("doc_id"):
    raise RuntimeError("没有获得可回读原文的 doc_id")

# 2. 从最高相关片段回到原文上下文。
top_hit = hits[0]
hit_offset = int(top_hit.get("offset") or 0)
context_offset = max(0, hit_offset - 400)

content_response = request_with_backoff(
    "GET",
    f"{BASE_URL}/content",
    params={
        "doc_id": top_hit["doc_id"],
        "offset": context_offset,
        "limit": 1600,
    },
).json()

print({
    "source_title": top_hit.get("title"),
    "context": content_response.get("text", ""),
    "next_offset": content_response.get("next_offset"),
    "more": content_response.get("more", False),
})

agentic-search 在这里承担的是证据级检索,不是结构化论文列表查询;content 承担的是已知文档的原文读取,不是发现新论文。

Agent 后续还应执行三项检查:

  • 命中片段是否真的支持目标论断;
  • 前后文是否存在样本、条件或否定性限定;
  • 多篇来源之间是否一致,是否需要标注争议。

这才是一条可以交给研究者复核的科学证据路径。

为什么长上下文不能替代科学数据层

一种常见观点是:既然模型上下文窗口越来越长,直接把大量论文塞进去即可。

但长上下文解决的是“模型一次能读多少”,没有自动解决:

  • 应该读取哪些论文;
  • 当前片段属于哪个文献对象;
  • 如何过滤年份、期刊和研究领域;
  • 如何避免把同一论文的多个 chunk 当成独立来源;
  • 如何回到准确位置复查;
  • 如何按需获取引用关系和图表资源;
  • 如何在下一次运行中复现同一数据路径。

长上下文是推理资源,科学数据层提供的是检索边界、对象身份与可复核来源。两者互补,并不替代。

如何验证这套架构是否有效

本文未进行实测跑分,仅提供可复现评测方案。

可以准备一组带有已知参考文献的科学问题,并比较三种方案:

  1. 只使用通用搜索摘要;
  2. 只使用 chunk 级向量检索;
  3. 使用证据检索并回读原文上下文。

建议记录以下指标:

评测指标检查方法
来源可定位率关键论断是否保留文献身份和原文位置
证据支持率原文是否直接或合理支持生成的论断
上下文反转率回读上下文后,原判断是否需要撤回或加限定
来源独立性多条证据是否实际来自不同论文
检索复现率相同请求能否保存参数并重建候选证据
人工复核成本研究者确认一条论断需要多少操作

评测时应固定问题集、检索参数、时间窗口和人工标注规范,并分别报告检索失败、文献不可访问和证据冲突,不能只评价最终答案是否流畅。

AI for Science 的基础设施竞争,正在从“模型能做什么”转向“系统能否验证”

算力决定 Agent 能运行多大的模型、执行多少轮任务;科学数据层决定它能接触什么证据,以及结果能否回到来源。

科研工作流真正需要的,不是一个替研究者下最终结论的聊天机器人,而是一个能够稳定完成“检索—定位—回读—关联—交付证据”的数据接口体系。

这也是 Sciverse 的位置:为科研 Agent、RAG、Cursor、Claude、Codex 和 MCP 工作流提供 AI-ready 科学数据层。

开发者可以查看 Sciverse 文档和 OpenAPI,试用 Sciverse API,或接入 Sciverse Agent Tools,把科学文献检索与证据读取纳入现有 Agent 工作流。

参考来源

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐