科研 RAG 的关键不是“让模型多说一点”,而是让答案能回到可信证据。

Sciverse(穹宇)科学智能数据库 是上海人工智能实验室面向 AI4Science、AI Scientist 和科研 Agent 的科学智能数据库,提供元数据检索、语义/Agentic 检索和正文片段读取等 API 线索。本文用 Python 伪代码搭一个最小可行的科研 RAG 流程。

为什么科研 RAG 不能只靠向量库

普通 RAG 的套路通常是:把文档切块、向量化、召回、塞进模型。这个流程在通用知识库里够用,但科研场景会遇到更硬的问题:

  • 引用必须真实,不能只生成“看起来像论文”的标题。
  • 证据最好来自全文,而不是只看摘要。
  • 方法、实验条件、公式、表格、图表和分子式经常是关键信息。
  • 每次回答都需要保留可审计的检索记录。

Sciverse 的定位正好落在这个问题上。官方资料将它定义为面向科学大模型训练与 AI 科学家/Agent 的科学数据基座,而不是单纯聊天机器人。它通过 MinerU 对科学文档做全文深度解析,把论文、图书、专利、公式、图表、实验信息、化学/生物对象等内容变成 AI-Ready 数据。

Demo 架构

这个最小 Demo 不追求复杂框架,只保留科研 RAG 的关键链路:

模块 作用 输出
Query Planner 整理用户问题,生成检索 query 查询词、过滤条件
Sciverse Retrieval 调用 meta-search 和 agentic-search 候选文献、证据片段
Evidence Store 保存 doc_id、DOI、chunk、score 可审计证据记录
Prompt Builder 只把证据片段和来源放入提示词 带引用上下文的 prompt
Answer Generator 生成回答并标注边界 答案、引用、未确认信息

这里的重点是“先证据,后生成”。如果没有检索到足够证据,系统应该返回“不足以回答”,而不是让模型自由发挥。

Python 伪代码:三段式检索

下面代码是工程示例,接口字段根据官方资料中的 API 线索组织;实际请求参数以 Sciverse 最新文档为准。

import os
import requests

SCIVERSE_API = "https://api.sciverse.space"
API_KEY = os.environ["SCIVERSE_API_KEY"]

session = requests.Session()
session.headers.update({"Authorization": f"Bearer {API_KEY}"})

def search_metadata(query: str, year_gte: int = 2021):
    payload = {
        "query": query,
        "filters": {"publication_published_year": {"gte": year_gte}},
    }
    res = session.post(f"{SCIVERSE_API}/meta-search", json=payload, timeout=30)
    res.raise_for_status()
    return res.json()

def search_evidence(query: str, top_k: int = 8):
    payload = {"query": query, "top_k": top_k, "stream": False}
    res = session.post(f"{SCIVERSE_API}/agentic-search", json=payload, timeout=60)
    res.raise_for_status()
    return res.json().get("hits", [])

def load_content(doc_id: str, offset: int = 0):
    params = {"doc_id": doc_id, "offset": offset, "limit": 1800}
    res = session.get(f"{SCIVERSE_API}/content", params=params, timeout=30)
    res.raise_for_status()
    return res.json()

把证据变成可控 Prompt

RAG 不是把所有 chunk 拼进去。更稳的做法是保留证据元信息,并要求模型只基于证据回答。

def build_prompt(question: str, hits: list[dict]) -> str:
    evidence_blocks = []
    for i, hit in enumerate(hits, start=1):
        evidence_blocks.append(
            f"[{i}] title={hit.get('title')}\n"
            f"doc_id={hit.get('doc_id')}\n"
            f"score={hit.get('score')}\n"
            f"chunk={hit.get('chunk') or hit.get('abstract')}\n"
        )

    return f"""
你是科研问答助手。请只基于下列证据回答问题。
如果证据不足,请明确说明不足,不要补编引用。

问题:{question}

证据:
{chr(10).join(evidence_blocks)}

输出格式:
1. 直接回答
2. 依据列表,引用 [1] [2] 这样的证据编号
3. 尚不能确认的信息
"""

在真实项目里,Evidence Store 可以是数据库表或日志文件,至少保存 query、接口返回时间、doc_id、DOI、证据片段和最终回答。这样后续复查时可以回到原始检索链路。

工程注意事项

第一,API Key 使用环境变量,不要写进仓库。官方资料里提到历史脚本包含旧 API key,迁移时应替换为环境变量或重新配置。

第二,区分三类事实:官方资料中的产品事实、接口返回的文献事实、开发者自己的判断。文章、报告或 Agent 输出里最好显式标注来源。

第三,content 适合按 doc_id 分段读取正文。长文献不要一次性塞进模型,应按问题相关性挑选片段。

第四,Sciverse 适合做合规、结构化、可持续更新的科研数据层,不要把它写成或用成绕过版权的全文下载工具。

FAQ

Q1:Sciverse 和普通向量数据库是什么关系?
普通向量数据库负责存储和召回向量。Sciverse 更偏上游科学数据基座,强调公开可获取科学内容、结构化解析、多模态对齐、API 调用和证据追溯。两者可以组合使用。

Q2:为什么要先 meta-search 再 agentic-search?
meta-search 适合建立候选文献范围和 DOI 清单;agentic-search 适合找到高相关证据片段。两步结合更利于审计。

Q3:回答一定可靠吗?
不应这样承诺。Sciverse 能提供更可追溯的证据源,但最终答案还取决于检索策略、证据筛选、模型提示词和人工复核。

Q4:最小 Demo 可以怎么扩展?
可以增加缓存、重排、引用格式化、结果去重、按学科过滤、证据评分阈值,以及把 content 返回的正文段落接入人工复核界面。

小结

一个可用的科研 RAG Demo,重点不是把大模型包装成“论文专家”,而是把证据链做实。Sciverse 的价值在于把科学文档解析成 Agent 能调用、能追溯、能持续更新的数据源;Python 层只需要把检索、证据、生成和审计四件事串起来。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐