diff --git a/VideoAnalysis/Dockerfile b/VideoAnalysis/Dockerfile index 651cea3..3303b7f 100644 --- a/VideoAnalysis/Dockerfile +++ b/VideoAnalysis/Dockerfile @@ -1,9 +1,12 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM dotnet/aspnet:8.0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base -RUN ["apt-get", "--assume-yes", "update"] -RUN ["apt-get", "--assume-yes", "install", "ffmpeg"] + +# 更新 apt 源 +COPY sources.list /etc/apt/sources.list +RUN apt-get update +RUN apt-get install -y ffmpeg WORKDIR /app EXPOSE 9040 @@ -13,9 +16,6 @@ COPY . . ENV TZ=Asia/Shanghai -#RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ sid main contrib non-free" > /etc/apt/sources.list -#RUN apt-get update && apt-get install -y apt-transport-https ca-certificates apt-utils libgdiplus libc6-dev && apt-get install -y libfreetype6 && apt-get install -y libfontconfig1 && apt-get install -y fontconfig -# ENV ASPNETCORE_URLS=http://+:9040 ENTRYPOINT ["dotnet", "Learn.VideoAnalysis.dll"] diff --git a/VideoAnalysis/Learn.VideoAnalysis.csproj b/VideoAnalysis/Learn.VideoAnalysis.csproj index 4355645..8844de3 100644 --- a/VideoAnalysis/Learn.VideoAnalysis.csproj +++ b/VideoAnalysis/Learn.VideoAnalysis.csproj @@ -17,12 +17,16 @@ + Always + + Always + diff --git a/VideoAnalysis/sources.list b/VideoAnalysis/sources.list new file mode 100644 index 0000000..31d1777 --- /dev/null +++ b/VideoAnalysis/sources.list @@ -0,0 +1,13 @@ +# ĬעԴ뾵 apt update ٶȣҪȡע +deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware +# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware + +deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware +# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware + +deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware +# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware + +# °ȫԴ˹ٷԴ뾵վãҪ޸עл +deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware +# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware \ No newline at end of file diff --git a/VideoAnalysisCore/AICore/ChatGPT/Dto/CallGPTRes.cs b/VideoAnalysisCore/AICore/ChatGPT/Dto/CallGPTRes.cs index a060a55..4890494 100644 --- a/VideoAnalysisCore/AICore/ChatGPT/Dto/CallGPTRes.cs +++ b/VideoAnalysisCore/AICore/ChatGPT/Dto/CallGPTRes.cs @@ -63,8 +63,9 @@ namespace VideoAnalysisCore.AICore.ChatGPT.Dto /// 满分100 /// public float AssessmentScore => - (float)(Assessment?.Bad?.Sum(x => x.Score)??0 + - Assessment?.Merit?.Sum(x => x.Score) ?? 0); + (float)( + (Assessment?.Bad?.Sum(x => x.Score) ?? 0) + + (Assessment?.Merit?.Sum(x => x.Score) ?? 0)); //(float)Math.Round((Assessment?.Bad?.Select(x => x.Score) //.Concat(Assessment?.Merit?.Select(s => s.Score) ?? []) //.Average() ?? 0) * 10,2); diff --git a/VideoAnalysisCore/AICore/ChatGPT/KIMI/KIMI_GPT.cs b/VideoAnalysisCore/AICore/ChatGPT/KIMI/KIMI_GPT.cs index 6c12246..67102ad 100644 --- a/VideoAnalysisCore/AICore/ChatGPT/KIMI/KIMI_GPT.cs +++ b/VideoAnalysisCore/AICore/ChatGPT/KIMI/KIMI_GPT.cs @@ -60,14 +60,14 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI criteriaBuilder.Append(item.Id); criteriaBuilder.Append(":"); criteriaBuilder.Append(item.NamePrompt); - 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=[得分(得分不能超过满分/如果字幕内容不符合问题则给低分),问题的回答,问题的详细改进意见,问题的详细扣分原因]|"); } //拼接枚举提问 @@ -84,7 +84,7 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI criteriaBuilder.Append("|"); } - var resFormat = "[{问题编号:int,结果:array|bool|object,问题解释:string}]"; + var resFormat = """[{"问题编号":number,"结果":array|bool|object,"问题解释":string}]"""; var postMessages = $"你是一个教学经验老道老师对教学工作有着深入的理解和丰富的经验,能够准确把握教学大纲的要求和教学重点。" + $"熟练掌握各种教学管理方法和手段,能够制定科学合理的教学计划和教学评估体系。" + @@ -92,11 +92,9 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI $"以下是一段音频的字幕,分析这段字幕 字幕格式(说话人:开始秒:结束秒:内容|下一段字幕)." + $"字幕列表 {captions.Captions} " + $"基于字幕内容回答提出的所有问题 问题格式(问题编号:问题描述:结束秒:结果类型|下一个问题)" + - $"问题列表 {criteriaBuilder} " + - $"返回固定的JSON数组格式({resFormat})."; - var modelsResp = await moonshotClient.ListModels(); - if (modelsResp is null || modelsResp.data.Count == 0) - throw new Exception("未获取KIMI模型类型"); + $"返回固定的JSON数组格式({resFormat})"; + + var reqTokenCount = await moonshotClient.GetAsTiMateTokenCount(postMessages); var maxTokens = 4000; var modelId = reqTokenCount > 32 * 1000 - maxTokens ? "moonshot-v1-128k" : "moonshot-v1-32k"; @@ -109,17 +107,19 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI model = modelId, messages = new List(){ new MessagesItem(postMessages,"system"), - new MessagesItem(resFormat,"assistant"), + //new MessagesItem(resFormat,"assistant",true), } }; + + RedisExpand.SetTaskGPTReqCached(task, chatRep); var chatResp = await moonshotClient.Chat(chatRep); RedisExpand.SetTaskGPTCached(task, chatResp); if (chatResp is null || chatResp.error != null) throw new Exception($"KIMI模型返回异常 Chat 返回参数: " + $" {JsonSerializer.Serialize(chatResp)}"); - var chatResContent = chatResp?.choices.FirstOrDefault()?.message.content; + var chatResContent = chatResp?.choices.FirstOrDefault()?.message.content.Trim(); chatResContent = chatResContent?.Replace("字幕内容", "课堂情况"); - if (chatResContent is null) + if (string.IsNullOrEmpty(chatResContent)) throw new Exception("KIMIGPT返回message无效结果"); var questionRes = JsonSerializer.Deserialize(chatResContent); var gptRes = new TaskRes(captions); diff --git a/VideoAnalysisCore/AICore/ChatGPT/KIMI/MoonshotModel.cs b/VideoAnalysisCore/AICore/ChatGPT/KIMI/MoonshotModel.cs index b36f9f5..0d54c0c 100644 --- a/VideoAnalysisCore/AICore/ChatGPT/KIMI/MoonshotModel.cs +++ b/VideoAnalysisCore/AICore/ChatGPT/KIMI/MoonshotModel.cs @@ -7,10 +7,11 @@ { } - public MessagesItem(string content, string role = "user") + public MessagesItem(string content, string role = "user",bool partial = false) { this.content = content; this.role = role; + this.partial = partial; } /// /// diff --git a/VideoAnalysisCore/Common/RedisExpand.cs b/VideoAnalysisCore/Common/RedisExpand.cs index 6adc167..22250e9 100644 --- a/VideoAnalysisCore/Common/RedisExpand.cs +++ b/VideoAnalysisCore/Common/RedisExpand.cs @@ -105,7 +105,11 @@ namespace VideoAnalysisCore.Common /// public static void SetTaskGPTCached(object taskId, object? data) { - Redis.Set(RedisExpandKey.TaskGPT(taskId), data, 3600*24); + Redis.Set(RedisExpandKey.TaskGPT(taskId), data, 3600 * 24); + } + public static void SetTaskGPTReqCached(object taskId, object? data) + { + Redis.Set(RedisExpandKey.TaskGPT(taskId)+":Req_"+ DateTime.Now.ToString("yyyy/MM/dd_HH/mm/ss"), data, 3600*24); } /// /// 获取任务进度 diff --git a/VideoAnalysisCore/Enum/QuestionTypeEnum.cs b/VideoAnalysisCore/Enum/QuestionTypeEnum.cs index 2b7c696..f5811be 100644 --- a/VideoAnalysisCore/Enum/QuestionTypeEnum.cs +++ b/VideoAnalysisCore/Enum/QuestionTypeEnum.cs @@ -13,14 +13,14 @@ namespace VideoAnalysisCore.Enum [Display(Prompt = "分析授课中使用的高频词" + "10个频率从高到低 结果类型[]")] 高频词 = 5001, - [Display(Prompt = "基于字幕描述内容精准的划分成时间片段" + - ",提取片段的内容概览,字幕开始秒,结束秒.作为返回结果.每个个片段不低于120秒 结果类型[{Start:开始秒,End:结束秒,Content:概览}]")] + [Display(Prompt = "基于字幕内容精准的提取出课堂上全部的事件" + + ",分析事件的时间片段提取事件的的内容概览,字幕开始秒,结束秒.作为返回结果.每个片段不低于120秒 结果类型[{Start:开始秒,End:结束秒,Content:概览}]")] 时间段概览 = 5002, [Display(Prompt = "统计授课中教师回答类型的次数 回答类型" + "[重复回答,老师追问,简单性表扬,老师补充答案,表扬并补充答案] 结果类型{回答类型:次数}")] 提问类型 = 5003, [Display(Prompt = " 分析授课中教师提到 以下类型" + - "[独立学习,小组合作,随堂练习]的时间段,提取出其中字幕开始秒,结束秒 结果类型[{Start:开始秒,End:结束秒,Content:类型}/null]")] + "[独立学习,小组合作,随堂练习]的时间段,精准提取出其中字幕开始秒,结束秒 结果类型[{Start:开始秒(number),End:结束秒(number),Content:类型(string)}/null]")] 额外课堂情况 = 5004, } } diff --git a/VideoAnalysisCore/VideoAnalysisCore.csproj b/VideoAnalysisCore/VideoAnalysisCore.csproj index 5e12284..0393a3a 100644 --- a/VideoAnalysisCore/VideoAnalysisCore.csproj +++ b/VideoAnalysisCore/VideoAnalysisCore.csproj @@ -36,7 +36,7 @@ - +