Python 3.11 + Sciverse API:我们如何从0到1落地AI文献研究Agent

0 阅读3分钟

这是 Sciverse 科学数据库实战系列第 1 篇。   这一篇先讲架构:我们如何把一个“论文搜索框”,升级成能做 RAG、AI做综述、deep-research、自动化科研 的 Agent 工作流。

依据来源:Sciverse Docs:https://sciverse.space/docs

背景:不要再从PDF搬砖开始做科研RAG

我们项目最初的目标很简单:   输入一个科研问题,自动检索论文,生成带引用的综述。

但真正开工后发现,难点不是 LLM。

难点是数据链路:

  1. PDF 下载慢;
  2. 公式、表格、图像容易解析丢失;
  3. 文献切片没有统一 doc_id
  4. 向量数据库里存了一堆低质量 chunk;
  5. 最后生成的引用无法回到原文。

Sciverse 的核心价值就在这里:它把科学文献变成了 Agent 可调用的数据基座。

根据已有资料,Sciverse 提供:

  • 4500 万+ OA 文献;
  • T+1 持续更新;
  • MinerU 高保真解析;
  • meta-search、agentic-search、deep-search 等检索能力;
  • doc_id、chunk、正文片段、原文回溯能力。

架构设计:Sciverse做全局召回,本地只做任务缓存

我们没有把所有文献灌进自己的向量数据库。   原因很现实:成本高、更新慢、质量不可控。

最终架构是:

flowchart TD
  A[用户输入科研问题] --> B[Query Planner]
  B --> C[Sciverse meta-search]
  B --> D[Sciverse agentic-search / deep-search]
  C --> E[候选 doc_id]
  D --> F[高相关 chunk]
  E --> G[去重与证据聚合]
  F --> G
  G --> H[按 doc_id 读取正文片段]
  H --> I[本地缓存 / 向量数据库]
  I --> J[LLM 生成综述]
  J --> K[带引用 AI 文献研究报告]

核心原则:

  • Sciverse:负责科学文献检索、正文切片、原文回溯;
  • 本地向量数据库:只缓存当前任务相关 chunk;
  • LLM:负责问题拆解、证据组织、综述生成。

关键代码:统一封装检索入口

# sciverse_client.py
import os
import httpx


class SciverseClient:
    def __init__(self):
        self.base_url = os.getenv("SCIVERSE_BASE_URL", "https://sciverse.space")
        self.api_key = os.environ["SCIVERSE_API_KEY"]
        self.client = httpx.Client(
            timeout=30,
            headers={"Authorization": f"Bearer {self.api_key}"}
        )


    def agentic_search(self, query: str, top_k: int = 20):
        return self.client.post(
            f"{self.base_url}/api/sciverse/agentic-search",
            json={"query": query, "top_k": top_k}
        ).json()


    def read_content(self, doc_id: str, offset: int = 0, length: int = 6000):
        return self.client.post(
            f"{self.base_url}/api/sciverse/content",
            json={"doc_id": doc_id, "offset": offset, "length": length}
        ).json()

性能对比:整篇读取 vs 按需切片

我们压测了两种方案:

# 方案A:整篇读取
hey -n 200 -c 10 "http://localhost:8000/research/full"


# 方案B:Sciverse doc_id + offset + length 按需读取
hey -n 200 -c 10 "http://localhost:8000/research/slice"
方案平均延迟P95延迟单次上下文规模适合场景
整篇读取8.4s14.2s30K-80K tokens深读少量论文
按需切片2.1s4.8s4K-8K tokensdeep-research 多轮检索
切片+缓存0.9s1.7s4K-8K tokens高频选题追踪

结论:   AI 文献研究不是“越多上下文越好”,而是“证据足够、引用可信、成本可控”。

我们踩过的坑

第一个坑:只用向量数据库做召回。   科研问题里大量实体非常关键,比如 DOI、基因名、材料体系、反应条件。纯向量召回会漏掉精确实体。

第二个坑:不保存 source location。   报告生成后看起来很完整,但无法证明每个结论来自哪篇论文的哪个片段。

第三个坑:一次性拉太多论文。   top_k=100 看起来很猛,实际会让 Agent 的分析质量下降。更推荐 top_k=20,深读 5-8 篇。

总结

如果你要做 RAG、AI做综述、auto-research 或 deep-research,Sciverse 更像一个科学数据操作系统,而不是普通文献搜索工具。