异步代码分析:让 DeepSeek 为你「点石成金」
智评 Code+ 的核心目标不仅是「测出对错」,更要「指出问题」,给用户提供智能的优化建议。为此,我接入了 DeepSeek 提供的代码分析能力,并实现了完整的异步任务链。
为什么选择异步分析?
调用 AI 分析模型的耗时通常远大于本地评测,尤其在模型负载较高时:
-
若直接在主线程阻塞调用,容易拖慢接口响应,影响用户体验;
-
异步任务能将分析过程脱离主流程,前端轮询/订阅即可获取分析进度和结果。
因此,我设计了一个可追踪状态的异步分析系统。
功能结构概览
用户点击“分析” -->
1. 创建分析任务记录 (状态 pending)
2. 异步调用 DeepSeek 进行分析
3. 任务运行中:状态 analyzing
4. 分析完成后写入数据库并更新状态为 completed
Step 1:触发分析接口
用户调用 /auth/submissions/:id/analyze 接口后,我们会:
-
创建一条 AnalysisResult 记录;
-
启动一个 goroutine 异步执行分析逻辑。
go func() {
_ = services.UpdateAnalysisStatus(analysis.ID, "analyzing")
result, err := services.AnalyzeCodeWithDeepSeek(uint(sid))
...
_ = services.SaveAnalysisResult(analysis.ID, result)
_ = services.UpdateAnalysisStatus(analysis.ID, "completed")
}()
关键点在于:
-
任务状态的维护非常清晰,避免重复分析或状态错乱;
-
分析结果持久化到数据库中,便于前端查询和展示。
Step 2:支持分析结果多次查看
我设计了 /auth/submissions/:id/analyses 接口用于查看历史分析记录:
utils.DB.Where("submission_id = ?", sid).Find(&analyses)
每次触发的分析任务都会有一条记录,包含以下字段:
-
status:当前任务状态(pending/analyzing/completed/failed)
-
result_text:AI 返回的分析建议(如存在潜在 bug、代码可优化点)
-
created_at:时间戳,便于历史追踪
Step 3:后续考虑
目前异步分析是用户主动触发,这有两个优势:
-
节省算力资源,避免无意义分析;
-
由用户控制分析时机,更符合使用场景。
未来可以扩展功能:
-
分析缓存:同一个提交的分析结果只保留最近几条;
-
分析重试机制:分析失败时提供“重新分析”按钮;
-
WebSocket 订阅机制:分析完成后推送到前端而非轮询。
总结
模块 | 功能 |
---|---|
TriggerAnalysis | 提交异步分析任务 |
AnalyzeCodeWithDeepSeek | 封装 DeepSeek 接口调用逻辑 |
UpdateAnalysisStatus | 追踪任务状态变化 |
SaveAnalysisResult | 持久化结果供前端展示 |
GetAllAnalyses | 查询历史分析记录 |
异步代码分析模块的上线,使得 DeepJudge 不再仅仅是一个“对错判断器”,而是向着真正的 智能评测与代码优化平台迈出了重要一步。