【S1W2 交叉评测】对项目 S1W2-Enterprise-Research-Report-Agent 的反馈 #3
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
1. 项目理解
我理解这个项目主要想解决:
核心定位是"面向金融/经济/管理专业学生和投研初学者的,可离线演示的企业研报RAG分析原型系统"。
2. 项目优点
2.1 架构设计
_langchain_failed标志位控制),兼顾便利性和健壮性。2.2 健壮性与降级设计(项目最大亮点)
langgraph库不可用时仍可正常运行。_use_hash_fallback标志位控制。2.3 工程细节
_search_hits方法对多文档场景按文档数量均分Top-K配额,再从各文档交替取回,不足时用全局检索补充,避免热门文档垄断检索结果。2.4 前端工程
setTimeout逐字符/批量显示Markdown内容,带闪烁光标,模拟流式效果。2.5 测试
fitz.open() + new_page() + insert_text()在内存中生成测试PDF,不依赖外部测试文件。make_table_pdf_bytes()用fitz.Rect + draw_rect + insert_text构建带表格的PDF。3. 当前问题
3.1 架构层面
MessageThread、ScoreResult等子组件,但主组件仍承载过多职责。建议拆分为独立页面组件(DocumentsPage、ChatPage、ReportPage、ScorePage)和自定义hooks。new AgentGraphRunner(...)。两个Runner实例互不相通,MemorySaver checkpointer也是各自独立的。应该由ServiceContainer创建单例并注入。score_service.py中的ScoreGraphRunner._validate_scope逻辑与agent_graph.py中的AgentGraphRunner._validate_scope几乎完全一致,应抽取公共校验逻辑。3.2 评分算法(核心硬伤)
50 + min(len(evidences),3)*8 + min(len(metric_subset),4)*5 + min(len(web_references),2)*4,完全基于证据数量而非质量。例如:返回3条不相关证据的维度得74分,而返回1条高度相关证据仅得58分。评分上限硬编码为92分。build_rationale函数只是统计证据/指标/联网资料条数,没有调用LLM做真正的语义分析。3.3 代码质量问题
agent_graph.py和score_service.py中各有完整的一套StateGraph+CompiledGraphfallback实现(约40行完全相同),应提取到公共模块。compact_quote函数在agent_graph.py(limit=500)和score_service.py(limit=420)各定义了一次。_chunk_paragraphs方法未使用:text_splitter.py 中的_chunk_paragraphs方法定义了但split_pages实际走的是 LangChainRecursiveCharacterTextSplitter.split_documents,该方法成为死代码(55行)。3.4 功能缺位
MarkdownBlock的animateprop)。_load_memory仅取最近8条消息,没有做token计数截断、没有做智能摘要压缩。web_research.py中 provider 硬编码判断,非duckduckgo直接返回空。3.5 测试覆盖不足
TableExtractor、TextCleanup、PdfParser、WebResearchService等核心服务缺少独立单元测试。RUN_MILVUS_TESTS=1运行,但常规pytest不包含。3.6 潜在风险
threading.Lock做本地锁,但 FastAPI 异步环境下多个请求可能在不同线程执行,Lock保护范围可能不够(_connect每次创建新连接,不在Lock内)。fitz.open(path),无文件大小预检查。report_exporter.py使用fitz.Story做 Markdown→PDF 转换,这是 PyMuPDF 较新的功能,某些复杂Markdown(嵌套列表、复杂表格)可能渲染异常。4. 建议
4.1
DocumentsTab、ChatTab、ReportTab、ScoreTab),将CRUD逻辑提取为自定义hooks(useKnowledgeBases、useDocuments、useConversations)。ServiceContainer中创建并注入到RagService和ReportService,避免重复实例化。StateGraphfallback代码提取到单独的backend/services/graph_fallback.py,agent_graph.py和score_service.py共用。_score_dimensions中增加LLM调用,将证据内容、财务指标和联网资料发给LLM进行语义评分(类似问答生成),提供至少dimension.score和dimension.rationale两个字段的LLM生成。Settings中增加max_upload_size_mb,在routes.py上传接口中校验file.size。4.2
astream功能在_generate节点输出时通过 SSE 推送 token,前端用EventSource接收。rank_bm25库),通过 RRF(Reciprocal Rank Fusion)合并排序。BAAI/bge-reranker-v2-m3等轻量 reranker 对Top-K结果重排序。schema_version表),_migrate改为按版本号顺序执行。4.3
LLM_MODE基础上增加更多 provider 适配(类似现在的openai兼容模式)。5. 综合评价
综合定位:这是一个"远超原型水平、接近可演示产品的"企业研报RAG系统。代码量估计在6000-8000行(含前后端和测试),在两周的开发周期内完成了如此多的功能模块,工程能力很强。
技术亮点突出:多层降级设计(LangGraph fallback、Embedding fallback、联网搜索降级、Mock模式)展现了扎实的工程思维——不假设外部依赖永远可用,这在以LangChain/LLM为核心的技术栈中尤其可贵。自研Markdown→PDF渲染器也体现了不依赖第三方工具的态度。
核心短板明确:企业能力评分的算法机械化(纯规则驱动而非LLM语义驱动)是当前最大的功能缺口,与文档描述和项目定位有落差。前端组件未拆分、服务实例重复创建等问题属于工程债,当前规模下可接受但亟需重构。