论文可信引用包 Evidence Pack
RAG工具进阶

论文可信引用包 Evidence Pack

将 claim / quote / doc_id / chunk_id / offset / page_no / title 标准化,RAG/Agent 的底层模板

用户场景
所有 RAG/Agent 案例都需要一个标准化的引用包格式。本案例定义了 Evidence Pack 的标准结构,并展示如何从 Sciverse 检索结果构建它。
预估调用量
~8–15 次 API 调用 / 一次构建
适用工具
agentic-searchcontent
调用链路
claim 列表→ agentic-search 逐条检索→ content 定位原文→ 标准化 evidence pack

输入示例

Agent 需要为以下 claim 构建引用包:
1. "AlphaFold2 在 CASP14 中达到了实验精度"
2. "mRNA 的 LNP 递送系统显著提高了细胞内化效率"

输出示例

{
  "evidence_pack": [
    {
      "claim": "AlphaFold2 在 CASP14 中达到了实验精度",
      "quote": "AlphaFold2 achieved a median GDT score of 92.4...",
      "doc_id": "由 agentic-search 返回的真实 ID",
      "offset": 12480,
      "title": "Highly accurate protein structure prediction...",,
      "venue": "Nature",
      "year": 2021,
      "confidence": 0.95
    }
  ]
}

Agent Prompt 示例

你是一个 Evidence Pack 构建 Agent。对每个 claim:
1. 调用 agentic-search 查找支持证据
2. 调用 content 定位原文确切引用
3. 标准化为 {claim, quote, doc_id, offset, title, venue, year, confidence}
4. confidence 基于语义匹配度和来源权威性

分步实现

Step 1: 环境准备

安装依赖并配置 API Token

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

Step 2: 定义 Evidence Pack 标准结构

定义标准化的引用包数据结构

from dataclasses import dataclass, asdict
from typing import Optional
import json

@dataclass
class EvidenceItem:
    claim: str
    quote: str
    doc_id: str
    offset: int
    title: str
    venue: Optional[str] = None
    year: Optional[int] = None
    confidence: float = 0.0

@dataclass
class EvidencePack:
    items: list[EvidenceItem]

    def to_json(self) -> str:
        return json.dumps({"evidence_pack": [asdict(i) for i in self.items]}, ensure_ascii=False, indent=2)

# \u793a\u4f8b
pack = EvidencePack(items=[])
print(pack.to_json())

Step 3: 为每个 claim 检索并构建引用

逐条检索 claim 对应的文献证据

import os
import asyncio
import httpx

BASE = "https://api.sciverse.space"
TOKEN = os.environ["SCIVERSE_API_TOKEN"]
HEADERS = {"Authorization": f"Bearer {TOKEN}"}

async def build_evidence(claim: str) -> Optional[EvidenceItem]:
    """\u4e3a\u5355\u4e2a claim \u68c0\u7d22\u5e76\u6784\u5efa\u5f15\u7528"""
    async with httpx.AsyncClient(timeout=30) as client:
        # Step 1: \u8bed\u4e49\u68c0\u7d22
        resp = await client.post(
            f"{BASE}/agentic-search", headers=HEADERS,
            json={"query": claim, "top_k": 5}
        )
        resp.raise_for_status()
        hits = (resp.json().get("hits") or [])
        if not hits:
            return None
        best = hits[0]

        # Step 2: \u8bfb\u53d6\u539f\u6587\u5b9a\u4f4d\u786e\u5207\u5f15\u7528
        resp2 = await client.get(
            f"{BASE}/content", headers=HEADERS,
            params={"doc_id": best["doc_id"], "offset": best.get("offset", 0), "limit": 800}
        )
        resp2.raise_for_status()
        text = resp2.json()["text"]

        return EvidenceItem(
            claim=claim,
            quote=text[:200],  # \u53d6\u524d 200 \u5b57\u7b26\u4f5c\u4e3a\u5f15\u7528
            doc_id=best["doc_id"],
            offset=best.get("offset", 0),
            title=best["title"],
            confidence=best["score"]
        )

claims = [
    "AlphaFold2 \u5728 CASP14 \u4e2d\u8fbe\u5230\u4e86\u5b9e\u9a8c\u7cbe\u5ea6",
    "mRNA \u7684 LNP \u9012\u9001\u7cfb\u7edf\u663e\u8457\u63d0\u9ad8\u4e86\u7ec6\u80de\u5185\u5316\u6548\u7387",
]

async def main():
    items = []
    for claim in claims:
        evidence = await build_evidence(claim)
        if evidence:
            items.append(evidence)
            print(f"\u2713 {claim[:40]}... -> {evidence.doc_id}")
        else:
            print(f"\u2717 {claim[:40]}... -> no evidence found")
    pack = EvidencePack(items=items)
    print(f"\
Evidence Pack ({len(items)}/{len(claims)} claims grounded):")
    print(pack.to_json())

await main()

注意事项

  • Evidence Pack 是所有 RAG/Agent 案例的底层模板,建议封装为通用工具
  • confidence 基于 agentic-search 的 score,可结合来源权威性进一步调整
  • quote 应从 content 返回的 text 中截取,而非 LLM 生成
  • 可扩展字段:page_no、chunk_id、section_title 等
  • 生产环境建议对每个 claim 并发检索以提高速度

FAQ

Evidence Pack 是什么?

是将 claim、quote、doc_id、offset、title 等字段标准化后的引用证据包。

为什么需要 Evidence Pack?

它让 Agent 输出的科学结论可以被追溯、复核和复用。

Evidence Pack 应包含哪些字段?

至少包含 claim、quote、doc_id、offset、title、year 和 confidence。

quote 可以由模型改写吗?

不建议,quote 应来自原文,模型可以另写解释但不能替代原文证据。

下一步

还没有 API Key?

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

前往控制台