问题根因
- 数据断层:后端
parse_project已提取 docstring/params/return_type/bases/decorators/external_calls/source_code 等丰富属性,但前端normalizeGraphResponse只保留 6 个字段(id/name/kind/qualified_name/line_start/line_end),其余全丢弃 - 无技术栈检测:
external_calls已捕获未解析外部调用名(requests.get/pandas.DataFrame),但从未聚合分类 - 无 LLM 分析:
parse_project纯 AST,无语义层面的架构解读 - 无联网搜索:
search_web+learningResourcesstore 已就绪,但 ProjectGraphView 完全未接入 - Stats bug:后端返回
function_count,前端读function,头部计数永远 0
设计:两段式(AST 自动 + LLM 按需)
AST 能做的(技术栈检测、实体属性展示)自动执行零成本;LLM 分析 + 联网搜索按需触发(按钮),不拖慢自动解析。
Phase 1:修复数据断层 + 实体详情丰富化(零 LLM, 自动)
1.1 api/project.js``normalizeGraphResponse 传递完整属性
- entities 增加:docstring, params, return_type, bases, decorators, external_calls, module_name, source_code
- stats key 映射:
function_count->function,class_count->class,method_count->method,module_count->module(修复头部计数 bug)
1.2 ProjectGraphView.vue 实体详情面板丰富化
- 显示 docstring(如有,折叠展示)
- 显示参数列表
params(名称:类型) - 显示外部依赖
external_calls(去重后的 top-level 模块名) - 显示继承基类
bases、装饰器decorators(如有)
Phase 2:技术栈自动检测(AST, 零 LLM, 自动)
2.1 新建 frontend/src/utils/techStack.js
detectTechStack(entities): 扫描所有实体的external_calls,提取 top-level 模块名(.前的部分),映射到技术分类- 内置 ~30 个常见 Python 包映射表(flask->Web 框架, pandas->数据分析, requests->HTTP 客户端, pytest->测试 等)
- 返回
[{name, category, count}](按引用次数降序)
2.2 ProjectGraphView.vue 头部展示技术栈 badges
- 在 stats 行下方加一行技术栈 tag(
el-tagper tech),点击可触发联网搜索该技术
Phase 3:LLM 深度分析 + 联网搜索(按需)
3.1 后端新建 POST /api/project/analyze
-
新文件
backend/app/agents/project_analyzer.py:analyze_project(project_id, kg, tavily_key): 从 Neo4j 取项目图谱 -> LLM 分析架构(模式/入口点/关键模块/复杂度/学习建议)-> 对检测到的技术栈逐个search_web搜教程/文档- LLM prompt 包含:实体清单(名称/类型/调用关系摘要)+ 技术栈 + 要求输出 JSON
{summary, architecture:{pattern, entry_points, key_modules}, recommendations:[...]} - 复用
app/agents/llm.py的 LLM 调用基础设施 - 复用
app/utils/web_search.py的search_web
-
路由
backend/app/api/project.py加POST /analyze:- 入参
{project_id, tavily_key?} - 503 if Neo4j 未就绪;404 if 项目图谱不存在
- 返回
{summary, architecture, tech_stack, web_resources:[{title,url,snippet,tech}]}
- 入参
3.2 api/project.js 加 analyzeProject(projectId, tavilyKey)
- POST /api/project/analyze
3.3 projectGraph store 加 analyze() action
analyzingref (bool) +analysisref (null|{summary, architecture, tech_stack, web_resources})- 调
analyzeProject-> set analysis -> web_resources 流入learningResourcesstore
3.4 ProjectGraphView.vue 加"深度分析"按钮 + 结果面板
-
工具栏加"深度分析"按钮(loading 状态)
-
侧栏新增"项目分析"卡片(analysis 非空时显示):
- 架构摘要(summary)
- 架构模式 + 入口点 + 关键模块
- 学习建议
- 联网资源列表(web_resources,点击打开浏览器)
-
技术栈 badge 点击 -> 自动调 web_search 搜该技术 -> 结果流入 learningResources
Phase 4:测试 + 收尾
测试
utils/techStack.test.js: detectTechStack 映射 + 去重 + 空输入api/project.test.js(或扩展 project-graph-store.test.js): normalizeGraphResponse 传递丰富字段 + stats key 映射- 后端
test_project_analyzer.py: mock LLM + search_web, 验证返回结构 - 全量 vitest + pytest 回归
