基于 MCP 的个性化 arXiv 论文服务构建实践
本文内容源自《AI Agent智能体与MCP开发实战》第13章的学习总结,旨在设计并实现一个依托于 MCP(Model Context Protocol) 的智能学术辅助系统。该系统可模拟专业科研助手行为,完成论文检索、内容摘要、质量筛选以及个性化推荐等任务。
一、技术选型背景:为何选择 MCP?
MCP(Model Context Protocol) 是一种将外部能力(如 API 接口、文件资源、提示词模板等)以标准化方式暴露给 AI 智能体的通信协议。其核心能力分为三类:
- Tools:类似于函数调用机制,用于接入外部功能接口,例如查询论文、获取元数据或下载 PDF 文件。
- Resources:代表可读取的数据源或存储对象,比如缓存的论文列表、用户偏好配置等。
- Prompts:提供结构化提示模板,便于智能体复用统一格式进行推理与生成。
在 arXiv 学术服务场景中,MCP 展现出高度适配性:
- 论文的搜索、抓取、摘要提取等操作均可抽象为标准 Tool 接口。
- 用户的浏览历史、研究方向偏好和已缓存的文献信息适合通过 Resource 进行持久化管理。
- 推荐逻辑与文本生成过程可通过预设的 Prompt 模板 实现一致性输出。
- 多智能体协作架构下(如分别负责检索、摘要、推荐的 Agent),MCP 支持工具共享与权限隔离,提升系统可维护性。
具体到 arXiv 应用场景:
- Query、Fetch、Summarize 等流程均可封装为独立的 MCP Tool。
- PDF 文档及元数据可作为 Resource 被多个模块共用。
- 用户的研究领域描述可嵌入 Prompt 模板,驱动智能体自动适配语境。
MCP 的主要优势包括:
- 兼容任意大语言模型(LLM)平台
- 工具定义标准化,支持跨 Agent 复用
- 支持自动参数解析与填充,特别适用于 arXiv 这类结构化程度高的 API 服务
二、系统整体架构设计
本系统的层级结构如下所示:
┌───────────────────────────┐
│ AI Agent │
│ (具备 MCP 客户端能力的 LLM) │
└───────────────┬───────────┘
│ MCP 协议通信
▼
┌───────────────────────────┐
│ arXiv MCP Server │
├───────────────────────────┤
│ Tools: │
│ - search_papers │
│ - fetch_metadata │
│ - download_pdf │
│ - summarize_paper │
│ │
│ Resources: │
│ - cached_papers.json │
│ │
│ Prompts: │
│ - personalized_recommend│
└───────────────────────────┘
│
▼
arXiv API / 导出接口
该架构中,AI Agent 通过 MCP 客户端向服务器发起请求;MCP Server 封装了对 arXiv 各类操作的能力,并将其标准化为 Tools、Resources 和 Prompts;最终通过调用 arXiv 官方接口完成实际数据交互。
三、关键设计考量与优化建议
1. 查询语言兼容处理
arXiv 原生仅支持英文关键词检索。若用户使用中文提问,需引入翻译模型或将自然语言意图映射为英文查询语句。可通过专用翻译模型或基于 Prompt 的语义转换策略实现。
2. 结果重排序与个性化增强
基础检索结果可进一步优化:结合用户画像或研究兴趣向量(embedding),利用相似度计算进行结果重排;也可借助大模型生成个性化解说理由,提升推荐说服力。
3. PDF 内容解析方案
下载后的 PDF 需进行文本抽取。推荐采用 pdftotext、pdfminer 或 langchain 提供的 pdf-loader 组件进行 OCR 与结构化解析,确保后续摘要与分析准确可靠。
4. 缓存机制与去重策略
对已获取的论文元数据和 PDF 文件建立本地缓存(如 cached_papers.json),避免重复请求,节约 API 配额并提升响应速度。
5. 异步与批量任务支持
面对大规模检索或长文档摘要任务,应采用异步执行模式,返回任务 ID 并提供进度查询接口。但需注意 MCP 协议对 Agent 交互时延的要求,合理设计回调机制。
6. 权限控制与访问频率限制
严格遵守 arXiv 的 rate limit 规则,防止因高频请求被封禁。可在 MCP Server 层面加入请求节流与身份认证机制。
7. 可扩展性设计
未来可将摘要向量、嵌入表示(embedding)、向量数据库索引(如 FAISS、Weaviate)作为新的 Resource 暴露给多个 Agent 使用,支撑更复杂的语义搜索与推荐功能。
四、核心工具定义与实现示例
4.1 MCP Server 部署方式
可通过 Python 包管理工具安装官方提供的 arxiv-mcp-server 库,快速搭建本地服务环境。
4.2 论文搜索功能:search_papers
该功能基于 arXiv 官方 API 实现论文检索。以下代码示例中,设定关键词为 “position emmbedding in attention”,限定返回最新的三项成果。通过 arxiv.Client 初始化客户端,并配置按提交日期倒序排列结果。
需要注意的是,当前接口不支持直接使用中文关键词查询,否则可能无法返回有效结果。
import arxiv
query = "position embedding in attention"
max_results = 3
client = arvix.Client()
search = arxiv.Search(
query = query,
max_results = max_results,
sort_by = arxiv.SortCriterion.SubmittedDate,)
results = []
for paper in client.results(search):
print(paper)
results.append(paper)
print("-------------------------")
if len(results) >= max_results:
break
responese_data = {"total_results":len(results),"paper":results}
print(response_data)
4.3 辅助工具函数的大模型集成设置
为进一步提升工具智能化水平,可引入大模型对输入查询进行预处理,例如自动补全术语、纠正拼写错误、扩展同义词等。此类辅助函数可通过 MCP 的 Tool 接口注册,供多个 Agent 调用。
通过4.2节的实践可以发现,在使用arxiv MCP服务进行工具函数调用时,若查询语言为英文,系统能够有效完成检索并返回指定数量的结果;然而当输入为中文时,则通常返回空值。为解决该问题,可引入QWen3在线模型作为翻译中间件,利用Prompt工程实现中英文内容的自动转译,从而提升对中文查询的支持能力。
4.4 科研论文个性化查询功能的设计
为了将上述逻辑封装成可复用的服务模块,可采用FASTAPI构建RESTful接口。该方式便于对外暴露HTTP API,也可作为MCP Server内部的功能组件。例如,定义一个POST请求端点,接收客户端提交的查询参数,触发后端模型或方法执行处理,并返回标准化的结构化响应。
以下是一个简洁高效的FastAPI应用示例:
# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from search_papers import search_papers
from translate_query import translate_to_english
from summarize_paper import summarize_paper
import asyncio
app = FastAPI()
class QueryRequest(BaseModel):
query: str
max_results: int = 5
user_id: str | None = None
language: str = "auto" # 'en' or 'zh' or 'auto'
@app.post("/api/search")
async def api_search(req: QueryRequest):
q = req.query
if req.language == "zh" or (req.language == "auto" and contains_chinese(q)):
q = translate_to_english(q)
try:
res = search_papers(q, max_results=req.max_results)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# 为每篇生成短摘要(并行)
async def summarize_item(p):
return {**p, "summary_short": summarize_paper(p["summary"])}
tasks = [asyncio.to_thread(summarize_item, p) for p in res["papers"]]
summaries = await asyncio.gather(*tasks)
return {"total": res["total_results"], "papers": summaries}
关键说明与优化建议:
contains_chinese()
- 添加辅助函数用于检测文本是否包含中文字符,以判断是否需要启动翻译流程。
- 在获取论文摘要时,采用线程池或异步机制,防止阻塞主事件循环,提高并发性能。
- 在生产环境中,应集成缓存(如Redis)以减少重复请求开销,同时增加限流、身份认证、错误重试机制及完整日志记录,保障系统稳定性与安全性。
4.5 基于FLOW流程的科研论文检索架构
整个查询流程遵循清晰的阶段划分,确保从用户请求到结果输出的高效流转:
- 请求接收(Client):用户发起查询请求,携带 query 内容以及个性化偏好信息,如研究领域、目标年份范围、指定作者或关键词等。
- 预处理阶段:首先识别查询语句的语言类型;若为中文则通过翻译模型转换为英文;随后进行语义扩展,例如引入同义词库增强检索覆盖面。
- 检索执行:调用核心检索接口,获取初步候选集(N条相关论文记录)。
search_papers
- 后处理操作:对候选结果进行去重处理,并依据发布日期或相关性进行初筛;同时启动并发任务生成摘要内容。
summarize_paper
- 个性化重排序:结合用户的profile(如embedding向量)或预设规则,对结果进行重新排序,提升匹配精度;同时生成“personalized_recommend”推荐描述文本。
- 结果打包与输出:将最终结果封装后返回给前端或智能Agent。如有需要,可附带PDF文件路径作为资源链接,供后续下载或阅读使用。
- 异步任务支持(可选):针对需全文解析、生成长摘要或撰写笔记等耗时操作,可开启后台异步任务,完成后通过回调机制或消息推送通知用户。