当前位置:   article > 正文

Semantic Kernel 通过 LocalAI 集成本地模型_localai加载自定义模型

localai加载自定义模型

本文是基于 LLama 2是由Meta 开源的大语言模型,通过LocalAI 来集成LLama2 来演示Semantic kernel(简称SK) 和 本地大模型的集成示例。

SK 可以支持各种大模型,在官方示例中多是OpenAI 和 Azure OpenAI service 的GPT 3.5+。今天我们就来看一看如何把SK 和 本地部署的开源大模型集成起来。我们使用MIT协议的开源项目“LocalAI“:https://github.com/go-skynet/LocalAI。

LocalAI 是一个本地推理框架,提供了 RESTFul API,与 OpenAI API 规范兼容。它允许你在消费级硬件上本地或者在自有服务器上运行 LLM(和其他模型),支持与 ggml 格式兼容的多种模型家族。不需要 GPU。LocalAI 使用 C++ 绑定来优化速度。它基于用于音频转录的 llama.cpp、gpt4all、rwkv.cpp、ggml、whisper.cpp 和用于嵌入的 bert.cpp。

 

图片

可参考官方 Getting Started 进行部署,通过LocalAI我们将本地部署的大模型转换为OpenAI的格式,通过SK 的OpenAI 的Connector 访问,这里需要做的是把openai的Endpoint 指向 LocalAI,这个我们可以通过一个自定义的HttpClient来完成这项工作,例如下面的这个示例:

  1. internal class OpenAIHttpclientHandler : HttpClientHandler
  2. {
  3. private KernelSettings _kernelSettings;
  4. public OpenAIHttpclientHandler(KernelSettings settings)
  5. {
  6. this._kernelSettings = settings;
  7. }
  8. protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  9. {
  10. if (request.RequestUri.LocalPath == "/v1/chat/completions")
  11. {
  12. UriBuilder uriBuilder = new UriBuilder(request.RequestUri)
  13. {
  14. Scheme = this._kernelSettings.Scheme,
  15. Host = this._kernelSettings.Host,
  16. Port = this._kernelSettings.Port
  17. };
  18. request.RequestUri = uriBuilder.Uri;
  19. }
  20. return await base.SendAsync(request, cancellationToken);
  21. }
  22. }

上面我们做好了所有的准备工作,接下来就是要把所有的组件组装起来,让它们协同工作。因此打开Visual studio code 创建一个c# 项目sk-csharp-hello-world,其中Program.cs 内容如下:

  1. using System.Reflection;
  2. using config;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Logging;
  5. using Microsoft.SemanticKernel;
  6. using Microsoft.SemanticKernel.ChatCompletion;
  7. using Microsoft.SemanticKernel.Connectors.OpenAI;
  8. using Microsoft.SemanticKernel.PromptTemplates.Handlebars;
  9. using Plugins;
  10. var kernelSettings = KernelSettings.LoadSettings();
  11. var handler = new OpenAIHttpclientHandler(kernelSettings);
  12. IKernelBuilder builder = Kernel.CreateBuilder();
  13. builder.Services.AddLogging(c => c.SetMinimumLevel(LogLevel.Information).AddDebug());
  14. builder.AddChatCompletionService(kernelSettings,handler);
  15. builder.Plugins.AddFromType<LightPlugin>();
  16. Kernel kernel = builder.Build();
  17. // Load prompt from resource
  18. using StreamReader reader = new(Assembly.GetExecutingAssembly().GetManifestResourceStream("prompts.Chat.yaml")!);
  19. KernelFunction prompt = kernel.CreateFunctionFromPromptYaml(
  20. reader.ReadToEnd(),
  21. promptTemplateFactory: new HandlebarsPromptTemplateFactory()
  22. );
  23. // Create the chat history
  24. ChatHistory chatMessages = [];
  25. // Loop till we are cancelled
  26. while (true)
  27. {
  28. // Get user input
  29. System.Console.Write("User > ");
  30. chatMessages.AddUserMessage(Console.ReadLine()!);
  31. // Get the chat completions
  32. OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
  33. {
  34. };
  35. var result = kernel.InvokeStreamingAsync<StreamingChatMessageContent>(
  36. prompt,
  37. arguments: new KernelArguments(openAIPromptExecutionSettings) {
  38. { "messages", chatMessages }
  39. });
  40. // Print the chat completions
  41. ChatMessageContent? chatMessageContent = null;
  42. await foreach (var content in result)
  43. {
  44. System.Console.Write(content);
  45. if (chatMessageContent == null)
  46. {
  47. System.Console.Write("Assistant > ");
  48. chatMessageContent = new ChatMessageContent(
  49. content.Role ?? AuthorRole.Assistant,
  50. content.ModelId!,
  51. content.Content!,
  52. content.InnerContent,
  53. content.Encoding,
  54. content.Metadata);
  55. }
  56. else
  57. {
  58. chatMessageContent.Content += content;
  59. }
  60. }
  61. System.Console.WriteLine();
  62. chatMessages.Add(chatMessageContent!);
  63. }

首先,我们做的第一件事是导入一堆必要的命名空间,使一切正常(第 1 行到第 9 行)。

然后,我们创建一个内核构建器的实例(通过模式,而不是因为它是构造函数),这将有助于塑造我们的内核。

IKernelBuilder builder = Kernel.CreateBuilder();

你需要知道每时每刻都在发生什么吗?答案是肯定的!让我们在内核中添加一个日志。我们在第14行添加了日志的支持。

我们想使用Azure,OpenAI中使用Microsoft的AI模型,以及我们LocalAI 集成的本地大模型,我们可以将它们包含在我们的内核中。正如我们在15行看到的那样:

  1. internal static class ServiceCollectionExtensions
  2. {
  3. /// <summary>
  4. /// Adds a chat completion service to the list. It can be either an OpenAI or Azure OpenAI backend service.
  5. /// </summary>
  6. /// <param name="kernelBuilder"></param>
  7. /// <param name="kernelSettings"></param>
  8. /// <exception cref="ArgumentException"></exception>
  9. internal static IKernelBuilder AddChatCompletionService(this IKernelBuilder kernelBuilder, KernelSettings kernelSettings, HttpClientHandler handler)
  10. {
  11. switch (kernelSettings.ServiceType.ToUpperInvariant())
  12. {
  13. case ServiceTypes.AzureOpenAI:
  14. kernelBuilder = kernelBuilder.AddAzureOpenAIChatCompletion(kernelSettings.DeploymentId, endpoint: kernelSettings.Endpoint, apiKey: kernelSettings.ApiKey, serviceId: kernelSettings.ServiceId, kernelSettings.ModelId);
  15. break;
  16. case ServiceTypes.OpenAI:
  17. kernelBuilder = kernelBuilder.AddOpenAIChatCompletion(modelId: kernelSettings.ModelId, apiKey: kernelSettings.ApiKey, orgId: kernelSettings.OrgId, serviceId: kernelSettings.ServiceId);
  18. break;
  19. case ServiceTypes.HunyuanAI:
  20. kernelBuilder = kernelBuilder.AddOpenAIChatCompletion(modelId: kernelSettings.ModelId, apiKey: kernelSettings.ApiKey, httpClient: new HttpClient(handler));
  21. break;
  22. case ServiceTypes.LocalAI:
  23. kernelBuilder = kernelBuilder.AddOpenAIChatCompletion(modelId: kernelSettings.ModelId, apiKey: kernelSettings.ApiKey, httpClient: new HttpClient(handler));
  24. break;
  25. default:
  26. throw new ArgumentException($"Invalid service type value: {kernelSettings.ServiceType}");
  27. }
  28. return kernelBuilder;
  29. }
  30. }

接下来开启一个聊天循环,使用SK的流式传输 InvokeStreamingAsync,如第42行到46行代码所示,运行起来就可以体验下列的效果:

图片

本文示例源代码:https://github.com/geffzhang/sk-csharp-hello-world

参考文章:

  • Docker部署LocalAI 实现本地私有化 文本转语音(TTS) 语音转文本 GPT功能 | Mr.Pu 个站博客 (putianhui.cn)

  • LocalAI 自托管、社区驱动的本地 OpenAI API 兼容替代方案

引入地址 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/798767
推荐阅读
  

闽ICP备14008679号