论文阅读助手
工具RAG入门
论文阅读助手
给定 doc_id 后分段读取全文,抽取方法、数据、结论、局限
用户场景
用户已知论文 doc_id,需要分段读取全文并抽取关键信息(方法、数据、结论、局限)。比直接综述 Agent 更基础,也更容易跑通。
预估调用量
~5–12 次 API 调用 / 一篇论文
适用工具
content调用链路
doc_id→ content 循环读取→ 分段拼接全文→ LLM 抽取结构
输入示例
用户输入: "请帮我阅读这篇论文(先用 agentic-search 获取 doc_id) 提取方法、数据、结论和局限。"
输出示例
## 论文阅读报告 ### 方法 - 使用 Evoformer 模块进行多序列比对和结构预测... ### 数据 - CASP14 测试集: 87 个蛋白质结构域... ### 结论 - 中位 GDT 得分 92.4,远超其他方法... ### 局限 - 对多聚体复合物的预测精度较低...
Agent Prompt 示例
你是一个论文阅读助手。当用户提供 doc_id 时:
1. 循环调用 content(doc_id, offset, limit=4000) 读取全文
2. 用 next_offset 继续读取直到 more=false
3. 将全文传给 LLM 抽取结构化信息
4. 输出:方法、数据、结论、局限分步实现
Step 1: 环境准备
安装依赖并配置 API Token
!pip install httpx anthropic
import os
os.environ["SCIVERSE_API_TOKEN"] = "sv-your-token-here" # 替换为你的真实值
import os
os.environ["ANTHROPIC_API_KEY"] = "sk-ant-..." # 替换为你的真实值
Step 2: 分段读取全文
循环调用 content 接口,用 next_offset 拼接完整全文
import os
import asyncio
import httpx
BASE = "https://api.sciverse.space"
TOKEN = os.environ["SCIVERSE_API_TOKEN"]
HEADERS = {"Authorization": f"Bearer {TOKEN}"}
async def read_full_text(doc_id: str, chunk_size: int = 4000) -> str:
"""\u5faa\u73af\u8bfb\u53d6\u5168\u6587\uff0c\u76f4\u5230 more=false"""
full_text = []
offset = 0
async with httpx.AsyncClient(timeout=30) as client:
while True:
resp = await client.get(
f"{BASE}/content", headers=HEADERS,
params={"doc_id": doc_id, "offset": offset, "limit": chunk_size}
)
resp.raise_for_status()
data = resp.json()
full_text.append(data["text"])
if not data.get("more", False):
break
offset = data["next_offset"]
return "".join(full_text)
# \u5148\u901a\u8fc7 agentic-search \u83b7\u53d6\u771f\u5b9e doc_id
async def find_doc_id(query: str) -> str:
"""Find a real doc_id before reading full text."""
async with httpx.AsyncClient(timeout=30) as client:
resp = await client.post(
f"{BASE}/agentic-search",
headers=HEADERS,
json={"query": query, "top_k": 1},
)
resp.raise_for_status()
hits = (resp.json().get("hits") or [])
if not hits:
raise ValueError(f"No papers found for query: {query}")
return hits[0]["doc_id"]
doc_id = await find_doc_id("AlphaFold2")
text = await read_full_text(doc_id)
print(f"Full text length: {len(text)} chars")
print(f"Preview: {text[:300]}...")
Step 3: LLM 抽取结构化信息
将全文传给 LLM,抽取方法、数据、结论、局限
from anthropic import Anthropic
client = Anthropic()
def extract_structure(full_text: str) -> str:
"""\u7528 LLM \u62bd\u53d6\u8bba\u6587\u7ed3\u6784\u5316\u4fe1\u606f"""
# \u5982\u679c\u5168\u6587\u592a\u957f\uff0c\u53d6\u524d 15000 \u5b57\u7b26
content = full_text[:15000] if len(full_text) > 15000 else full_text
msg = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=3000,
messages=[{
"role": "user",
"content": f"""\u8bf7\u9605\u8bfb\u4ee5\u4e0b\u8bba\u6587\u5168\u6587\uff0c\u63d0\u53d6\u4ee5\u4e0b\u56db\u4e2a\u65b9\u9762\u7684\u5173\u952e\u4fe1\u606f\uff1a
1. **\u65b9\u6cd5**: \u6838\u5fc3\u6280\u672f\u65b9\u6cd5\u548c\u521b\u65b0\u70b9
2. **\u6570\u636e**: \u4f7f\u7528\u7684\u6570\u636e\u96c6\u3001\u5b9e\u9a8c\u8bbe\u7f6e\u3001\u5173\u952e\u6570\u503c
3. **\u7ed3\u8bba**: \u4e3b\u8981\u53d1\u73b0\u548c\u8d21\u732e
4. **\u5c40\u9650**: \u5df2\u77e5\u5c40\u9650\u548c\u672a\u6765\u5de5\u4f5c\u65b9\u5411
\u8bba\u6587\u5168\u6587:
{content}"""
}]
)
return msg.content[0].text
report = extract_structure(text)
print(report)
注意事项
- content 接口返回 {text, next_offset, more},循环读取直到 more=false
- 建议 chunk_size=4000,避免单次请求超时
- 如果全文超过 LLM 上下文窗口,可分段抽取后合并
- 这是最基础的论文阅读流程,可作为更复杂 Agent 的子模块
- 部分论文可能无全文(content 返回 404),需做异常处理
FAQ
如何读取长论文?
用 content 按 offset 分段读取,再分段抽取和合并结果。
阅读报告如何保证可追溯?
方法、数据、结论和局限都应绑定原文位置或 quote。
适合哪些阅读任务?
适合快速抽取论文方法、实验设置、数据集、结论和局限。
论文太长怎么办?
应分段总结,再合并成结构化报告,避免一次性塞入模型上下文。
下一步
还没有 API Key?
登录控制台「密钥」即可创建。同一套 API Key 可用于已开通的 Sciverse、点石与 Skills 能力,提供基础试用额度,具体以账号权限为准。