package main import ( "context" "fmt" "io/ioutil" "log" "os" "strings" "time" "github.com/sashabaranov/go-openai" ) // 配置文件 const ( BaseURL = "https://api.lkeap.cloud.tencent.com/v1" APIKey = "sk-Y4zjnwulSuSlf60mrzwCxq2ipktHSs4jZHgWeQOArWuWJEOd" // 替换为实际的API Key Model = "deepseek-v3" // 推荐使用terminus版本 ) // 读取文件内容 func readFileContent(filename string) (string, error) { content, err := ioutil.ReadFile(filename) if err != nil { return "", fmt.Errorf("读取文件 %s 失败: %v", filename, err) } return string(content), nil } // 构建分析提示词 func buildAnalysisPrompt(teachingPlanContent, heartRateContent string) string { return fmt.Sprintf(`请根据以下体育课堂的教案和心率监测数据,生成一份详细的课堂分析报告: ## 教案内容: %s ## 心率监测数据: %s 这是一份幼儿园体育课的教案和课程心率监测数据,请帮对照分析课程教学效果,运动量和运动负荷情况是否科学,并提出课程设计的优化方案。 优化方案参考如下格式,教学过程需要详细一些: # 幼儿体育教案(华侨大学版本) | 项目 | 内容 | | ------------ | -------------------------------- | | **课程名** | | | **年段** | 小 中 大 | | **教师姓名** | | | **时间** | 年 月 日 | | **地点** | | | **人数** | 男: 女: | | **时长** | 分钟 | | **天气预报** | 晴 雨 阴;温度 ℃ | | **器材准备** | | ## 教学目标 | 类型 | 目标 | | -------- | ------------ | | **体能目标** | | | **技能目标** | | | **情感目标** | | ## 教学过程 | 阶段 | 阶段 | 项目名称 | 引导语及教学方法 | 队形/站位/留意点 | 目标心率区间 | 时间(分) | | ---------- | -------- | ----------------------------- | ------------------------ | --------------------- | ------------ | ---------- | | **准备部分** | 热身 | | | | | 3 | | | 注意力游戏 | | | | | 3 | | **正课部分** | 基本素质练习及常规意识培养环节 | | | | | 5 | | | 复习环节 | | | | | 5 | | | 新授环节 | | | | | 8 | | **结束部分** | 社会性及情感目标游戏 | | | | | 4 | | | 整理放松 | | | | | 2 | 请以专业体育教师的视角,提供详细的数据分析和教学建议。`, teachingPlanContent, heartRateContent) } // 调用大模型进行分析 func analyzeClassData(teachingPlanFile, heartRateFile string) (string, error) { // 读取文件内容 teachingPlanContent, err := readFileContent(teachingPlanFile) if err != nil { return "", err } heartRateContent, err := readFileContent(heartRateFile) if err != nil { return "", err } // 构建客户端 config := openai.DefaultConfig(APIKey) config.BaseURL = BaseURL client := openai.NewClientWithConfig(config) // 构建提示词 prompt := buildAnalysisPrompt(teachingPlanContent, heartRateContent) // 调用API resp, err := client.CreateChatCompletion( context.Background(), openai.ChatCompletionRequest{ Model: Model, Messages: []openai.ChatCompletionMessage{ { Role: openai.ChatMessageRoleUser, Content: prompt, }, }, Temperature: 0.6, // 使用默认值 TopP: 0.6, // 使用默认值 MaxTokens: 5000, // 适当限制输出长度 }, ) if err != nil { return "", fmt.Errorf("API调用失败: %v", err) } if len(resp.Choices) == 0 { return "", fmt.Errorf("未收到有效响应") } return resp.Choices[0].Message.Content, nil } // 保存分析结果到文件 func saveAnalysisResult(result, outputFile string) error { // 添加时间戳和分隔符 timestamp := "生成时间: " + getCurrentTime() separator := strings.Repeat("=", 80) formattedResult := fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n", separator, timestamp, separator, result, separator) return ioutil.WriteFile(outputFile, []byte(formattedResult), 0644) } // 获取当前时间(简化版) func getCurrentTime() string { // 实际使用时可以导入time包 return time.Now().Format("2006-01-02 15:04:05") // 替换为 time.Now().Format("2006-01-02 15:04:05") } func main() { // 文件路径配置 teachingPlanFile := "D:\\projects\\IdeaProjects\\hr_receiver\\test\\b.md" heartRateFile := "D:\\projects\\IdeaProjects\\hr_receiver\\test\\b.csv" outputFile := "小班.md" // 检查文件是否存在 if _, err := os.Stat(teachingPlanFile); os.IsNotExist(err) { log.Fatalf("教案文件不存在: %s", teachingPlanFile) } if _, err := os.Stat(heartRateFile); os.IsNotExist(err) { log.Fatalf("心率数据文件不存在: %s", heartRateFile) } fmt.Println("开始分析体育课堂数据...") fmt.Printf("教案文件: %s\n", teachingPlanFile) fmt.Printf("心率数据: %s\n", heartRateFile) // 进行分析 result, err := analyzeClassData(teachingPlanFile, heartRateFile) if err != nil { log.Fatalf("分析失败: %v", err) } // 保存结果 err = saveAnalysisResult(result, outputFile) if err != nil { log.Fatalf("保存结果失败: %v", err) } fmt.Printf("分析完成!结果已保存到: %s\n", outputFile) fmt.Println("\n分析报告摘要:") fmt.Println(strings.Repeat("-", 50)) // 显示前200字符作为预览 preview := result if len(result) > 200 { preview = result[:200] + "..." } fmt.Println(preview) }