Agent设计模式与工程化

智能论文研究助手:开发文档规划路线图

阶段 核心主题 涵盖内容
Phase 1 项目全局图谱 (Blueprinting) 系统使命、核心架构图、技术栈选型理由、LangGraph 状态机逻辑。
Phase 2 工程目录结构与核心模块 目录树详解、src/core 基础类设计、数据 Schema 定义。
Phase 3 MCP 协议与特种兵服务 跨进程调用逻辑、自定义 MCP Server(Parser, Vision, Arxiv)的实现细节。
Phase 4 双层记忆层:RAG 与图谱 向量库 (ChromaDB) 检索策略、知识图谱 (Neo4j) 演化逻辑、GraphRAG 搜索。
Phase 5 交互界面、部署与运维优化 Streamlit 仪表盘设计、自动化任务调度、成本与 Token 优化策略。

第一阶段:项目全局图谱 (Phase 1: Project Overview & Architecture)

完成最关键的第一部分:定义系统的边界与核心逻辑。

1.1 系统使命 (System Mission)

Smart Scholar Agent 旨在解决学术研究中的"信息过载"与"知识碎片化"问题。它不仅仅是一个阅读器,而是一个端到端的知识生产引擎,能自动将 PDF 转化为结构化知识、视觉洞察、对比表格以及动态演化的知识图谱。

1.2 核心架构设计

系统采用"中心化大脑 + 分布式特种兵"的设计理念。

  • 大脑 (The Brain) :基于 LangGraph,利用状态机(State Machine)控制论文处理的每一个生命周期。
  • 通信协议 (The Nerve) :采用 MCP (Model Context Protocol),实现跨语言、跨进程的工具调用(如 Python 调用的专用解析服务)。
  • 记忆 (The Memory) :结合 RAG (向量检索) 与 Knowledge Graph (知识图谱),实现局部细节与全局脉络的统一。

1.3 核心技术栈 (The Tech Stack)

维度 技术选型 理由
工作流框架 LangGraph 支持有状态的多轮迭代,处理循环任务(如递归纠错)极佳。
通信协议 Model Context Protocol (MCP) 标准化 LLM 与外部服务的连接,实现真正意义上的"插件化"。
文档解析 Docling (IBM) 高精度 PDF 布局分析,完美处理表格、公式和多栏布局。
视觉理解 GPT-4o Vision / Qwen-VL 解读论文中的实验曲线图、架构流程图。
数据库 ChromaDB (Vector) + Neo4j (Graph) 实现 GraphRAG 检索,既能找细节,也能看趋势。
用户界面 Streamlit 快速原型开发,原生支持异步 Python 流程展示。

1.4 状态机逻辑流 (The LangGraph Logic)

这是未来维护时最需要记忆的"执行蓝图":

  1. START ➔ parser_node: 触发 MCP 服务,将 PDF 物理转化为 Raw Markdown。
  2. parser_node ➔ vision_node: 提取图片 ID,发送给视觉 MCP 进行深度解读。
  3. vision_node ➔ cleaner_node: 图文融合阶段,LLM 将视觉报告嵌入 Markdown。
  4. cleaner_node ➔ analyzer_node: 深度思考阶段,生成单篇论文的深度剖析和思维导图。
  5. analyzer_node ➔ graph_extractor_node: 知识沉淀阶段,提取三元组并写入图数据库。
  6. graph_extractor_node ➔ comparer_node: 集群对比阶段,从 RAG 检索相似论文生成对比表。
  7. comparer_node ➔ generator_node: 产出阶段,生成 PPT 和可视化资产。
  8. END

要用 MCP 而不是简单的函数调用(为了解耦服务);要有 cleaner 节点(为了图文对齐)。

第二阶段:工程目录结构与核心模块

2.1 项目目录骨架 (Project Structure)

采用高度解耦的模块化设计,确保每个"特种兵"服务和"大脑"逻辑互不干扰。

Plaintext 复制代码
smart-scholar-agent/
├── data/                   # 本地存储
│   ├── uploads/            # 待处理的原始 PDF
│   ├── cache/              # 临时解析产物与图片
│   └── db/                 # ChromaDB 与 Neo4j 本地数据文件
├── src/                    # 核心代码
│   ├── agents/             # LangGraph 核心逻辑
│   │   ├── nodes/          # 所有的状态机节点(parser, vision, cleaner, etc.)
│   │   ├── prompts/        # 结构化的 Prompt 模板库
│   │   ├── state.py        # 核心状态定义 AgentState
│   │   └── graph.py        # 状态机编排与入口
│   ├── mcp_servers/        # 自定义 MCP 服务集群 (独立进程)
│   │   ├── doc_parser/     # 基于 Docling 的解析服务
│   │   ├── vision_service/ # 视觉理解服务
│   │   └── arxiv_monitor/  # Arxiv 追踪服务
│   ├── core/               # 底层基础设施
│   │   ├── mcp_client.py   # 通用 MCP 客户端管理类
│   │   └── llm_factory.py  # LLM 实例化工厂
│   ├── schema/             # Pydantic 数据契约 (Data Contracts)
│   │   ├── paper.py        # 论文结构化模型
│   │   └── analysis.py     # 深度分析结果模型
│   ├── tools/              # 产物生成工具 (PPT, Mermaid, etc.)
│   └── ui/                 # Streamlit 仪表盘界面
├── output/                 # 生成的 PPT、思维导图等最终产物
├── .env                    # 环境变量 (API Keys, DB Config)
├── requirements.txt        # 依赖清单
└── main.py                 # CLI 启动入口

2.2 顶层接口与核心协议 (State & Interfaces)

系统的核心纽带是 AgentState,它决定了信息如何在节点间流转。

核心状态定义 (src/agents/state.py)
Python 复制代码
from typing import TypedDict, List, Dict, Any

class AgentState(TypedDict):
    # 输入信息
    pdf_path: str                   # 待处理文件路径/URL
    
    # 中间产物
    raw_markdown: str               # Parser 提取的原始文本
    vision_analysis_results: List[Dict[str, Any]] # 视觉节点分析结果
    
    # 结构化结果
    structured_content: Dict[str, Any] # Cleaner 整合后的数据 (符合 PaperStructuredData)
    analysis: Dict[str, Any]           # Analyzer 生成的深度剖析
    comparison_data: Dict[str, Any]    # Comparer 生成的横向对比
    
    # 最终产物
    artifacts: Dict[str, str]       # PPT 路径、Mermaid 代码等
    
    # 运行状态
    messages: List[str]             # 日志与状态消息
    current_step: str               # 当前执行阶段

2.3 模块功能映射表 (Feature-to-Method Mapping)

为了方便快速定位功能,我们将主要功能与具体方法进行映射:

主要功能 对应模块/节点 核心方法 底层逻辑
PDF 物理解析 nodes/parser.py paper_parser_node 调用 MCP Server 的 parse_pdf 工具
视觉图表提取 nodes/vision_processor.py vision_processor_node 异步并发调用 Vision MCP 分析图片
图文数据融合 nodes/cleaner.py paper_cleaner_node 利用 LLM 按照 Schema 聚合文本与视觉分析
多维度演化分析 nodes/analyzer.py research_analyzer_node 运行 CoT 提示词生成深度剖析与 Mermaid
多论文横向对比 nodes/comparer.py comparison_node 基于 ChromaDB 检索并生成 ComparisonTable
知识图谱沉淀 nodes/graph_extractor.py graph_extractor_node 提取三元组并写入 Neo4j 数据库

2.4 快速启动准备 (Deployment & Requirements)

要让这个项目"跑起来",需要满足以下配置要求:

1. 算力与环境推荐
  • 内存 :建议 16GB+ (Docling 解析大型 PDF 较吃内存)。
  • 算力:可以不用本地 GPU (除非部署本地大模型),主要依赖 API 响应速度。
  • 环境:Python 3.10+ (LangGraph 最佳兼容环境)。
2. 外部服务注册
  • LLM API:OpenAI (GPT-4o/4o-mini) 或 Anthropic (Claude 3.5 Sonnet)。
  • 存储 :ChromaDB :默认本地存储(无需注册)。Neo4j :推荐本地安装 Neo4j Desktop,或者使用 Neo4j Aura 云版。
3. 核心依赖清单 (requirements.txt)
Plaintext 复制代码
# 核心框架
langgraph>=0.0.10
langchain-openai
langchain-anthropic
pydantic>=2.0.0

# 通信与 MCP
mcp>=0.1.0
httpx

# 解析与视觉
docling
python-pptx
pillow

# 存储与检索
chromadb
neo4j

# UI 界面
streamlit
streamlit-agraph
pyvis

2.5 快速启动步骤

  1. 克隆项目并安装依赖:

    Bash 复制代码
    pip install -r requirements.txt
  2. 配置 .env 文件:

    Bash 复制代码
    OPENAI_API_KEY=sk-xxxx
    NEO4J_URI=bolt://localhost:7687
    NEO4J_PASSWORD= password
  3. 启动 MCP 服务:(在生产环境由 Client 自动启动,测试环境可手动运行服务脚本确认存活)。

  4. 运行 UI 界面:

    Bash 复制代码
    streamlit run src/ui/dashboard.py

涵盖了"怎么看"、"在哪看"和"怎么跑"。它让开发者明白:

  • 如果要修改 解析逻辑 ,去 src/mcp_servers/doc_parser。
  • 如果要修改 状态流转 ,去 src/agents/graph.py。
  • 如果要修改 前端展示 ,去 src/ui/dashboard.py。

MCP 不仅仅是一个插件协议,它是屏蔽底层工具复杂性、为大脑(LLM)提供标准感官 的核心层。通过 MCP,将解析、视觉、搜索等重量级任务从逻辑主进程中剥离,实现了真正的分布式协同。

第三阶段:MCP 协议与特种兵服务

3.1 MCP 接口底层:JSON-RPC 2.0 与通信协议

MCP 基于 JSON-RPC 2.0 规范。虽然在开发中使用的是 SDK 封装,但理解其底层数据包结构对于调试至关重要。

1. 通信模式

目前采用 Stdio (标准输入输出) 模式。主进程(Client)通过 stdin 向子进程(Server)发送请求,并从其 stdout 获取响应。

2. 标准 JSON-RPC 交互示例

当大脑想要调用工具时,底层发送的消息如下:

JSON 复制代码
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "parse_pdf",
    "arguments": { "file_path": "/path/to/paper.pdf" }
  }
}

3.2 Parser 服务深度剖析:从 Docling 到结构化输出

doc_parser 是系统的数据入口。它不仅是将 PDF 转为文字,而是要保留"文档结构语义"。

1. 输入输出定义
  • 输入 (Input Schema) :
    • file_path (string, required): PDF 的绝对路径。
    • ocr_enabled (bool, default=True): 是否开启光学字符识别(针对扫描件)。
    • table_extraction (bool, default=True): 是否进行复杂的表格恢复。
  • 输出 (Output) :
    • content: 经过清理的 Markdown 文本,包含图片占位符。
    • metadata: 包含页数、标题提取、表格坐标等。
2. 底层逻辑实现:Docling 转换器

Docling 会生成一个复杂的文档树,通过自定义 ExportFormat 将其标准化:

Python 复制代码
# src/mcp_servers/doc_parser/logic.py
from docling.datamodel.base_models import InputFormat
from docling.document_converter import DocumentConverter

def process_docling(file_path, ocr=True):
    converter = DocumentConverter(
        # 超参数设置:
        # - pipeline_options: 调整模型权重
        # - ocr_options: 指定语言(如 'ch_sim', 'en')
    )
    result = converter.convert(file_path)
    
    # 核心转换:提取 Markdown 的同时,记录图片锚点
    markdown = result.document.export_to_markdown()
    
    # 提取图片并保存到 cache/images 目录,记录 ID 映射
    images = extract_images_to_cache(result) 
    
    return markdown, images
  • num_threads : 设置解析线程数。建议设置为 CPU 核心数的 1 / 2 1/2 1/2。
  • density: 图像渲染密度。如果论文图片公式多,建议调高 DPI(如 300 DPI)。

3.3 稳定性保障:超时、重试与异常处理

PDF 解析(尤其是 50 页以上的论文)是非常耗时的任务。我们需要在 MCPClientManager 中实现健壮的保护机制。

1. 超时控制 (Timeout)

利用 asyncio.wait_for 为每一个工具调用设置分级超时:

  • 轻量任务 (如 Arxiv 列表): 10s
  • 重量任务 (如 PDF 解析、视觉理解): 180s - 300s
2. 指数退避重试 (Exponential Backoff)

使用 tenacity 库对 MCP 连接失败或 OOM(内存溢出)导致的崩溃进行重试:

Python 复制代码
from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
async def safe_mcp_call(client, tool_name, args):
    try:
        return await client.call_tool(tool_name, args)
    except Exception as e:
        # 记录日志,触发重试
        raise e

3.4 实战:如何自定义一个"联网查找" MCP 服务

如果需要增加一个功能:"根据当前论文题目,去 Google Scholar 或 Tavily 查找其引用量和相关讨论"。

1. 定义 Service (src/mcp_servers/web_search/)

需要集成一个搜索 API(如 Tavily 或 DuckDuckGo)。

Python 复制代码
@server.list_tools()
async def handle_list_tools():
    return [
        types.Tool(
            name="search_academic_impact",
            description="在互联网上搜索论文的影响力、引用及社区讨论。",
            inputSchema={
                "type": "object",
                "properties": {
                    "query": {"type": "string"},
                },
                "required": ["query"]
            }
        )
    ]

@server.call_tool()
async def handle_call_tool(name, arguments):
    # 实现 Tavily API 调用逻辑
    # 返回搜寻到的网页摘要和 URL
    results = await web_search_api(arguments["query"])
    return [types.TextContent(type="text", text=str(results))]
2. 在大脑中注册与调用

在 src/agents/graph.py 中增加一个节点 search_node,并配置相应的 StdioServerParameters 指向新 Python 脚本。


3.5 Phase 3 核心总结表

特性 实现细节
通信协议 JSON-RPC 2.0 over Stdio
Parser 输入 file_path, ocr_enabled, table_format
Parser 输出 标准 Markdown + 图片 Metadata 映射
超时策略 异步 IO 监控,核心任务 3 分钟超时阈值
扩展性 遵循 list_tools 和 call_tool 接口即可无缝热插拔

不要指望外部工具永远立刻返回结果,必须要有超时和重试机制;同时,它定义了如何优雅地给智能体安装"新假肢"(自定义 MCP)。

第四阶段:双层记忆层:RAG 与图谱

在传统的 RAG 系统中,往往只把文本切块存入向量库,这导致了"只见树木,不见森林"的缺陷。 Smart Scholar Agent 采用**"向量+图谱"**的双螺旋记忆架构:

  • 向量记忆 (Vector Memory) :负责微观层面的模糊匹配(查找具体的方法描述、实验数据)。
  • 图谱记忆 (Graph Memory) :负责宏观层面的逻辑关联(梳理技术演化脉络、引用关系、学术派系)。

4.1 向量记忆层:高精度的结构化 RAG

要解决的核心问题是**"上下文污染"(Context Pollution)。如果直接将 PDF 全文切块,参考文献、页眉页脚、致谢等噪声会严重干扰检索精度**。

1. 索引策略 (Indexing Strategy)

利用 Phase 2 中生成的 PaperStructuredData 进行语义分块索引,而不是机械的 Token 切分。

  • 技术选型:ChromaDB (本地持久化)
  • 数据清洗规则 :
    • 剔除:参考文献列表 (References)、附录 (Appendix) 中的非核心代码、致谢。
    • 保留并加权:摘要 (Abstract)、方法 (Methodology)、实验结论 (Conclusion)。
  • 元数据增强 (Metadata Injection): 不仅存储文本,必须将结构化字段作为 Metadata 存入,以便后续进行 SQL 级别的精确过滤。
2. 代码实现规范 (src/rag/indexer.py)
Python 复制代码
def prepare_chunks(paper: PaperStructuredData):
    chunks = []
    
    # 策略:以"章节"为单位进行 Chunking,并附带上下文
    for section in paper.sections:
        # 跳过低价值章节
        if section.title.lower() in ["references", "acknowledgments", "bib"]:
            continue
            
        # 构造富含语义的文本块:[标题] + 内容
        text_content = f"Paper: {paper.title}\nSection: {section.title}\nContent: {section.content}"
        
        chunks.append({
            "id": f"{paper.title}_{section.title}_hash",
            "text": text_content,
            "metadata": {
                "paper_title": paper.title,
                "year": paper.year,
                "authors": ",".join(paper.authors),
                "category": "methodology" if "method" in section.title.lower() else "general"
            }
        })
    return chunks

4.2 图谱记忆层:动态演化的学术知识图谱

KG (Knowledge Graph) 是智能体产生"洞察力"的源泉。它不是静态的,而是随着每次新论文的研读而动态生长。

1. 图谱本体设计 (Ontology Schema)

在 Neo4j 中,严格定义节点 (Node) 和关系 (Relation) 的类型,确保图谱的整洁。

  • 节点 (Nodes) :
    • (P:Paper): 论文实体 (属性: Title, Year, Abstract_Embedding)
    • (C:Concept): 技术概念 (如: "Transformer", "LoRA")
    • (A:Author): 研究者
    • (M:Metric): 评估指标 (如: "Accuracy", "F1-Score")
  • 关系 (Relationships) :
    • (:Paper)-[:PROPOSES]->(:Concept): 提出某技术
    • (:Paper)-[:IMPROVES]->(:Paper): 改进了某论文 (演化关键!)
    • (:Paper)-[:EVALUATED_ON]->(:Metric): 在某指标上进行了评估
    • (:Author)-[:WROTE]->(:Paper): 著作关系
2. 自动化入库逻辑 (src/database/graph_writer.py)

使用 Cypher 语句的 MERGE 关键字,确保幂等性(重复运行不会产生重复节点)。

Python 复制代码
# Cypher 模板:写入演化关系
CYPHER_EVOLUTION = """
MERGE (p1:Paper {title: $current_paper})
MERGE (p2:Paper {title: $baseline_paper})
MERGE (p1)-[r:IMPROVES {
    reason: $reason, 
    magnitude: $improvement_value
}]->(p2)
"""

# Cypher 模板:写入技术概念
CYPHER_CONCEPT = """
MERGE (p:Paper {title: $title})
MERGE (c:Concept {name: $concept_name})
MERGE (p)-[:USES]->(c)
"""

4.3 GraphRAG 融合引擎:双路召回机制

这是"全局搜索"功能的底层实现。将向量搜索结果与图谱遍历结果结合,送给 LLM 进行综合推理。

1. 检索流程 (Retrieval Workflow)

当用户提问:"LoRA 技术在过去一年有哪些变体?"

  1. 路径 A (Vector): 在 ChromaDB 中检索关键词 "LoRA" 相关的段落,找到具体描述 LoRA 变体的文本块。

  2. 路径 B (Graph): 在 Neo4j 中执行图遍历:

    Cypher 复制代码
    MATCH (c:Concept {name: 'LoRA'})<-[:USES]-(p:Paper)
    WHERE p.year >= 2024
    RETURN p.title, p.summary
  3. 重排序与合成 (Rerank & Synthesis): 将 A 和 B 的结果拼接,Prompt 提示 LLM:"请结合具体的论文细节 (来自 A) 和宏观的论文列表 (来自 B) 回答问题。"

2. 避免幻觉的"锚点机制"

在生成回答时,强制要求 LLM 标注来源。如果信息来自图谱,标注 [KG: 关系]; 如果来自向量库,标注 [Doc: 论文名].


4.4 Phase 4 开发自检清单

为了确保这部分"内功"修炼到位,开发时请重点检查:

  • 去重机制:同一篇论文如果重新上传,ChromaDB 和 Neo4j 是否会覆盖旧数据而不是新增副本?(需在入库前检查 Paper Title 或 Hash)。
  • 脏数据清洗:LLM 提取的三元组可能包含噪声(如将 "We" 识别为作者),需要在写入 Neo4j 前增加一层规则过滤器。
  • 连接池管理:Neo4j 和 ChromaDB 的客户端连接对象建议设为全局单例 (Singleton),避免频繁握手带来的开销。

第五阶段:交互界面、部署与运维优化

5.1 交互界面层:Streamlit 仪表盘架构

UI 不仅仅是一个网页,它是一个实时响应的战术指挥中心 (Tactical Command Center)。

1. 界面状态管理 (Session State Strategy)

Streamlit 的机制是"每次交互重跑整个脚本",这对于长耗时的论文分析是致命的 。必须利用 st.session_state 建立持久化缓存。

  • 核心状态变量 :
    • processing_status: 监控 LangGraph 当前运行到哪个节点。
    • current_paper_data: 存储当前正在分析的论文结构化数据。
    • chat_history: 用于 GraphRAG 全局对话的记录。
    • kg_html: 缓存生成的 Pyvis 图谱 HTML,避免每次刷新页面重绘。
2. 异步流适配 (Async Adapter)

Streamlit 原生是同步的,而我们的后端(LangGraph, MCP)是全异步的。

关键实现模式 (src/ui/utils.py):

Python 复制代码
import asyncio
import streamlit as st

def run_async_task(async_func, *args):
    """在 Streamlit 中安全运行异步任务的通用包装器"""
    try:
        loop = asyncio.get_event_loop()
    except RuntimeError:
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
    
    return loop.run_until_complete(async_func(*args))
3. 页面布局设计
  • Sidebar: 控制区。PDF 上传组件、Arxiv 自动追踪开关、API Key 配置。
  • Main Area (Tabs) :
    • Tab 1: Deep Dive: Markdown 渲染器(展示图文融合结果) + Mermaid 组件(展示单篇思维导图)。
    • Tab 2: Matrix : 使用 st.dataframe 展示对比表格,支持排序和 CSV 导出。
    • Tab 3: Galaxy : 使用 st.components.v1.html 嵌入交互式知识图谱。
  • Floating Chat: 位于底部的折叠式对话框,用于全局 GraphRAG 提问。

5.2 部署架构:容器化与服务编排

为了让这个系统能"无人值守"地运行,我们不能依赖简单的 python main.py,必须上 Docker Compose。

1. 容器编排拓扑 (docker-compose.yml)

需要编排 3 个核心容器:

YAML 复制代码
version: '3.8'

services:
  # 1. 核心应用容器 (Streamlit + LangGraph + MCP Clients)
  app:
    build: .
    ports:
      - "8501:8501" # Streamlit 端口
    volumes:
      - ./data:/app/data # 挂载本地数据目录,保证数据持久化
      - ./output:/app/output
    environment:
      - NEO4J_URI=bolt://neo4j:7687
    depends_on:
      - neo4j

  # 2. 图数据库容器
  neo4j:
    image: neo4j:5.15
    ports:
      - "7474:7474" # Browser 界面
      - "7687:7687" # Bolt 协议
    environment:
      - NEO4J_AUTH=neo4j/your_password
    volumes:
      - neo4j_data:/data

  # 3. (可选) 向量数据库容器 - 如果不使用 ChromaDB 本地文件模式
  # chromadb: ...

volumes:
  neo4j_data:
2. 本地数据持久化策略
  • Vector DB : ChromaDB 默认使用 SQLite,将数据存放在 ./data/db/chroma,挂载到容器内即可,无需独立容器。
  • Cache : PDF 下载和图片解析结果存放在 ./data/cache,避免重启丢失。

5.3 自动化运维:Arxiv 守夜人

为了实现"自动增长",我们需要在后台运行一个定时任务调度器。

1. 调度实现 (src/agents/scheduler.py)

使用 APScheduler 库,它比 cron 更适合 Python 应用。

Python 复制代码
from apscheduler.schedulers.background import BackgroundScheduler
from src.agents.batch_processor import autonomous_growth_task

def start_scheduler():
    scheduler = BackgroundScheduler()
    # 每天凌晨 2 点执行自动追踪
    scheduler.add_job(
        autonomous_growth_task, 
        'cron', 
        hour=2, 
        args=[['LLM Agents', 'Knowledge Graphs']] # 关注列表
    )
    scheduler.start()

注意:在 Streamlit 中启动 Scheduler 需要小心避免重复启动(因为 Streamlit 会在每次刷新时重新加载代码)。建议将 Scheduler 放在独立进程或使用文件锁机制。


5.4 性能优化与成本控制 (Ops Optimization)

作为个人开发者,必须精打细算。

1. Token 成本优化策略
  • 分级模型路由 (Model Routing) :
    • 低成本 (GPT-4o-mini) : 用于 cleaner (文本清洗)、graph_extractor (实体提取)。
    • 高智能 (GPT-4o / Claude 3.5) : 仅用于 analyzer (深度剖析) 和 comparer (复杂推理)。
  • Hash 缓存 : 在调用 LLM 前,计算输入内容的 SHA256。如果库里已经有该 Hash 的分析结果,直接返回,0 Token 消耗。
2. 异常熔断机制

Arxiv 可能会因为请求过快封禁 IP,OpenAI 可能会超时。

  • Rate Limiter : 在 Arxiv Monitor MCP 中增加 time.sleep(3)。
  • Circuit Breaker: 如果连续 3 篇论文解析失败,自动暂停自动化任务并发送邮件/日志报警,防止无限重试烧钱。

构建一个 Smart Scholar Agent 这样复杂的系统,其文档的价值甚至不亚于代码本身。它不仅是"说明书",更是系统的逻辑拓扑图。以上是基于与AI对话交流进行碰撞整理的结果。是一次学习,也是一次尝试。


项目完结清单 (Definition of Done)

至此,开发文档规划全部完成。在正式封版前,请对照以下清单验收:

  1. 功能闭环:上传 PDF -> 解析 -> 存入图谱 -> 仪表盘可见 -> 可对话搜索。全链路通畅。
  2. 数据持久化:重启 Docker 容器后,之前的知识图谱和对比表依然存在。
  3. 异常处理:上传一个损坏的 PDF,系统应弹出错误提示,而不是直接崩溃退出。
  4. 成本可控:处理一篇标准论文(10页)的 API 成本应控制在可接受范围(如 < $0.5)。
相关推荐
QuZhengRong18 小时前
【AI】大模型推理中 KV Cache 原理解析
人工智能·大模型·agent·提示词·推理
hpoenixf1 天前
AI 说报告做好了,为什么用户还是打不开?
agent
hpoenixf1 天前
AI 说“今天”,到底是哪一天?
agent
hpoenixf1 天前
用户点了踩,Agent 就该学习吗?
agent
跨境Jacky1 天前
亚马逊选品排名监控改造记:从手抄表格到MCP自动监控
跨境电商·mcp·sorftime
岁月宁静1 天前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
DO_Community1 天前
WorkBuddy 接入自定义模型教程:接入 GPT、Claude 等大模型
人工智能·llm·agent
Deng桑1 天前
SpringAI写第一个Agent-把工单循环跑起来
java·agent·工具调用·spring ai
威哥爱编程1 天前
Python 智能体开发实战 02:你的 AI 助教说话像换了个模型?九成的 system prompt 都写错了
python·agent
威哥爱编程1 天前
Python 智能体开发实战 01:装了三遍环境还在报错?虚拟环境和 DeepSeek 一次配到位
python·agent