赞
踩
很多情况都有这样的需求,使用自有系统数据训练大模型,然后在系统实际业务场景中使用AI大模型处理一些业务,那么SK正是你想要的。
Semantic Kernel (SK) is a lightweight SDK enabling integration of AI Large Language Models (LLMs) with conventional programming languages.
The SK extensible programming model combines natural language semantic functions, traditional code native functions, and embeddings-based memory unlocking new potential and adding value to applications with AI. https://github.com/microsoft/semantic-kernel
有道翻译:Semantic Kernel (语义内核,简称SK)是一个轻量级 SDK,支持将 AI 大型语言模型 (LLM) 与传统编程语言集成。SK 可扩展编程模型结合了自然语言语义函数、传统代码原生函数和基于嵌入的内存,释放了新的潜力并为 AI 应用程序增加了价值。
1、SK是微软研发的一个开源的,面向大模型的开发框架(SDK)
2、它支持你用不同开发语言,支持C#、Python、Java,基于 OpenAI API、Azure OpenAI API、Huggingface 开发大模型应用。
3、SK提供自定义插件、编排计划、信息存储至数据库(如SQLite、MongoDB、Redis、Postgres等)。
总之,SK可以将AI与你的业务紧密结合起来,在你的系统中加入大模型实现自定义功能。
新建.Net8WebApi项目,并且引入Nuget包
Microsoft.SemanticKernel
OllamaSharp
OllamaSharp是Ollama提供的一个.NET库,使得.NET开发者能够通过C#与Ollama API进行交互,轻松地将AI功能与业务系统进行整合。https://github.com/awaescher/OllamaSharp
新建一个Ollama的聊天模型类,继承自SK的IChatCompletionService
IChatCompletionService 是 SemanticKernel 库中的一个接口,它定义了一组方法用于与聊天模型交互,完成生成对话响应的任务。这个接口是 SemanticKernel 为了支持不同聊天服务提供商而设计的抽象层,允许用户灵活地切换后端模型,而不必修改应用的核心逻辑。在 SemanticKernel 中,你可以通过依赖注入(Dependency Injection, DI)获取实现了 IChatCompletionService 接口的具体服务实例,例如连接到 OpenAI 的 OpenAIChatCompletionService。这使得开发者能够轻易地在不同的聊天模型服务之间进行切换,比如从OpenAI切换到阿里云的DashScope服务,只要实现了相应的适配器并注册到DI容器中即可。
具体来说,IChatCompletionService 可能会包含如下方法:
public class OllamaChatCompletionService : IChatCompletionService//ITextGenerationService、ITextEmbeddingGenerationService { public IReadOnlyDictionary<string, object?> Attributes => throw new NotImplementedException(); public async Task<IReadOnlyList<ChatMessageContent>> GetChatMessageContentsAsync(ChatHistory chatHistory, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default) { var ollama = new OllamaApiClient("http://192.168.5.234:11434", "gemma:7b");//gemma:7b、llama3 var chat = new Chat(ollama, _ => { }); var lastMessage = chatHistory.LastOrDefault(); string question = lastMessage.Content; var history = (await chat.Send(question, CancellationToken.None)).ToArray(); var last = history.Last(); var chatResponse = last.Content; return new List<ChatMessageContent> { new ChatMessageContent(AuthorRole.Assistant, chatResponse) }; } public IAsyncEnumerable<StreamingChatMessageContent> GetStreamingChatMessageContentsAsync(ChatHistory chatHistory, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default) { throw new NotImplementedException(); } }
以上代码中的IP地址为Ollama的地址。
然后在Controller中调用大模型
[HttpGet]
public async Task<string> Ollama(string prompt)
{
var builder = Kernel.CreateBuilder();
builder.Services.AddKeyedSingleton<IChatCompletionService>("ollamaChat", new OllamaChatCompletionService());
var kernel = builder.Build();
var response = await kernel.InvokePromptAsync(prompt);
return response.GetValue<string>();
}
新建插件目录
翻译英文的配置:
config.json
{ "schema": 1, "type": "completion", "description": "把一个语言翻译成英文", //"completion": { // "max_tokens": 200,//限制生成文本的最大长度为200个token(token是自然语言处理中词语的基本单位,如单词或标点符号)。这意味着模型生成的回应不会超过这个长度。 // "temperature": 0.5,// 控制生成文本的随机性。值越低(接近0),生成的结果越保守、更可预测;值越高,则生成的文本越多样、随机。0.5是一个平衡值,既有一定的创造性又相对可控。 // "top_p": 0.0,// 这个参数与temperature一起使用控制采样过程,当top_p非零时,会按照概率分布选取最可能的tokens,直到累积概率达到top_p。设为0.0表示不使用该采样方法,而可能依赖于其他如温度的设置来决定生成策略。 // "presence_penalty": 0.0,// 对于已出现在生成文本中的词,增加其后续出现的惩罚分数。值大于0可以鼓励模型避免重复,保持文本多样性。这里设置为0意味着没有此惩罚。 // "frequency_penalty": 0.0,//类似于presence_penalty,但针对整个文本中词的频率。也是为了防止文本重复,值大于0时减少高频词的出现概率。此处同样设为0,不施加此惩罚。 //}, "input": { "parameters": [ { "name": "input", "description": "内容变成了英文", "defaultValue": "" } ] } }
skprompt.txt
将以下内容翻译成英文,仅返回翻译结果:
{{$input}}
调用插件
[HttpGet]
public async Task<IActionResult> Translate(string input, string language)
{
var builder = Kernel.CreateBuilder();
builder.Services.AddKeyedSingleton<IChatCompletionService>("ollamaChat", new OllamaChatCompletionService());
var kernel = builder.Build();
var pluginsDirectory = Path.Combine(AppContext.BaseDirectory, "plugins", "Translate");
var translatePlugin = kernel.ImportPluginFromPromptDirectory(pluginsDirectory);
var response = await kernel.InvokeAsync(translatePlugin[language], new() { ["input"] = input });
return Ok(response.GetValue<string>());
}
运行结果
AI生成部分
IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService分别用于实现聊天补全服务、文本生成服务和文本嵌入生成服务。Semantic Kernel是一个.NET库,旨在帮助开发者构建理解自然语言并能够进行智能对话的应用程序。
IChatCompletionService
ITextGenerationService
ITextEmbeddingGenerationService
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。