From 7cb8f99e7ebc21fca4130328c2fa1b0fb07f836a Mon Sep 17 00:00:00 2001 From: zyxucp <286513187@qq.com> Date: Sat, 27 Apr 2024 23:03:46 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix=20=E5=A4=84=E7=90=86=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/AntSK.Domain/AntSK.Domain.xml | 2 +- .../Domain/Interface/IChatService.cs | 4 +- .../Domain/Service/ChatService.cs | 73 +++++++++-------- .../Domain/Service/KernelService.cs | 3 + src/AntSK/Pages/AppPage/AddApp.razor | 2 +- .../ChatPage/Components/ChatView.razor.cs | 37 ++++++--- .../Pages/Setting/AIModel/AddModel.razor | 7 +- src/AntSK/Services/OpenApi/OpenApiService.cs | 80 +++++++++---------- 8 files changed, 115 insertions(+), 93 deletions(-) diff --git a/src/AntSK.Domain/AntSK.Domain.xml b/src/AntSK.Domain/AntSK.Domain.xml index 362ee1c5..97f872cf 100644 --- a/src/AntSK.Domain/AntSK.Domain.xml +++ b/src/AntSK.Domain/AntSK.Domain.xml @@ -199,7 +199,7 @@ - + 发送消息 diff --git a/src/AntSK.Domain/Domain/Interface/IChatService.cs b/src/AntSK.Domain/Domain/Interface/IChatService.cs index f7be8895..1793a910 100644 --- a/src/AntSK.Domain/Domain/Interface/IChatService.cs +++ b/src/AntSK.Domain/Domain/Interface/IChatService.cs @@ -14,10 +14,10 @@ namespace AntSK.Domain.Domain.Interface { public interface IChatService { - IAsyncEnumerable SendChatByAppAsync(Apps app, string questions, ChatHistory history); + IAsyncEnumerable SendChatByAppAsync(Apps app, ChatHistory history); IAsyncEnumerable SendKmsByAppAsync(Apps app, string questions, ChatHistory history, string filePath, List relevantSources = null); Task SendImgByAppAsync(Apps app, string questions); - Task GetChatHistory(List MessageList); + Task GetChatHistory(List MessageList, ChatHistory history); } } \ No newline at end of file diff --git a/src/AntSK.Domain/Domain/Service/ChatService.cs b/src/AntSK.Domain/Domain/Service/ChatService.cs index 7771eb1e..7506c6db 100644 --- a/src/AntSK.Domain/Domain/Service/ChatService.cs +++ b/src/AntSK.Domain/Domain/Service/ChatService.cs @@ -10,6 +10,7 @@ using Markdig; using Microsoft.KernelMemory; using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.ChatCompletion; using Microsoft.SemanticKernel.Connectors.OpenAI; using System.Diagnostics; using System.Drawing; @@ -35,45 +36,54 @@ IAIModels_Repositories _aIModels_Repositories /// /// /// - public async IAsyncEnumerable SendChatByAppAsync(Apps app, string questions, ChatHistory history) + public async IAsyncEnumerable SendChatByAppAsync(Apps app, ChatHistory history) { - - if (string.IsNullOrEmpty(app.Prompt) || !app.Prompt.Contains("{{$input}}")) - { - //如果模板为空,给默认提示词 - app.Prompt = app.Prompt.ConvertToString() + "{{$input}}"; - } - KernelArguments args = new KernelArguments(); - if (history.Count > 10) - { - app.Prompt = @"${{ConversationSummaryPlugin.SummarizeConversation $history}}" + app.Prompt; - args = new() { - { "history", string.Join("\n", history.Select(x => x.Role + ": " + x.Content)) }, - { "input", questions } - }; - } - else - { - args = new() - { - { "input", $"{string.Join("\n", history.Select(x => x.Role + ": " + x.Content))}{Environment.NewLine} user:{questions}" } - }; - } - var _kernel = _kernelService.GetKernelByApp(app); + var chat = _kernel.GetRequiredService(); var temperature = app.Temperature / 100;//存的是0~100需要缩小 OpenAIPromptExecutionSettings settings = new() { Temperature = temperature }; + List completionList = new List(); if (!string.IsNullOrEmpty(app.ApiFunctionList) || !string.IsNullOrEmpty(app.NativeFunctionList))//这里还需要加上本地插件的 { _kernelService.ImportFunctionsByApp(app, _kernel); - settings.ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions; + settings.ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions; + while (true) + { + ChatMessageContent result = await chat.GetChatMessageContentAsync(history, settings, _kernel); + if (result.Content is not null) + { + string chunkCompletion = result.Content.ConvertToString(); + completionList.Add(chunkCompletion); + foreach (var content in completionList) + { + yield return content.ConvertToString(); + } + break; + } + + history.Add(result); + + IEnumerable functionCalls = FunctionCallContent.GetFunctionCalls(result); + if (!functionCalls.Any()) + { + break; + } + + foreach (var functionCall in functionCalls) + { + FunctionResultContent resultContent = await functionCall.InvokeAsync(_kernel); + + history.Add(resultContent.ToChatMessage()); + } + } } - var func = _kernel.CreateFunctionFromPrompt(app.Prompt, settings); - var chatResult = _kernel.InvokeStreamingAsync(function: func, - arguments: args); - await foreach (var content in chatResult) + else { - yield return content; + var chatResult = chat.GetStreamingChatMessageContentsAsync(history, settings, _kernel); + await foreach (var content in chatResult) + { + yield return content.ConvertToString(); + } } } @@ -318,9 +328,8 @@ public async Task SendImgByAppAsync(Apps app, string questions) } } - public async Task GetChatHistory(List MessageList) + public async Task GetChatHistory(List MessageList, ChatHistory history) { - ChatHistory history = new ChatHistory(); if (MessageList.Count > 1) { diff --git a/src/AntSK.Domain/Domain/Service/KernelService.cs b/src/AntSK.Domain/Domain/Service/KernelService.cs index 9130293f..c0a84e14 100644 --- a/src/AntSK.Domain/Domain/Service/KernelService.cs +++ b/src/AntSK.Domain/Domain/Service/KernelService.cs @@ -20,6 +20,8 @@ using DocumentFormat.OpenXml.Drawing; using Microsoft.KernelMemory; using OpenCvSharp.ML; +using LLamaSharp.SemanticKernel.ChatCompletion; +using Microsoft.SemanticKernel.ChatCompletion; namespace AntSK.Domain.Domain.Service { @@ -105,6 +107,7 @@ private void WithTextGenerationByAIType(IKernelBuilder builder,AIModels chatMode var (weights, parameters) = LLamaConfig.GetLLamaConfig(chatModel.ModelName); var ex = new StatelessExecutor(weights, parameters); builder.Services.AddKeyedSingleton("local-llama", new LLamaSharpTextCompletion(ex)); + builder.Services.AddKeyedSingleton("local-llama-chat", new LLamaSharpChatCompletion(ex)); break; case Model.Enum.AIType.SparkDesk: diff --git a/src/AntSK/Pages/AppPage/AddApp.razor b/src/AntSK/Pages/AppPage/AddApp.razor index 1195a8be..5b586c30 100644 --- a/src/AntSK/Pages/AppPage/AddApp.razor +++ b/src/AntSK/Pages/AppPage/AddApp.razor @@ -53,7 +53,7 @@ -