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

.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、llama3var 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.mzph.cn/diannao/20437.shtml

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

相关文章

巨细巨细的白痴级vulntarget-a靶场wp再不会你打死我

ad一&#xff0c;靶场搭建 下载靶场&#xff1a;GitHub - crow821/vulntarget: vulntarget靶场系列 官方拓补图 ps&#xff1a;此处 攻击机ip192.168.87.134&#xff0c;win7ip1为192.168.87.144 下载完毕后直接装入虚拟机不要进去&#xff0c;不要进去&#xff0c;不要进去…

d3dcompiler43.dll丢失怎么修复,分享几种有效的修复教程

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;由于各种原因&#xff0c;电脑可能会出现一些问题&#xff0c;其中之一就是d3dcompiler43.dll文件丢失。这个文件是DirectX组件之一&#xff0c;用于编译和链接DirectX应用程序。当这个文件丢失时&#xff0c;可能会导…

网安面试。

SQL注入 sql注入原理 对用户输入的数据没有进行严格的过滤与判断&#xff0c;导致用户构造各种恶意 payload 拼接进后台数据库查询语句中执行。 sql的类型 联合注入 堆叠注入 宽字节注入 cookie注入 XFF头注入 UA注入&#xff08;user-agent注入&#xff09; Referer注…

AI大模型探索之路-实战篇12: 构建互动式Agent智能数据分析平台:实现多轮对话控制

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看)

文章目录 写在前面nnUNet是什么&#xff1f;一、配置虚拟环境二、安装nnUNet框架1.安装nnUNet这一步我遇到的两个问题&#xff1a; 2.安装隐藏层hiddenlayer&#xff08;可选&#xff09; 三、数据集准备nnUNet对于你要训练的数据是有严格要求的&#xff0c;这第一点就体现在我…

WEB攻防-JAVAWEB项目常见漏洞

知识点 1.JavaWeb常见安全及代码逻辑 2.目录遍历&身份验证&逻辑&JWT 3.访问控制&安全组件&越权&三方组件 本篇主要了解以上问题在javaweb中的呈现&#xff0c; 第一个重点理解URL与javaweb代码框架的对应方式&#xff0c;java在没有代码的情况下是很难…

PMP学习和考试难度分析

PMP&#xff08;项目管理专业人士&#xff09;考试目前是全球范围内比较具权威性和认可度的项目管理证书之一。因此PMP考试的难度是一个备受关注的话题。根据我们以往的学员经验我从不同角度解析PMP考试的难度&#xff0c;并提供一些应对挑战的建议。希望对大家有所帮助。 PMP考…

Ubuntu 安装好虚拟环境后,找不到workon 命令

1、安装虚拟环境 pip3 install virtualenv pip3 install virtualenvwrapper 2、安装完成后 workon 命令。 找不到workon 命令 执行&#xff0c;source virtualenvwrapper.sh 执行后&#xff0c;在使用workon命令&#xff0c;即可完成。

君耐策划有限公司员工信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;薪资管理&#xff0c;员工考勤管理 员工账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告管理&#xff0…

vivo鄢楠:基于OceanBase 的降本增效实践

在3 月 20 日的2024 OceanBase 数据库城市行中&#xff0c;vivo的 体系与流程 IT 部 DBA 组总监鄢楠就“vivo 基于 OceanBase 的降本增效实践”进行了主题演讲。本文为该演讲的精彩回顾。 vivo 在1995年于中国东莞成立&#xff0c;作为一家全球领先的移动互联网智能终端公司&am…

【智能算法】吸引-排斥优化算法(AROA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;K Cymerys受到自然界中吸引-排斥现象启发&#xff0c;提出了吸引-排斥优化算法&#xff08;Attraction–Repulsion Optimization Algorithm, AROA&#xff09;。 2.算法…

Python—面向对象小解(5)

一、多任务介绍 1.1 进程与线程 进程是操作系统分配资源的最小单元 线程执行程序的的最小单元 线程依赖进程&#xff0c;可以获取进程的资源 一个程序执行 先要创建进程分配资源&#xff0c;然后使用线程执行任务 默认情况下一个进程中有一个线程 1.2 多任务介绍 运行多个进程…

深入解析CRM客户关系系统:技术架构与功能实现的融合创新

CRM客户关系管理系统&#xff08;Customer Relationship Management System&#xff09;是一种以客户为中心的信息系统&#xff0c;旨在帮助企业更好地管理和维护客户关系&#xff0c;提高客户满意度和忠诚度&#xff0c;从而提升企业的市场竞争力。以下是CRM客户关系管理系统的…

电磁兼容整改时磁环怎么选型

电磁兼容整改时磁环怎么选型 磁环的选型错误磁环特性纳米微晶磁环磁环选型示例磁环选型 一条线缆两端都有设备&#xff0c;那磁环应该放在哪里&#xff1f; 我们怎么样来选择这个磁环&#xff0c;通过磁环的吸收作用&#xff0c;让辐射的强度和传导发射的这个强度衰减更大的那我…

Linux|虚拟机|Windows 11 家庭版的Hyper虚拟机服务开启

前言&#xff1a; Windows11的版本是比较多的&#xff0c;但有的时候笔记本预装的可能是家庭版&#xff0c;而家庭版的Windows通常是不支持虚拟机的&#xff0c;也就是说Hyper服务根本就看不到 Windows的程序和功能大体如下&#xff1a; &#x1f197;&#xff0c;那么如何开…

一、初识Qt 之 Hello world

一、初识Qt 之 Hello world 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 初识Qt 之 Hello world文章目录 一、Qt 简介二、Qt 获取安装三、Qt 初步使用四、Qt 之 Hello world1.新建一个项目 总结 一、Qt 简介 C &#xf…

数据库系统概论(超详解!!!)第十节 过程化SQL

1.Transact-SQL概述 SQL(Structure Query Language的简称&#xff0c;即结构化查询语言) 是被国际标准化组织(ISO)采纳的标准数据库语言&#xff0c;目前所有关系数据库管理系统都以SQL作为核心&#xff0c;在JAVA、VC、VB、Delphi等程序设计语言中也可使用SQL&#xff0c;它是…

利用元宇宙NFG+IPO线上营销,打造新商业模型

随着互联网技术的飞速发展&#xff0c;商业模式和创新方式层出不穷。特别是在移动电商和区块链技术的双重推动下&#xff0c;市场格局正在经历一场深刻的变革。然而&#xff0c;随着竞争加剧和监管收紧&#xff0c;如何构建一个既能吸引用户又能保持系统稳定的商业模型&#xf…

Chapter 5 Current Mirrors and Biasing Techniques

Chapter 5 Current Mirrors and Biasing Techniques 这一章介绍电流镜 5.1 Basic Current Mirrors MOS工作在饱和区, 表现为一个电流源. 考虑电源变化, PVT波动, 我们会首先产生一路精准电流源, 再复制这路电流. 如何复制呢? 电流转电压再转电流就行了, 如下图所示 考虑到…

传感器和变送器的区别介绍

从它的名称来看&#xff0c;传与感二字。传是指传输&#xff0c;感是指感知。实际上是先有感知&#xff0c;其次转换&#xff0c;最后传输。因此传输是目的&#xff0c;转换是手段&#xff0c;感知是基础。把能够将被测变量&#xff08;温度、压力、液位、流量&#xff09;感知…