GenerateReport 生成质量报告
( ctx context.Context, memories []MemoryWithScore, )
| 298 | |
| 299 | // GenerateReport 生成质量报告 |
| 300 | func (qa *QualityAnalyzer) GenerateReport( |
| 301 | ctx context.Context, |
| 302 | memories []MemoryWithScore, |
| 303 | ) (*QualityReport, error) { |
| 304 | report := &QualityReport{ |
| 305 | GeneratedAt: time.Now(), |
| 306 | DimensionScores: make(map[QualityDimension]float64), |
| 307 | InconsistencyCount: make(map[InconsistencyType]int), |
| 308 | } |
| 309 | |
| 310 | // 获取统计信息 |
| 311 | report.Stats = qa.metrics.GetStats() |
| 312 | |
| 313 | // 计算各维度平均分数 |
| 314 | dimensionTotals := make(map[QualityDimension]float64) |
| 315 | dimensionCounts := make(map[QualityDimension]int) |
| 316 | |
| 317 | for _, quality := range qa.metrics.GetAll() { |
| 318 | dimensionTotals[QualityAccuracy] += quality.Score.Accuracy |
| 319 | dimensionTotals[QualityCompleteness] += quality.Score.Completeness |
| 320 | dimensionTotals[QualityConsistency] += quality.Score.Consistency |
| 321 | dimensionTotals[QualityTimeliness] += quality.Score.Timeliness |
| 322 | dimensionTotals[QualityRelevance] += quality.Score.Relevance |
| 323 | |
| 324 | for dim := range dimensionTotals { |
| 325 | dimensionCounts[dim]++ |
| 326 | } |
| 327 | } |
| 328 | |
| 329 | for dim, total := range dimensionTotals { |
| 330 | if dimensionCounts[dim] > 0 { |
| 331 | report.DimensionScores[dim] = total / float64(dimensionCounts[dim]) |
| 332 | } |
| 333 | } |
| 334 | |
| 335 | // 检测不一致性 |
| 336 | inconsistencies, err := qa.DetectInconsistencies(ctx, memories) |
| 337 | if err != nil { |
| 338 | return nil, err |
| 339 | } |
| 340 | report.Inconsistencies = inconsistencies |
| 341 | |
| 342 | // 统计不一致性类型 |
| 343 | for _, inc := range inconsistencies { |
| 344 | report.InconsistencyCount[inc.Type]++ |
| 345 | } |
| 346 | |
| 347 | // 收集 TOP 问题 |
| 348 | issueMap := make(map[string]int) |
| 349 | for _, quality := range qa.metrics.GetAll() { |
| 350 | for _, issue := range quality.Issues { |
| 351 | issueMap[issue]++ |
| 352 | } |
| 353 | } |
| 354 | |
| 355 | topIssues := []struct { |
| 356 | issue string |
| 357 | count int |