论文可信引用包 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 能力,提供基础试用额度,具体以账号权限为准。