橘子のBlog
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

项目图谱深度增强:实体丰富化 + 技术栈检测 + LLM 分析 + 联网搜索

写作时间:2026-08-15 23:47:43
# Kmatch

问题根因

  1. 数据断层:后端 parse_project 已提取 docstring/params/return_type/bases/decorators/external_calls/source_code 等丰富属性,但前端 normalizeGraphResponse 只保留 6 个字段(id/name/kind/qualified_name/line_start/line_end),其余全丢弃
  2. 无技术栈检测:external_calls 已捕获未解析外部调用名(requests.get/pandas.DataFrame),但从未聚合分类
  3. 无 LLM 分析:parse_project 纯 AST,无语义层面的架构解读
  4. 无联网搜索:search_web + learningResources store 已就绪,但 ProjectGraphView 完全未接入
  5. 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-tag per 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

  • analyzing ref (bool) + analysis ref (null|{summary, architecture, tech_stack, web_resources})
  • 调 analyzeProject -> set analysis -> web_resources 流入 learningResources store

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 回归

‍

avatar

橘子origin

一名正在和算法、数据结构死磕的计算机专业大二大学生! 我相信,代码是逻辑的诗篇,而算法是其中最凝练的修辞。

RECOMMENDED

Origin-Blogs 博客构建介绍(Next.js + python + Vercel部署)

2026-05-31 23:14:39

Hello-Agent:构建一个能处理分步任务的智能旅行助手暨拓展

2026-06-06 09:12:46

龙芯嵌入式 Linux 开发实训第一阶段总结

2026-07-13 15:16:24

Table of Contents