四、.Net8对接Ollama实现文字翻译(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

news2024/11/15 21:15:13

.Net8+SemanticKernel+Ollama

        • 一、Semantic Kernel
          • 官方定义
          • SK能做什么?
        • 二、基本使用
          • 1、普通对话
          • 2、使用插件实现文本翻译功能
        • 三、IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService

很多情况都有这样的需求,使用自有系统数据训练大模型,然后在系统实际业务场景中使用AI大模型处理一些业务,那么SK正是你想要的。

一、Semantic Kernel
官方定义

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 应用程序增加了价值。

SK能做什么?

1、SK是微软研发的一个开源的,面向大模型的开发框架(SDK)
2、它支持你用不同开发语言,支持C#、Python、Java,基于 OpenAI API、Azure OpenAI API、Huggingface 开发大模型应用。
3、SK提供自定义插件、编排计划、信息存储至数据库(如SQLite、MongoDB、Redis、Postgres等)。

总之,SK可以将AI与你的业务紧密结合起来,在你的系统中加入大模型实现自定义功能。

二、基本使用
1、普通对话

新建.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>();
}
2、使用插件实现文本翻译功能

新建插件目录
在这里插入图片描述
翻译英文的配置:
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>());
}

运行结果
在这里插入图片描述

三、IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService

AI生成部分

IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService分别用于实现聊天补全服务、文本生成服务和文本嵌入生成服务。Semantic Kernel是一个.NET库,旨在帮助开发者构建理解自然语言并能够进行智能对话的应用程序。

IChatCompletionService
  • 定义与作用:IChatCompletionService接口在Semantic
    Kernel中负责处理聊天补全的服务。这意味着它可以帮助程序根据历史对话内容生成新的聊天消息,从而维持流畅的对话体验。
  • 实现方法:要实现这个接口,需要提供两个关键方法:GetChatMessageContentsAsync和GetStreamingChatMessageContentsAsync。这两个方法分别用于异步获取聊天消息内容和流式聊天消息内容。
  • 扩展性:通过实现IChatCompletionService接口,开发者可以集成不同的AI模型服务,如OpenAI、Azure
    OpenAI或阿里云的DashScope等,以提供更丰富的聊天功能。
  • 应用案例:例如,在实现一个支持DashScope的聊天服务时,开发者需要将Semantic
    Kernel的ChatHistory对象转换为DashScope可以理解的格式,并将DashScope返回的结果转换回Semantic
    Kernel期望的格式。
  • 技术挑战:实现此接口的挑战在于正确处理不同AI服务之间的数据格式转换,以及确保高效的异步通信和错误处理。
ITextGenerationService
  • 定义与作用:ITextGenerationService接口负责文本生成的任务。它可以生成给定提示下的文本内容,通常用于自动完成用户输入的句子或生成新的文本内容。
  • 实现方法:此接口的主要方法是GetTextContentAsync,它接收文本生成的相关设置和参数,然后返回生成的文本内容。
  • 区别:与IChatCompletionService相比,ITextGenerationService更侧重于单次文本生成而不是维持对话上下文。
  • 应用场景:可用于自动回复邮件、生成文章草稿或在客服系统中提供标准回答等场景。
    技术细节:在实现该接口时,需要注意模型的选择、参数配置以及如何处理生成文本的质量和多样性。
ITextEmbeddingGenerationService
  • 定义与作用:ITextEmbeddingGenerationService接口在Semantic
    Kernel中负责生成文本嵌入。文本嵌入是将文本内容转化为数值形式(通常是向量),以便机器学习模型能够处理。
  • 实现方法:尽管具体的接口方法未在搜索结果中明确列出,但通常包括生成嵌入的方法,接受文本作为输入并返回其嵌入表示。
  • 应用场景:文本嵌入广泛应用于自然语言处理任务中,如文本分类、聚类、相似度分析等。
  • 技术挑战:实现此接口的挑战在于选择合适的嵌入模型和算法,以及优化嵌入的性能和准确性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1712985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PS系统教学02

多个图片同时进行打开 在素材库里面选中两张图片&#xff0c;直接拖进PS软件中&#xff0c;此时会显示其中一张。当按下回车键会显示另一张。 当图层过多&#xff0c;需要进行选择&#xff0c;其中某一张图片&#xff0c;按住Ctrl键&#xff0c;进行选择点击&#xff0c;可以移…

Windows下切换不同版本的CUDA

在环境变量处将需要使用的CUDA版本的如图所框选的环境变量移到其他版本环境变量的前方即可 PS&#xff1a;改环境变量后重启命令行再查看版本~

【Jmeter】性能测试之压测脚本生成,也可以录制接口自动化测试场景

准备工作-10分中药录制HTTPS脚本&#xff0c;需配置证书 准备工作-10分中药 以https://www.baidu.com/这个地址为录制脚本的示例。 录制脚本前的准备工作当然是得先把Jmeter下载安装好、JDK环境配置好、打开Jmeter.bat&#xff0c;打开cmd&#xff0c;输入ipconfig&#xff0c;…

SpringMVC枚举类型字段处理

在日常的项目开发中经常会遇到一些取值范围固定的字段&#xff0c;例如性别、证件类型、会员等级等&#xff0c;此时我们可以利用枚举来最大程度减少字段的乱定义&#xff0c;统一管理枚举的值。 SpringMVC中对于枚举也有默认的处理策略&#xff1a; 对于RequestParam&#xf…

将金融文件转化为ASP.NET Core C#中的智能且安全的表单

在财务流程中&#xff0c;法律要求所有协议和合同均需有纸质副本。无论您使用的是移动数据采集前端、功能强大的文档查看器还是任何其他数据采集流程&#xff0c;最终结果都是经过数字签名的 PDF 或纸质副本。 在大流行期间&#xff0c;数字文档处理变得流行且必要。这些年来&…

高边坡监测常用的主要仪器设备

随着人类的发展&#xff0c;近几年由于人类生活生产的破坏&#xff0c;地球环境不断恶化。鉴于这一现象&#xff0c;监测行业也随之应运而生。常见的监测类型有&#xff1a;边坡监测&#xff0c;地灾监测&#xff0c;水库监测&#xff0c;大坝监测&#xff0c;矿山监测&#xf…

KineFX —— 简介

KineFX是绑定和动画的框架和工具集&#xff0c;可在SOP级别创建和编辑角色&#xff1b;可从头创建自己的KineFX角色&#xff0c;或使用特定的KineFX SOP和常规的SOP去编辑导入的角色和动画&#xff1b; 程序化绑定 KineFX构建与程序化绑定的原则上&#xff0c;可快速非破坏性迭…

Java基础入门day60

day60 购物车案例补充 设置欢迎页 打开也系统&#xff0c;就可以直接看到商品列表页面 之前曾经设置过欢迎页&#xff0c;都是针对页面&#xff0c;可以有html页面&#xff0c;也可以有jsp页面 但是今天我们将一个servlet设置成欢迎页 在web.xml文件中设置欢迎页 <welcome…

初探Flask:Pycharm社区版创建Flask项目

文章目录 一、创建工程二、引入Flask库1.使用命令行安装Flask2.在PyCharm中安装Flask 三、创建Flask框架基本文件四、运行项目 本文将带您一步步创建一个简单的Flask项目&#xff0c;包括设置Python环境、安装Flask库以及创建基本的项目结构。 一、创建工程 首先&#xff0c;确…

找到可靠的APP外包开发公司

找到可靠的APP外包开发公司需要经过一系列细致的筛选和评估。以下是寻找和选择一家合适的APP外包开发公司的步骤和注意事项。选择一家可靠的APP外包开发公司需要经过详细的研究和多方面的评估&#xff0c;确保公司能够满足项目需求并提供高质量的服务。北京木奇移动技术有限公司…

【乐吾乐3D可视化组态编辑器】灯光

灯光 在场景属性中&#xff0c;我们介绍了HDR&#xff0c;它的作用是为场景提供环境光&#xff0c;如果网格设置了PBR材质&#xff0c;那么网格表面就会反射出光照效果。这是为场景提供环境光的手段之一&#xff0c;但是它也有缺陷&#xff0c;一是只对PBR材质有效&#xff0c…

采用Java+ SpringBoot+ IntelliJ+idea开发的ADR药物不良反应监测系统源码

采用Java SpringBoot IntelliJidea开发的ADR药物不良反应监测系统源码 ADR药物不良反应监测系统有哪些应用场景&#xff1f; ADR药物不良反应监测系统有哪些应用场景&#xff1f; ADR药物不良反应监测系统具有广泛的应用场景&#xff0c;以下是一些主要的应用场景&#xff1a…

MT3048 区间按位或

思路&#xff1a; 使用ST表。ST表求区间最大值改为按位或即可。 ST模板可参考MT3024 maxmin 代码&#xff1a; 1.暴力6/10 #include <bits/stdc.h> using namespace std; const int N 2e5 10; const int M 5e5 10; int n, m; int num[N]; int main() {cin >&…

前端实习记录——git篇(公司拉取项目流程)

实习中第一步就是拉取项目&#xff0c;看项目代码&#xff0c;下面总结一下我在公司项目拉取项目流程。 1、联系leader开通gitlab账号 2、查看/配置git用户名和密码 &#xff08;1&#xff09;查看 git config user.name git config user.email git config user.password &…

8086 汇编笔记(二):寄存器(内存访问)

一、内存中字的存储 字单元的概念&#xff1a;字单元&#xff0c;即存放一个字型数据(16 位)的内存单元&#xff0c;由两个地址连续的内存单元组成 由上一章学习可知&#xff1a;高地址内存单元中存放字型数据的高位字节&#xff0c;低地址内存单元中存放字型数据的低位字节 …

【喜报】科大睿智多家服务企业上榜2024年第四批DCMM名单

近日&#xff0c;DCMM官方平台发布通知公告&#xff0c;根据《数据管理能力成熟度评估工作管理办法(暂行)》的有关规定&#xff0c;经单位自愿申请&#xff0c;评估机构评估、专家评审及公示&#xff0c;下列27单位获得数据管理能力成熟度等级证书。小编祝贺多家服务企业上榜20…

四川古力未来科技抖音小店畅享多重好处

在当今数字化浪潮席卷之下&#xff0c;四川古力未来科技抖音小店以其独特的魅力&#xff0c;正逐渐成为消费者们的新宠。作为融合了先进科技与便捷购物体验的创新平台&#xff0c;它不仅能够满足消费者的多样化需求&#xff0c;更在提升购物体验、优化服务流程等方面展现出了显…

【ubuntu20】--- 定时同步文件

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Linux命令】--- 多核压缩命令大全&…

openresty(Nginx) 隐藏 软件包名称 版本号 升级新版本

1 访问错误或者异常的URL 2 修改配置&#xff0c;重新编译&#xff0c;升级 #修改版本等 vim ./bundle/nginx-1.13.6/src/core/nginx.h #define nginx_version 1013006 #define NGINX_VERSION "1.13.6" #define NGINX_VER "openresty/&q…

第二证券炒股知识:买可转债的条件?

买可转债需要开通可转债的权限&#xff0c;其间开通可转债权限需要满意2年买卖经历10万元资产量”的准入要求。 在买卖可转债时&#xff0c;需要留意以下买卖规则&#xff1a; 1、可转债买卖时刻为买卖日的9:30-11:30,13:00-15:00&#xff0c;其间9:15-9:25&#xff0c;9:15-9…