面向计算机科学领域的学术论文检索与相关工作生成系统。后端基于 Python + FastAPI,通过 LangGraph 编排多智能体协作完成论文检索、摘要与深度分析;同时暴露 MCP 服务,支持 Claude Code、Gemini CLI 等工具通过标准化命令直接调用。
系统提供两种使用入口,共享同一套后端智能体服务。
用户输入
└─→ Coordinator(意图识别 & 任务分发)
├─→ PaperRetriever(论文检索:ES BM25 + 向量混合)
├─→ Summarizer(结构化摘要生成)
└─→ Analyzer(深度分析:相关工作 / 调研报告)
└─→ Coordinator(聚合各智能体结果)
└─→ 用户(SSE 流式输出)
1. 用户输入: /search_semantic_articles <query>
2. cli 调用 start_search,根据 ES 分布分析返回消歧问题(会议方向 / 时间段 / CCF 评级)
3. 用户选择后,cli 携带 answers 调用 execute_search 完成检索,格式化输出论文列表
4. 多轮追问:用户继续输入 "基于这些文章写一篇相关工作"
5. cli 调用 write_related_work,按 venue 分组输出结构化引用列表,LLM 据此撰写段落
文件:backend/app/agents/coordinator.py
- 解析用户意图,判断本次请求属于「检索」「摘要」「深度分析」或「混合」任务
- 通过 LangGraph
StateGraph将任务分发到对应的专职智能体 - 收集各智能体输出,合并成最终回复后返回给用户
- 负责多轮对话上下文管理
文件:backend/app/agents/retriever.py
- 向量相似度检索(Elasticsearch 8.x kNN,BAAI/bge-large-en-v1.5 Embedding)
- BM25 关键词检索(Elasticsearch,定制
paper_bm25相似度参数 k1=1.2 / b=0.5) - 结果融合排序(Reciprocal Rank Fusion)
- 按需调用 Semantic Scholar / arXiv 在线 API 补充外部论文
文件:backend/app/agents/summarizer.py
- 单篇论文摘要提炼(标题、方法、贡献、局限)
- 多篇论文综合摘要(主题归纳、研究趋势)
- 关键发现与技术细节提取
文件:backend/app/agents/analyzer.py
- 相关工作段落生成(支持 academic / survey / brief 三种风格)
MCP 服务以 Streamable HTTP transport 内嵌于 FastAPI,随后端服务一同启动,无需单独运行。
后端启动后,MCP 端点即可访问:http://localhost:8000/mcp/
实现说明:
mcp_server.py中通过FastMCP.streamable_http_app()生成 ASGI 子应用, 并在main.pylifespan 中显式调用mcp.session_manager.run()初始化 task group, 最终以app.mount("/mcp", mcp_app)挂载。
| 工具 | 说明 |
|---|---|
start_search(query) |
初始化检索会话,基于 ES aggregation 分析论文分布,返回消歧问题(会议方向 / 时间段 / CCF 评级)与 session_id |
execute_search(session_id, answers, search_mode, size, page) |
根据用户对消歧问题的选择执行检索,结果追加到会话工作区;支持翻页;search_mode 可选 bm25 / phrase / fuzzy |
list_session_papers(session_id) |
查看当前会话工作区中已收集的全部论文 |
write_related_work(session_id, topic, dblp_keys, style) |
将工作区论文按 venue 分组,输出结构化引用列表供 LLM 撰写相关工作段落 |
- 每次
start_search生成唯一session_id(12位 hex),后续工具调用均需携带 - 会话状态存储于进程内存,TTL 为 1 小时(生产环境迁移 Redis)
- 同一会话内
execute_search可多次调用(翻页 / 追加检索),结果自动去重
通过 MCPAuthMiddleware 保护 HTTP MCP 入口(mcp_auth.py):
Authorization: Bearer <api-key>请求头认证- 按 UTC 自然日统计每个 key 的调用配额
- 配额后端支持
memory(开发)/redis(生产),Redis 不可用时自动降级
| 组件 | 技术 |
|---|---|
| Web 框架 | FastAPI |
| 多智能体编排 | LangGraph |
| LLM 调用 | LangChain + LiteLLM |
| 关键词检索 | Elasticsearch 8.x(BM25) |
| 向量检索 | Elasticsearch 8.x(kNN,dense_vector) |
| 关系数据库 | PostgreSQL + SQLAlchemy (async) |
| 缓存 / 配额 | Redis |
| Embedding | BAAI/bge-large-en-v1.5 |
| 文档解析 | PyMuPDF + Unstructured |
| MCP 服务 | FastMCP (Streamable HTTP,内嵌 FastAPI /mcp/) |
| 可观测性 | LangFuse |
| 组件 | 技术 |
|---|---|
| 框架 | Next.js 15 (App Router) + TypeScript |
| UI 系统 | Tailwind CSS + Shadcn UI + Lucide React |
| 异步状态 | TanStack Query (React Query v5) |
| Agent 可视化 | React Flow (@xyflow/react v12) |
| BFF 层 | Next.js API Routes → FastAPI |
| 测试 | Vitest (单元) + Playwright (E2E) |
DaseS/
├── backend/ # 后端服务 (Python + FastAPI)
│ ├── app/
│ │ ├── agents/ # LangGraph 智能体定义
│ │ │ ├── coordinator.py # 协调器:意图识别 & 任务分发
│ │ │ ├── retriever.py # 论文检索(向量 + BM25 融合)
│ │ │ ├── summarizer.py # 摘要生成(单篇 / 多篇)
│ │ │ └── analyzer.py # 深度分析(对比 / 趋势 / 引用图谱)
│ │ ├── api/ # FastAPI 路由层
│ │ │ ├── chat.py # SSE 流式对话接口
│ │ │ ├── search.py # 论文检索接口
│ │ │ ├── agents.py # 智能体管理接口
│ │ │ ├── prompts.py # Prompt 版本化管理接口
│ │ │ └── traces.py # Agent Trace 可观测性接口
│ │ ├── services/
│ │ │ ├── es_service.py # Elasticsearch 检索 & 消歧服务
│ │ │ └── prompt_service.py # Prompt 版本管理服务
│ │ ├── rag/ # RAG 管线
│ │ │ ├── parser.py # PDF 论文解析
│ │ │ ├── chunker.py # 语义分块(按章节/段落)
│ │ │ └── retriever.py # 混合检索(向量 + BM25 + RRF)
│ │ ├── core/
│ │ │ ├── config.py # pydantic-settings 配置
│ │ │ └── deps.py # 依赖注入
│ │ ├── models/schemas.py # Paper / PromptTemplate / PromptVersion
│ │ ├── mcp_server.py # MCP 工具定义(Streamable HTTP,挂载于 /mcp)
│ │ ├── mcp_auth.py # MCP API Key 认证 & 配额管理
│ │ └── main.py # FastAPI 应用入口
│ ├── .env.example
│ ├── pyproject.toml
│ └── Dockerfile
├── frontend/ # 前端 (Next.js 15)
│ └── src/
│ ├── app/(main)/
│ │ ├── chat/ # AI 对话页(SSE 流式)
│ │ ├── trace/ # Agent Trace 可视化
│ │ └── prompts/ # Prompt 版本管理
│ ├── components/ # UI 组件
│ ├── hooks/ # use-chat / use-trace / use-prompts
│ └── lib/ # api-client / utils
├── data/
│ ├── raw/ # 原始论文数据
│ ├── processed/ # Neo4j / ES 导入数据
│ └── scripts/ # 数据采集与处理脚本
└── docker-compose.yml
- Docker & Docker Compose
- Python 3.11+,uv 包管理器
- Node.js 20+
docker compose up -d postgres redis langfuseElasticsearch 需单独部署(或使用已有实例),在 .env 中配置 ES_HOST。
cd backend
cp .env.example .env # 填入 LLM_API_KEY、ES_HOST 等实际值
uv sync --extra dev # 安装全部依赖(含开发依赖)
.venv/bin/python -m uvicorn app.main:app --reload
# API 文档:http://localhost:8000/docs
# MCP 端点:http://localhost:8000/mcp/
uv run需要 uv 在$PATH中。若系统未安装 uv,直接使用.venv/bin/python运行。
cd frontend
npm install
npm run dev
# 访问:http://localhost:3000MCP 服务随后端 FastAPI 自动启动,无需额外操作。使用以下命令将 MCP 接入 CLI 工具。
Claude Code 的 MCP 配置通过 claude mcp 命令管理,实际写入 ~/.claude.json。
# ── 添加 ──────────────────────────────────────────────
# 本地 HTTP(需 uvicorn 运行在 :8000)
claude mcp add --transport http --scope local dases http://localhost:8000/mcp/
# 远程 HTTP(替换为实际服务器 IP)
claude mcp add --transport http --scope local dases-remote http://<SERVER_IP>:8000/mcp/
# 本地 stdio(不依赖 uvicorn,直接启动进程)
claude mcp add --transport stdio --scope local dases-local -- \
bash -c "cd /path/to/DaseS/backend && exec uv run python -m app.mcp_server"
# ── 查看 ──────────────────────────────────────────────
claude mcp list # 列出所有已配置的 MCP 服务及连接状态
claude mcp get <name> # 查看某个服务的详细配置
# ── 删除 ──────────────────────────────────────────────
claude mcp remove <name> # 删除 local scope 的服务
claude mcp remove --scope user <name> # 删除 user scope 的服务
claude mcp remove --scope project <name> # 删除 project scope 的服务scope 说明
--scope local(默认):写入~/.claude.json,仅当前项目可见,不提交 git--scope project:写入.claude/settings.json,团队共享,可提交 git--scope user:写入~/.claude.json全局段,所有项目可见注意:手动编辑
.claude/settings.local.json对 MCP 配置无效,仅permissions等字段从该文件读取。
配置完成后,在 Claude Code 中即可使用:
/search_semantic_articles graph neural network
在项目根目录的 .gemini/settings.json 中配置:
{
"mcpServers": {
"dases": {
"httpUrl": "http://localhost:8000/mcp/"
}
}
}uv sync # 按 uv.lock 同步依赖
uv add <pkg> # 添加新依赖并更新锁文件
uv run <cmd> # 在项目虚拟环境中运行命令
uv lock --upgrade # 升级所有依赖到最新版本| 来源 | 用途 |
|---|---|
| DBLP | 论文元数据(标题 / 作者 / 会议 / 年份) |
| Semantic Scholar API | 论文摘要补全 |
| arXiv API / Bulk | CS 预印本全文 |
| OpenAlex | 开放学术图谱(引用关系) |
| CCF 目录 PDF | 会议 / 期刊 CCF 评级 |
| 服务 | 端口 | 说明 |
|---|---|---|
| 后端 API | 8000 | FastAPI,/docs 查看接口文档 |
| 前端 | 3000 | Next.js dev server |
| PostgreSQL | 5432 | 关系数据库(Prompt 版本 / 用户数据) |
| Redis | 6379 | 缓存 & MCP 配额 |
| Elasticsearch | 9200 | BM25 关键词检索 & kNN 向量检索 & 消歧 aggregation |
| LangFuse | 3001 | Agent Trace 可观测性平台 |