优化 kimi模型提示词,优化程序执行看流程

This commit is contained in:
小肥羊 2024-12-05 15:36:16 +08:00
parent 936423dc22
commit 58a25c5c08
6 changed files with 120 additions and 25 deletions

View File

@ -20,7 +20,7 @@ namespace VideoAnalysisCore.AICore.ChatGPT.Dto
public TaskRes(TotalCaptionsDto captions) public TaskRes(TotalCaptionsDto captions)
{ {
this.TeacherSpeaking = captions.TeacherSpeaking; this.TeacherSpeaking = captions.TeacherSpeaking;
this.TimeBase = captions.TimeBase; this.TimeBase = captions.TimeBase?.ToList();
this.StudentSpeaking = captions.StudentSpeaking; this.StudentSpeaking = captions.StudentSpeaking;
} }
/// <summary> /// <summary>
@ -45,11 +45,11 @@ namespace VideoAnalysisCore.AICore.ChatGPT.Dto
/// <summary> /// <summary>
/// 时间段概览 /// 时间段概览
/// </summary> /// </summary>
public IEnumerable<TimeBase>? TimeOverview { get; set; } public TimeBase[]? TimeOverview { get; set; }
/// <summary> /// <summary>
/// 视频时间轴 /// 视频时间轴
/// </summary> /// </summary>
public IEnumerable<TimeBase>? TimeBase { get; set; } public List<TimeBase>? TimeBase { get; set; }
/// <summary> /// <summary>
/// GPT模型id /// GPT模型id
/// </summary> /// </summary>

View File

@ -60,14 +60,14 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
criteriaBuilder.Append(item.Id); criteriaBuilder.Append(item.Id);
criteriaBuilder.Append(":"); criteriaBuilder.Append(":");
criteriaBuilder.Append(item.NamePrompt); criteriaBuilder.Append(item.NamePrompt);
criteriaBuilder.Append("? 请基于字幕内容对问题进行精确打分"); criteriaBuilder.Append("? 请基于解释精确打分");
criteriaBuilder.Append("0-"); criteriaBuilder.Append("0-");
criteriaBuilder.Append((int)(item.TotalScore * 10)); criteriaBuilder.Append((int)(item.TotalScore * 10));
criteriaBuilder.Append("分"); criteriaBuilder.Append("分");
criteriaBuilder.Append((int)(item.PassScore * 10)); criteriaBuilder.Append((int)(item.PassScore * 10));
criteriaBuilder.Append("分为及格"); criteriaBuilder.Append("分为及格");
criteriaBuilder.Append(":"); criteriaBuilder.Append(":");
criteriaBuilder.Append("array=[得分(得分不能超过满分/如果字幕内容不符合问题则给低分),问题的回答,问题的详细改进意见,问题的详细扣分原因]|"); criteriaBuilder.Append("array=[得分,问题的回答,问题的详细改进意见,问题的详细扣分原因] 限制:给出的得分不要超过满分|");
} }
//拼接枚举提问 //拼接枚举提问
@ -84,7 +84,7 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
criteriaBuilder.Append("|"); criteriaBuilder.Append("|");
} }
var resFormat = """[{"":number,"":array|bool|object,"":string}]"""; var resFormat = """{"":number,"":array|bool|object,"":string}""";
var postMessages = var postMessages =
$"你是一个教学经验老道老师对教学工作有着深入的理解和丰富的经验,能够准确把握教学大纲的要求和教学重点。" + $"你是一个教学经验老道老师对教学工作有着深入的理解和丰富的经验,能够准确把握教学大纲的要求和教学重点。" +
$"熟练掌握各种教学管理方法和手段,能够制定科学合理的教学计划和教学评估体系。" + $"熟练掌握各种教学管理方法和手段,能够制定科学合理的教学计划和教学评估体系。" +
@ -92,7 +92,8 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
$"以下是一段音频的字幕,分析这段字幕 字幕格式(说话人:开始秒:结束秒:内容|下一段字幕)." + $"以下是一段音频的字幕,分析这段字幕 字幕格式(说话人:开始秒:结束秒:内容|下一段字幕)." +
$"字幕列表 {captions.Captions} " + $"字幕列表 {captions.Captions} " +
$"基于字幕内容回答提出的所有问题 问题格式(问题编号:问题描述:结束秒:结果类型|下一个问题)" + $"基于字幕内容回答提出的所有问题 问题格式(问题编号:问题描述:结束秒:结果类型|下一个问题)" +
$"返回固定的JSON数组格式({resFormat})"; $"问题列表 {criteriaBuilder} "
+$"返回固定的JSON数组格式({resFormat})";
var reqTokenCount = await moonshotClient.GetAsTiMateTokenCount(postMessages); var reqTokenCount = await moonshotClient.GetAsTiMateTokenCount(postMessages);
@ -112,15 +113,23 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
}; };
RedisExpand.SetTaskGPTReqCached(task, chatRep); RedisExpand.SetTaskGPTReqCached(task, chatRep);
var chatResp = await moonshotClient.Chat(chatRep); var chatResp = await moonshotClient.ChatSSE(chatRep);
RedisExpand.SetTaskGPTCached(task, chatResp); //chatResp = await moonshotClient.Chat(chatRep);
if (chatResp is null || chatResp.error != null) var chatResContent = chatResp?.res;
throw new Exception($"KIMI模型返回异常 Chat 返回参数: " +
$" {JsonSerializer.Serialize(chatResp)}");
var chatResContent = chatResp?.choices.FirstOrDefault()?.message.content.Trim();
chatResContent = chatResContent?.Replace("字幕内容", "课堂情况");
if (string.IsNullOrEmpty(chatResContent)) if (string.IsNullOrEmpty(chatResContent))
throw new Exception("KIMIGPT返回message无效结果"); throw new Exception("KIMIGPT返回message无效结果");
if(chatResp !=null)
RedisExpand.SetTaskGPTCached(task, new object[]{ chatResp.Value.res, chatResp.Value.u });
chatResContent = chatResContent?.Replace("字幕内容", "课堂情况");
chatResContent = chatResContent?.Replace("\n", "");
chatResContent = chatResContent?.Replace("}{", "},{");
chatResContent = chatResContent?.Replace("}|{", "},{");
chatResContent = chatResContent?.Trim();
if (!chatResContent.StartsWith("["))
chatResContent = "[" + chatResContent;
if (!chatResContent.EndsWith("]"))
chatResContent = chatResContent+ "]";
var questionRes = JsonSerializer.Deserialize<QuestionRes[]>(chatResContent); var questionRes = JsonSerializer.Deserialize<QuestionRes[]>(chatResContent);
var gptRes = new TaskRes(captions); var gptRes = new TaskRes(captions);
if (questionRes is null) if (questionRes is null)
@ -176,7 +185,7 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
foreach (var s in arr) foreach (var s in arr)
s.TimeBaseType = r; s.TimeBaseType = r;
} }
var totalTokens = chatResp?.usage.total_tokens ?? 0; var totalTokens = chatResp?.u.total_tokens ?? 0;
if (totalTokens > 1) if (totalTokens > 1)
{ {
var tid = long.Parse(task); var tid = long.Parse(task);

View File

@ -9,6 +9,9 @@ using System.Net.Http.Json;
using AntDesign; using AntDesign;
using OneOf.Types; using OneOf.Types;
using System.Net; using System.Net;
using Azure;
using System.Reflection.PortableExecutable;
using static System.Runtime.InteropServices.JavaScript.JSType;
/// <summary> /// <summary>
/// https://platform.moonshot.cn/docs/api-reference /// https://platform.moonshot.cn/docs/api-reference
@ -50,16 +53,76 @@ namespace VideoAnalysisCore.AICore.ChatGPT.KIMI
} }
/// <summary>
/// ChatSSE
/// </summary>
/// <param name="chatReq"></param>
/// <returns>Return HttpResponseMessage for SSE</returns>
public async Task<(Usage u, string res)?> ChatSSE(ChatReq chatReq)
{
chatReq.stream = true;
var requestBody = System.Text.Json.JsonSerializer.Serialize(chatReq);
var chatResp = await PostJsonStreamAsync("/v1/chat/completions", requestBody);
using var stream = await chatResp.Content.ReadAsStreamAsync();
using var reader = new StreamReader(stream, Encoding.UTF8);
string line;
StringBuilder messageBuilder = new StringBuilder();
ChatResSSE lastChat = new ChatResSSE();
while ((line = await reader.ReadLineAsync()) != null)
{
if (line.EndsWith("[DONE]"))
{
// 表示一条消息结束
string message = messageBuilder.ToString();
messageBuilder.Clear();
var u = lastChat?.choices?.FirstOrDefault()?.usage;
if (u == null || string.IsNullOrEmpty(message))
return null;
return (u, message);
}
else if (line.StartsWith("data:"))
{
try
{
var data = System.Text.Json.JsonSerializer.Deserialize<ChatResSSE>(line.Substring("data:".Length).Trim());
lastChat = data;
var str = data?.choices.FirstOrDefault()?.delta.content;
if (!string.IsNullOrEmpty(str))
messageBuilder.Append(str);
}
catch (Exception e)
{
Console.WriteLine("异常 ChatSSE=>" );
Console.WriteLine(line);
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
}
}
return null;
}
/// <summary> /// <summary>
/// Chat /// Chat
/// </summary> /// </summary>
/// <param name="chatReq"></param> /// <param name="chatReq"></param>
/// <returns>Return HttpResponseMessage for SSE</returns> /// <returns>Return HttpResponseMessage for SSE</returns>
public async Task<ChatRes?> Chat(ChatReq chatReq) public async Task<(Usage u, string res)?> Chat(ChatReq chatReq)
{ {
var requestBody = System.Text.Json.JsonSerializer.Serialize(chatReq); var requestBody = System.Text.Json.JsonSerializer.Serialize(chatReq);
var chatResp = await PostJsonStreamAsync("/v1/chat/completions", requestBody); var chatResp = await PostJsonStreamAsync("/v1/chat/completions", requestBody);
return await chatResp.Content.ReadFromJsonAsync<ChatRes>(); var res = await chatResp.Content.ReadFromJsonAsync<ChatRes>();
var chatResContent = res?.choices.FirstOrDefault()?.message.content.Trim();
if (res is null || res.error != null)
throw new Exception($"KIMI模型返回异常 Chat 返回参数: " +
$" {System.Text.Json.JsonSerializer.Serialize(res)}");
if (string.IsNullOrEmpty(chatResContent))
return null;
return (res.usage, chatResContent);
} }
/// <summary> /// <summary>

View File

@ -148,6 +148,19 @@
public string type { get; set; } = string.Empty; public string type { get; set; } = string.Empty;
} }
public class ChatResSSE
{
public string id { get; set; }
public int created { get; set; }
/// <summary>
/// 模型id
/// </summary>
public string model { get; set; }
/// <summary>
/// 对话
/// </summary>
public ChoiceSSE[] choices { get; set; }
}
public class ChatRes public class ChatRes
{ {
public ChatResError? error { get; set; } public ChatResError? error { get; set; }
@ -185,6 +198,16 @@
public int total_tokens { get; set; } public int total_tokens { get; set; }
} }
public class ChoiceSSE
{
public int index { get; set; }
public Message delta { get; set; }
public string finish_reason { get; set; }
/// <summary>
/// token使用情况
/// </summary>
public Usage usage { get; set; }
}
public class Choice public class Choice
{ {
public int index { get; set; } public int index { get; set; }

View File

@ -105,7 +105,7 @@ namespace VideoAnalysisCore.Common
/// <param name="taskId"></param> /// <param name="taskId"></param>
public static void SetTaskGPTCached(object taskId, object? data) public static void SetTaskGPTCached(object taskId, object? data)
{ {
Redis.Set(RedisExpandKey.TaskGPT(taskId), data, 3600 * 24); Redis.Set(RedisExpandKey.TaskGPT(taskId)+":Res_" + DateTime.Now.ToString("yyyy/MM/dd_HH/mm/ss"), data, 3600 * 24);
} }
public static void SetTaskGPTReqCached(object taskId, object? data) public static void SetTaskGPTReqCached(object taskId, object? data)
{ {

View File

@ -11,16 +11,16 @@ namespace VideoAnalysisCore.Enum
{ {
[Display(Prompt = "分析授课中使用的高频词" + [Display(Prompt = "分析授课中使用的高频词" +
"10个频率从高到低 结果类型[]")] "10个频率从高到低 :结果类型[]")]
= 5001, = 5001,
[Display(Prompt = "基于字幕内容精准的提取出课堂上全部的事件" + [Display(Prompt = "基于字幕内容精准的提取出课堂上全部的事件" +
",分析事件的时间片段提取事件的的内容概览,字幕开始秒,结束秒.作为返回结果.每个片段不低于120秒 结果类型[{Start:开始秒,End:结束秒,Content:概览}]")] ",分析事件的时间片段提取事件的的内容概览,字幕开始秒,结束秒.作为返回结果.每个片段不低于120秒 :结果类型[{Start:开始秒,End:结束秒,Content:概览}]")]
= 5002, = 5002,
[Display(Prompt = "统计授课中教师回答类型的次数 回答类型" + [Display(Prompt = "统计授课中教师回答类型的次数 回答类型" +
"[重复回答,老师追问,简单性表扬,老师补充答案,表扬并补充答案] 结果类型{回答类型:次数}")] "[重复回答,老师追问,简单性表扬,老师补充答案,表扬并补充答案] :结果类型{回答类型:次数}")]
= 5003, = 5003,
[Display(Prompt = " 分析授课中教师提到 以下类型" + [Display(Prompt = " 分析授课中教师提到 以下类型" +
"[独立学习,小组合作,随堂练习]的时间段,精准提取出其中字幕开始秒,结束秒 结果类型[{Start:开始秒(number),End:结束秒(number),Content:类型(string)}/null]")] "[独立学习,小组合作,随堂练习]的时间段,精准提取出其中字幕开始秒,结束秒 :结果类型[{Start:开始秒(number),End:结束秒(number),Content:类型(string)}/null]")]
= 5004, = 5004,
} }
} }