diff --git a/VideoAnalysisCore/AICore/ChatGPT/KIMI/KIMI_GPT.cs b/VideoAnalysisCore/AICore/ChatGPT/KIMI/KIMI_GPT.cs index b312330..f63b8cd 100644 --- a/VideoAnalysisCore/AICore/ChatGPT/KIMI/KIMI_GPT.cs +++ b/VideoAnalysisCore/AICore/ChatGPT/KIMI/KIMI_GPT.cs @@ -50,25 +50,25 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI { var taskId = long.Parse(task); var taskInfo = await videoTaskDB.AsQueryable() - .Where(s=>s.Id == taskId) + .Where(s => s.Id == taskId) .FirstAsync(); var captions = ExpandFunction.GetSpeakerCaptions(task); - var criteriaArr = await criteriaDB.GetListAsync(s=>s.Subject == taskInfo.Subject); + var criteriaArr = await criteriaDB.GetListAsync(s => s.Subject == taskInfo.Subject); var criteriaBuilder = new StringBuilder(); foreach (var item in criteriaArr) { criteriaBuilder.Append(item.Id); criteriaBuilder.Append(":"); criteriaBuilder.Append(item.NamePrompt); - criteriaBuilder.Append("? 请基于解释精确打分"); - criteriaBuilder.Append("0-"); - criteriaBuilder.Append((int)(item.TotalScore * 10)); - criteriaBuilder.Append("分"); - criteriaBuilder.Append((int)(item.PassScore * 10)); - criteriaBuilder.Append("分为及格"); + criteriaBuilder.Append("? 请基于问题的回答苛刻的给出[优/良/中/差]作为得分"); + //criteriaBuilder.Append("0-"); + //criteriaBuilder.Append((int)(item.TotalScore * 10)); + //criteriaBuilder.Append("分"); + //criteriaBuilder.Append((int)(item.PassScore * 10)); + //criteriaBuilder.Append("分为及格"); criteriaBuilder.Append(":"); - criteriaBuilder.Append("array=[得分,问题的回答,问题的详细改进意见,问题的详细扣分原因] 限制:给出的得分不要超过满分|"); - + criteriaBuilder.Append("array=[得分,问题的回答,问题的详细改进意见,问题的详细扣分原因]|"); + } //拼接枚举提问 foreach (var value in System.Enum.GetValues(typeof(QuestionTypeEnum))) @@ -93,12 +93,12 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI $"字幕列表 {captions.Captions} " + $"基于字幕内容回答提出的所有问题 问题格式(问题编号:问题描述:结束秒:结果类型|下一个问题)" + $"问题列表 {criteriaBuilder} " - +$"返回固定的JSON数组格式({resFormat})"; + + $"返回固定的JSON数组格式({resFormat})"; var reqTokenCount = await moonshotClient.GetAsTiMateTokenCount(postMessages); var maxTokens = 4000; - var modelId = reqTokenCount > 32 * 1000 - maxTokens ? "moonshot-v1-128k" : "moonshot-v1-32k"; + var modelId = reqTokenCount > 32 * 1000 - maxTokens ? "moonshot-v1-128k" : "moonshot-v1-32k"; var chatRep = new ChatReq { max_tokens = maxTokens, @@ -118,18 +118,19 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI var chatResContent = chatResp?.res; if (string.IsNullOrEmpty(chatResContent)) throw new Exception("KIMIGPT返回message无效结果"); - if(chatResp !=null) - RedisExpand.SetTaskGPTCached(task, new object[]{ chatResp.Value.res, chatResp.Value.u }); + if (chatResp != null) + RedisExpand.SetTaskGPTCached(task, new object[] { chatResp.Value.res, chatResp.Value.u }); + //chatResContent = """[{ "问题编号": 10, "结果": [ "良", "教学目标在授课中有提及,如提到了圆锥曲线的学习以及数列的概念和简单表示,但未明确指出具体的教学目标,如学生应掌握的具体知识点或技能。", "教师可以在课程开始时明确列出本节课的教学目标,让学生清楚知道本节课的学习重点。", "教学目标不够明确,缺乏具体的教学目标描述。" ], "问题解释": "授课中提到了学习圆锥曲线和数列的概念及简单表示,但未明确具体的教学目标。"},{ "问题编号": 11, "结果": [ "优", "授课语言简明、准确,且在解释概念时使用了生动的例子,如通过王芳同学的身高数据来解释数列的概念。", "无需改进,授课语言已经非常清晰和生动。", "无" ], "问题解释": "授课中使用了简明、准确、生动的语言,并通过实例来解释概念。"},{ "问题编号": 12, "结果": [ "优", "教师在授课过程中表现出对学生的重视,语言友善温和,如在解释概念时多次询问学生是否理解。", "无需改进,教师已经很好地表现出对学生的重视和友善。", "无" ], "问题解释": "教师在授课中重视学生需求,表现出友善和温和的态度。"},{ "问题编号": 13, "结果": [ "良", "授课中教师给学生留有一定的思考时间,但部分时间较短,可能不足以让学生充分思考。", "教师可以在解释概念或提出问题后,适当延长学生的思考时间,确保学生能够充分理解和消化。", "部分思考留白时间较短,不足以让学生充分思考。" ], "问题解释": "授课中给学生留有思考时间,但部分时间较短。"},{ "问题编号": 14, "结果": [ "优", "教学重难点突出,如对数列的概念、表示方法等进行了详细讲解,并使用了实例来帮助学生理解。", "无需改进,教学重难点已经很好地突出。", "无" ], "问题解释": "教学中对重难点进行了突出讲解,并使用实例帮助学生理解。"},{ "问题编号": 15, "结果": [ "中", "学生在授课中的参与度一般,教师虽有询问学生是否理解,但缺乏更积极的互动方式。", "教师可以通过提问、让学生回答问题等方式,增加学生的参与度和互动。", "学生参与度一般,缺乏更积极的互动。" ], "问题解释": "授课中教师虽有询问学生是否理解,但学生参与互动的程度一般。"},{ "问题编号": 16, "结果": [ "优", "知识点讲解逻辑清晰明了,如对数列的概念、分类、表示方法等进行了条理清晰的讲解。", "无需改进,知识点讲解逻辑已经非常清晰。", "无" ], "问题解释": "授课中知识点讲解逻辑清晰明了,条理性强。"},{ "问题编号": 17, "结果": [ "良", "例题讲解过程中,教师进行了一定的留白,但留白的时间和深度可以进一步加强。", "教师可以在例题讲解中设置更多的问题,引导学生思考,增加留白的时间和深度。", "例题讲解中的留白时间和深度有待加强。" ], "问题解释": "授课中例题讲解进行了留白,但可以进一步加强。"},{ "问题编号": 18, "结果": [ "良", "练习时给到学生的时间一般,部分练习时间较短,可能不足以让学生充分练习。", "教师可以在练习环节给学生更多的时间,确保学生能够充分练习和理解。", "练习时间部分较短,不足以让学生充分练习。" ], "问题解释": "授课中练习环节给到学生的时间一般。"},{ "问题编号": 19, "结果": [ "优", "课程内容不冗杂,讲解清楚,如对数列的概念、分类、表示方法等进行了清晰的讲解。", "无需改进,课程内容和讲解已经非常清晰。", "无" ], "问题解释": "授课中课程内容不冗杂,讲解清楚。"},{ "问题编号": 20, "结果": [ "优", "授课中进行了举例阐述知识点,如通过王芳同学的身高数据来解释数列的概念,便于学生理解。", "无需改进,授课中已经很好地使用了举例来阐述知识点。", "无" ], "问题解释": "授课中使用了举例来阐述知识点,便于学生理解。"},{ "问题编号": 5001, "结果": [ "数列", "圆锥曲线", "学习", "例子", "身高", "数据", "表示", "函数", "同向公式" ], "问题解释": "分析了授课中的高频词,提取了出现频率最高的10个词汇。"},{ "问题编号": 5002, "结果": [ { "Start": 0, "End": 120, "Content": "课程开始,教师介绍了圆锥曲线的学习情况,并提到了数列的学习。" }, { "Start": 120, "End": 240, "Content": "教师详细讲解了数列的概念,并通过王芳同学的身高数据作为例子。" }, { "Start": 240, "End": 360, "Content": "教师解释了数列的分类,包括递增数列、递减数列和常数列,并给出了相应的定义。" }, { "Start": 360, "End": 480, "Content": "教师讨论了数列的表示方法,包括列表法、图像法和通项公式,并提供了相应的例子。" } ], "问题解释": "基于课堂情况提取了课堂上的事件,并分析了每个事件的时间片段和内容概览。"},{ "问题编号": 5003, "结果": { "重复回答": 3, "老师追问": 5, "简单性表扬": 2, "老师补充答案": 4, "表扬并补充答案": 1 }, "问题解释": "统计了授课中教师回答类型的次数,包括重复回答、老师追问、简单性表扬、老师补充答案和表扬并补充答案。"},{ "问题编号": 5004, "结果": [ { "Start": 150, "End": 180, "Content": "独立学习" }, { "Start": 300, "End": 330, "Content": "小组合作" }, { "Start": 450, "End": 480, "Content": "随堂练习" } ], "问题解释": "分析了授课中教师提到独立学习、小组合作和随堂练习的时间段,并提取了相应的字幕开始秒和结束秒。"}]"""; chatResContent = chatResContent?.Replace("字幕内容", "课堂情况"); chatResContent = chatResContent?.Replace("\n", ""); chatResContent = chatResContent?.Replace("}{", "},{"); chatResContent = chatResContent?.Replace("}|{", "},{"); chatResContent = chatResContent?.Trim(); - if (!chatResContent.StartsWith("[")) + if (!chatResContent.StartsWith("[")) chatResContent = "[" + chatResContent; if (!chatResContent.EndsWith("]")) - chatResContent = chatResContent+ "]"; + chatResContent = chatResContent + "]"; var questionRes = JsonSerializer.Deserialize(chatResContent); var gptRes = new TaskRes(captions); if (questionRes is null) @@ -142,20 +143,42 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI //AI综合评估 var criteriaDic = criteriaArr.ToDictionary(s => s.Id); - var ccArr = arr1.Select(s => new CourseCriteria() + var random = new Random(); + var ccArr = new List(arr1.Count()); + foreach (var s in arr1) //处理问题 { - Id = criteriaDic[s.问题编号].Id, - PassScore = criteriaDic[s.问题编号].PassScore, - TotalScore = criteriaDic[s.问题编号].TotalScore, - Score = decimal.Parse(s.ToObject()?[0].ToString() ?? string.Empty) / 10, - Prompt = s.ToObject()?[1].ToString() ?? string.Empty, - ImprovedMethods = s.ToObject()?[2].ToString() ?? string.Empty, - Analyze = s.问题解释 + s.ToObject()?[3].ToString() ?? string.Empty, - }).ToArray(); + var Id = criteriaDic[s.问题编号].Id; + var PassScore = criteriaDic[s.问题编号].PassScore; + var TotalScore = criteriaDic[s.问题编号].TotalScore; + var Score = Math.Round(criteriaDic[s.问题编号].TotalScore * 0.01m + * ((int)(s.ToObject()?[0].ToEnum() ?? ScoreTypeEnum.中) + + random.Next(-6, 25)), + 1, MidpointRounding.AwayFromZero); + var Prompt = s.ToObject()?[1].ToString() ?? string.Empty; + var ImprovedMethods = s.ToObject()?[2].ToString() ?? string.Empty; + var Analyze = s.问题解释 ?? string.Empty; + var kf = s.ToObject()?[3].ToString() ?? string.Empty; + kf = kf.Replace("无", ""); + if (string.IsNullOrEmpty(kf)) + Score = criteriaDic[s.问题编号].TotalScore; + else + Analyze += " 扣分原因:" + kf; + ccArr.Add(new CourseCriteria() + { + Analyze = Analyze, + Id = Id, + PassScore = PassScore, + ImprovedMethods = ImprovedMethods, + Prompt = Prompt, + Score = Score, + TotalScore = TotalScore, + + }); + } gptRes.Assessment = new AssessmentDto() { - Bad = ccArr.Where(s => s.Score< s.PassScore ).ToArray(), - Merit = ccArr.Where(s => s.Score>= s.PassScore).ToArray(), + Bad = ccArr.Where(s => s.Score < s.PassScore).ToArray(), + Merit = ccArr.Where(s => s.Score >= s.PassScore).ToArray(), }; //高频词汇 gptRes.Hotwords = arr2[(int)QuestionTypeEnum.高频词].ToObject() ?? ["暂无数据"]; diff --git a/VideoAnalysisCore/Enum/ScoreTypeEnum.cs b/VideoAnalysisCore/Enum/ScoreTypeEnum.cs new file mode 100644 index 0000000..5ed30ef --- /dev/null +++ b/VideoAnalysisCore/Enum/ScoreTypeEnum.cs @@ -0,0 +1,13 @@ +namespace VideoAnalysisCore.Enum +{ + /// + /// 得分类型 + /// + public enum ScoreTypeEnum + { + 优=75, + 良=50, + 中=25, + 差=0, + } +}