用 Python 接入 Sciverse 做一个可追溯科研 RAG Demo
科研 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 层只需要把检索、证据、生成和审计四件事串起来。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)