交叉评测_企业研报智能体 #2

Open
opened 2026-05-15 16:03:07 +08:00 by ninkch · 0 comments

交叉评测意见

评测项目: Z2wen1tao_31/S1W2-Enterprise-Research-Report-Agent — 企业研报智能体 V2.0
仓库地址: https://www.synnovator.com/Z2wen1tao_31/S1W2-Enterprise-Research-Report-Agent
评测日期: 2026-05-15

复赛阶段评测标准:Skills 需完整、有效、可运行,原型跑通核心业务闭环。


1. 项目理解

面向金融研究员和投资分析师的企业研报智能体,核心能力:PDF 解析 → RAG 检索 → 联网调研 → 多轮问答 → 自动报告 → 表格抽取 → 财务指标 → 企业评分 → 导出。React + FastAPI + SQLite + Milvus + LangChain + LangGraph。


2. Skills 完整性与可运行性评估

Skill 代码文件 状态 说明
PDF 解析 pdf_parser.py (1.4KB) 可运行 PyMuPDF 解析
文本切分 text_splitter.py (3.8KB) 可运行 LangChain 文本切分
Embedding embedding_service.py (3.5KB) 可运行 sentence-transformers + hash 降级
向量检索 vector_store.py (12.2KB) + rag_service.py (1.6KB) 可运行 Milvus + Memory 双模式
LLM 问答 llm_client.py (12.5KB) 可运行 DeepSeek API + mock 降级
LangGraph 编排 agent_graph.py (16.8KB) 可运行 validate→retrieve→web_research→generate→persist
联网调研 web_research.py (6.5KB) 可运行 DuckDuckGo 搜索 + 降级
知识库管理 knowledge_base_service.py (1.4KB) 可运行 CRUD
报告生成 report_service.py (1.7KB) + report_exporter.py (8.8KB) 可运行 Markdown + PDF 导出
表格抽取 table_extractor.py (7.7KB) 可运行 PDF 表格结构化
文本清洗 text_cleanup.py (5.6KB) 可运行 PDF 文本后处理
企业评分 score_service.py (18.5KB) 可运行 LangGraph 评分 Agent,综合三维度
SQLite 持久化 sqlite_store.py (53.9KB) 可运行 完整的数据库层
前端 React + Ant Design 可运行 知识库/文档/问答/报告工作区
总计 后端 ~170KB 13/13 Skills 可运行

测试覆盖:9 个测试文件(API、Embedding、知识库、Milvus、PDF 解析、报告、评分、文本清洗、Web 调研)


3. 核心业务闭环验证

完整闭环跑通

  • PDF 上传 → 解析 → 文本切分 → Embedding → 向量索引
  • 多轮问答 → RAG 检索 → 联网调研 → LLM 生成 → 双来源引用([1]/[W1])
  • 报告生成 → Markdown/PDF 导出
  • 企业评分 → 知识库证据 + 财务指标 + 联网搜索 → 综合评分
  • 降级链路:Milvus 不可用→Memory VS,Embedding 不可用→hash,LLM 不可用→mock

4. 优点

  • 13/13 Skills 全部可运行,是本次评测中唯一满分的项目
  • 降级设计全面:Embedding(hash)→LLM(mock)→Milvus(Memory)→Web(empty),评审零门槛
  • LangGraph 编排正确:5 节点有向图,validate_scope→retrieve_evidence→web_research→generate→persist_result
  • 双来源引用:[1][2] 标注内部文档,[W1][W2] 标注联网资料,可追溯
  • 9 个测试文件,覆盖核心模块
  • 表格抽取 + 财务指标入表:2.0 的关键升级已实现
  • 企业评分 Agent 有三维度综合:知识库证据 + 结构化财务 + 联网搜索

5. 不足与建议

5.1 SQLite 在多用户场景下的并发风险(中优先级)

问题sqlite_store.py(53.9KB)是最大的单文件,承担了几乎全部数据持久化。SQLite 的全局写锁意味着:当一个用户正在上传 PDF 触发文本切分和 Embedding 写入时,另一个用户的问答请求会被阻塞直到写入完成。在高并发场景下(如评审同时多人测试),会出现 database is locked 错误。

具体风险点

  • store_document() 方法在解析大 PDF 时持有写锁时间较长
  • add_message()save_report() 是高频写入操作,与读操作(search_documents())冲突
  • sqlite_store.py 中未见 WAL 模式配置或 busy_timeout 设置

建议

  1. 短期(立即可做):在 sqlite_store.py 的连接初始化中添加:
conn.execute("PRAGMA journal_mode=WAL")  # 读写并发
conn.execute("PRAGMA busy_timeout=30000")  # 30秒等待
conn.execute("PRAGMA synchronous=NORMAL")  # 性能平衡
  1. 中期:在 README 或 docs/ 中说明 PostgreSQL 迁移路线图,包括何时迁移、如何迁移(SQLAlchemy ORM 替代手写 SQL)
  2. 架构层面:将长耗时操作(PDF 解析 + Embedding)改为异步任务(Celery/BackgroundTasks),避免阻塞数据库写入

5.2 缺少示例数据,评审门槛高(高优先级,易修复)

问题:仓库中没有预置的示例 PDF 文件。评审要验证核心功能(PDF 解析→RAG 问答→报告生成→企业评分),必须自己寻找、上传企业年报/研报。对于不熟悉金融领域的评审,可能不知道什么样的 PDF 适合测试(需要包含财务报表、业务描述、风险提示等结构化内容)。

影响:评审可能因找不到合适的测试 PDF 而无法体验完整功能链路,特别是表格抽取和企业评分这两个核心卖点。

建议

  1. data/examples/ 目录中放入 1-2 份公开的上市公司年报节选(如从巨潮资讯网下载的、已公开披露的年报,注意脱敏)
  2. 在 README 中添加"快速体验"章节,说明如何用示例 PDF 跑通完整流程
  3. 在前端增加"加载示例"按钮,一键加载预置的示例数据
  4. 提供 1-2 张运行截图(问答界面 + 评分结果 + 报告导出)

5.3 联网调研在国内网络环境可能不稳定(中优先级)

问题web_research.py(6.5KB)依赖 duckduckgo_search(DDGS)进行联网搜索。DDGS 在中国大陆网络环境下经常不可用(被墙或限流),而本项目的目标用户是国内金融研究员。虽然代码中有降级处理(搜索失败返回空结果),但降级后企业评分的"联网搜索"维度将无数据,评分结果不完整。

影响:国内评审和用户可能经常遇到联网调研功能不可用的情况,企业评分缺少"联网搜索"维度数据。

建议

  1. 添加备用搜索源:优先 DDGS → 降级到 Bing Web Search API(需 API Key 但国内可用)→ 再降级到 Tavily Search API
  2. .env.example 中添加 SEARCH_ENGINE=duckduckgo|bing|tavily 配置项
  3. 在 UI 中显示联网调研状态(绿色=DDGS 可用 / 黄色=降级到 Bing / 红色=搜索不可用),让用户了解评分的完整性

5.4 评分权重和置信度缺乏可解释性(中优先级)

问题score_service.py(18.5KB)实现了三维度评分(知识库证据 + 结构化财务 + 联网搜索),但:

  • 三个维度的权重是硬编码的还是动态的?README 和代码中均未说明
  • 最终评分的置信度如何计算?如果知识库只有 2 页 PDF 而联网搜索不可用,评分的可信度显然低于知识库有 50 页 PDF + 联网搜索正常的情况
  • 评分结果的展示没有"数据充分性"指标,用户无法判断"这个 85 分是基于多少证据得出的"

影响:金融领域的用户对评分的可解释性要求很高。一个没有置信度说明的评分数字,在专业场景下可信度存疑。

建议

  1. 在评分结果中增加 confidence 字段,基于各维度的数据充分性计算(如:知识库文档数量、财务指标覆盖率、联网搜索结果数量)
  2. 在评分结果中显示各维度的原始分数和权重,例如:
{
  "total_score": 85,
  "confidence": 0.72,
  "dimensions": {
    "knowledge_base": {"score": 88, "weight": 0.4, "evidence_count": 23},
    "financial": {"score": 82, "weight": 0.4, "metrics_found": 15, "metrics_total": 20},
    "web_research": {"score": 80, "weight": 0.2, "sources_found": 5}
  }
}
  1. 在前端评分页面增加"评分说明"展开面板,解释各维度含义和权重

5.5 向量检索质量未验证(低优先级但影响核心体验)

问题:RAG 是本项目的核心能力,但 vector_store.py(12.2KB)和 rag_service.py(1.6KB)中没有检索质量评估逻辑。用户无法知道:

  • 检索到的文档片段是否与问题相关
  • 是否有更相关但未检索到的片段
  • 检索结果的排序是否合理

建议

  1. 在 RAG 返回结果中增加 relevance_score(余弦相似度),低于阈值(如 0.5)的片段标记为"低相关性"
  2. 在问答结果中增加"检索质量"指标(如:检索了 N 个片段,其中 M 个相关性 > 0.7)
  3. text_splitter.py 中尝试不同的切分策略(按段落 vs 固定 token 数 vs 语义切分),对比检索质量

6. 复赛阶段评价

13/13 Skills 全部可运行,核心业务闭环完整跑通,LangGraph 编排正确,双来源引用机制设计好,降级链路全面(零门槛评审),有测试。按复赛标准"Skills 需完整、有效、可运行,原型跑通核心业务闭环"。

# 交叉评测意见 **评测项目**: Z2wen1tao_31/S1W2-Enterprise-Research-Report-Agent — 企业研报智能体 V2.0 **仓库地址**: https://www.synnovator.com/Z2wen1tao_31/S1W2-Enterprise-Research-Report-Agent **评测日期**: 2026-05-15 **复赛阶段评测标准**:Skills 需完整、有效、可运行,原型跑通核心业务闭环。 --- ## 1. 项目理解 面向金融研究员和投资分析师的企业研报智能体,核心能力:PDF 解析 → RAG 检索 → 联网调研 → 多轮问答 → 自动报告 → 表格抽取 → 财务指标 → 企业评分 → 导出。React + FastAPI + SQLite + Milvus + LangChain + LangGraph。 --- ## 2. Skills 完整性与可运行性评估 | Skill | 代码文件 | 状态 | 说明 | | --- | --- | --- | --- | | PDF 解析 | `pdf_parser.py` (1.4KB) | ✅ 可运行 | PyMuPDF 解析 | | 文本切分 | `text_splitter.py` (3.8KB) | ✅ 可运行 | LangChain 文本切分 | | Embedding | `embedding_service.py` (3.5KB) | ✅ 可运行 | sentence-transformers + hash 降级 | | 向量检索 | `vector_store.py` (12.2KB) + `rag_service.py` (1.6KB) | ✅ 可运行 | Milvus + Memory 双模式 | | LLM 问答 | `llm_client.py` (12.5KB) | ✅ 可运行 | DeepSeek API + mock 降级 | | LangGraph 编排 | `agent_graph.py` (16.8KB) | ✅ 可运行 | validate→retrieve→web_research→generate→persist | | 联网调研 | `web_research.py` (6.5KB) | ✅ 可运行 | DuckDuckGo 搜索 + 降级 | | 知识库管理 | `knowledge_base_service.py` (1.4KB) | ✅ 可运行 | CRUD | | 报告生成 | `report_service.py` (1.7KB) + `report_exporter.py` (8.8KB) | ✅ 可运行 | Markdown + PDF 导出 | | 表格抽取 | `table_extractor.py` (7.7KB) | ✅ 可运行 | PDF 表格结构化 | | 文本清洗 | `text_cleanup.py` (5.6KB) | ✅ 可运行 | PDF 文本后处理 | | 企业评分 | `score_service.py` (18.5KB) | ✅ 可运行 | LangGraph 评分 Agent,综合三维度 | | SQLite 持久化 | `sqlite_store.py` (53.9KB) | ✅ 可运行 | 完整的数据库层 | | 前端 | React + Ant Design | ✅ 可运行 | 知识库/文档/问答/报告工作区 | | **总计** | **后端 ~170KB** | **13/13 Skills 可运行** | | 测试覆盖:9 个测试文件(API、Embedding、知识库、Milvus、PDF 解析、报告、评分、文本清洗、Web 调研) --- ## 3. 核心业务闭环验证 **完整闭环跑通**: - PDF 上传 → 解析 → 文本切分 → Embedding → 向量索引 ✅ - 多轮问答 → RAG 检索 → 联网调研 → LLM 生成 → 双来源引用([1]/[W1]) ✅ - 报告生成 → Markdown/PDF 导出 ✅ - 企业评分 → 知识库证据 + 财务指标 + 联网搜索 → 综合评分 ✅ - 降级链路:Milvus 不可用→Memory VS,Embedding 不可用→hash,LLM 不可用→mock ✅ --- ## 4. 优点 - **13/13 Skills 全部可运行**,是本次评测中唯一满分的项目 - **降级设计全面**:Embedding(hash)→LLM(mock)→Milvus(Memory)→Web(empty),评审零门槛 - **LangGraph 编排正确**:5 节点有向图,validate_scope→retrieve_evidence→web_research→generate→persist_result - **双来源引用**:[1][2] 标注内部文档,[W1][W2] 标注联网资料,可追溯 - **9 个测试文件**,覆盖核心模块 - **表格抽取 + 财务指标入表**:2.0 的关键升级已实现 - **企业评分 Agent 有三维度综合**:知识库证据 + 结构化财务 + 联网搜索 ## 5. 不足与建议 ### 5.1 SQLite 在多用户场景下的并发风险(中优先级) **问题**:`sqlite_store.py`(53.9KB)是最大的单文件,承担了几乎全部数据持久化。SQLite 的全局写锁意味着:当一个用户正在上传 PDF 触发文本切分和 Embedding 写入时,另一个用户的问答请求会被阻塞直到写入完成。在高并发场景下(如评审同时多人测试),会出现 `database is locked` 错误。 **具体风险点**: - `store_document()` 方法在解析大 PDF 时持有写锁时间较长 - `add_message()` 和 `save_report()` 是高频写入操作,与读操作(`search_documents()`)冲突 - `sqlite_store.py` 中未见 WAL 模式配置或 busy_timeout 设置 **建议**: 1. **短期**(立即可做):在 `sqlite_store.py` 的连接初始化中添加: ```python conn.execute("PRAGMA journal_mode=WAL") # 读写并发 conn.execute("PRAGMA busy_timeout=30000") # 30秒等待 conn.execute("PRAGMA synchronous=NORMAL") # 性能平衡 ``` 2. **中期**:在 README 或 `docs/` 中说明 PostgreSQL 迁移路线图,包括何时迁移、如何迁移(SQLAlchemy ORM 替代手写 SQL) 3. **架构层面**:将长耗时操作(PDF 解析 + Embedding)改为异步任务(Celery/BackgroundTasks),避免阻塞数据库写入 ### 5.2 缺少示例数据,评审门槛高(高优先级,易修复) **问题**:仓库中没有预置的示例 PDF 文件。评审要验证核心功能(PDF 解析→RAG 问答→报告生成→企业评分),必须自己寻找、上传企业年报/研报。对于不熟悉金融领域的评审,可能不知道什么样的 PDF 适合测试(需要包含财务报表、业务描述、风险提示等结构化内容)。 **影响**:评审可能因找不到合适的测试 PDF 而无法体验完整功能链路,特别是表格抽取和企业评分这两个核心卖点。 **建议**: 1. 在 `data/examples/` 目录中放入 1-2 份公开的上市公司年报节选(如从巨潮资讯网下载的、已公开披露的年报,注意脱敏) 2. 在 README 中添加"快速体验"章节,说明如何用示例 PDF 跑通完整流程 3. 在前端增加"加载示例"按钮,一键加载预置的示例数据 4. 提供 1-2 张运行截图(问答界面 + 评分结果 + 报告导出) ### 5.3 联网调研在国内网络环境可能不稳定(中优先级) **问题**:`web_research.py`(6.5KB)依赖 `duckduckgo_search`(DDGS)进行联网搜索。DDGS 在中国大陆网络环境下经常不可用(被墙或限流),而本项目的目标用户是国内金融研究员。虽然代码中有降级处理(搜索失败返回空结果),但降级后企业评分的"联网搜索"维度将无数据,评分结果不完整。 **影响**:国内评审和用户可能经常遇到联网调研功能不可用的情况,企业评分缺少"联网搜索"维度数据。 **建议**: 1. 添加备用搜索源:优先 DDGS → 降级到 Bing Web Search API(需 API Key 但国内可用)→ 再降级到 Tavily Search API 2. 在 `.env.example` 中添加 `SEARCH_ENGINE=duckduckgo|bing|tavily` 配置项 3. 在 UI 中显示联网调研状态(绿色=DDGS 可用 / 黄色=降级到 Bing / 红色=搜索不可用),让用户了解评分的完整性 ### 5.4 评分权重和置信度缺乏可解释性(中优先级) **问题**:`score_service.py`(18.5KB)实现了三维度评分(知识库证据 + 结构化财务 + 联网搜索),但: - 三个维度的权重是硬编码的还是动态的?README 和代码中均未说明 - 最终评分的置信度如何计算?如果知识库只有 2 页 PDF 而联网搜索不可用,评分的可信度显然低于知识库有 50 页 PDF + 联网搜索正常的情况 - 评分结果的展示没有"数据充分性"指标,用户无法判断"这个 85 分是基于多少证据得出的" **影响**:金融领域的用户对评分的可解释性要求很高。一个没有置信度说明的评分数字,在专业场景下可信度存疑。 **建议**: 1. 在评分结果中增加 `confidence` 字段,基于各维度的数据充分性计算(如:知识库文档数量、财务指标覆盖率、联网搜索结果数量) 2. 在评分结果中显示各维度的原始分数和权重,例如: ```json { "total_score": 85, "confidence": 0.72, "dimensions": { "knowledge_base": {"score": 88, "weight": 0.4, "evidence_count": 23}, "financial": {"score": 82, "weight": 0.4, "metrics_found": 15, "metrics_total": 20}, "web_research": {"score": 80, "weight": 0.2, "sources_found": 5} } } ``` 3. 在前端评分页面增加"评分说明"展开面板,解释各维度含义和权重 ### 5.5 向量检索质量未验证(低优先级但影响核心体验) **问题**:RAG 是本项目的核心能力,但 `vector_store.py`(12.2KB)和 `rag_service.py`(1.6KB)中没有检索质量评估逻辑。用户无法知道: - 检索到的文档片段是否与问题相关 - 是否有更相关但未检索到的片段 - 检索结果的排序是否合理 **建议**: 1. 在 RAG 返回结果中增加 `relevance_score`(余弦相似度),低于阈值(如 0.5)的片段标记为"低相关性" 2. 在问答结果中增加"检索质量"指标(如:检索了 N 个片段,其中 M 个相关性 > 0.7) 3. 在 `text_splitter.py` 中尝试不同的切分策略(按段落 vs 固定 token 数 vs 语义切分),对比检索质量 ## 6. 复赛阶段评价 13/13 Skills 全部可运行,核心业务闭环完整跑通,LangGraph 编排正确,双来源引用机制设计好,降级链路全面(零门槛评审),有测试。按复赛标准"Skills 需完整、有效、可运行,原型跑通核心业务闭环"。
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Z2wen1tao_31/S1W2-Enterprise-Research-Report-Agent#2
No description provided.