前面的 2 篇文章已经介绍了 ollama 的基本情况。我们也已经能在本地跟 LLM 进行聊天了。但是如何使用代码跟 LLM 进行交互呢?如果是 C# 选手那自然是使用 SK (SemanticKernel) 了。在这篇博客中,我们将探讨如何使用 Microsoft 的 SemanticKernel 框架对接 Ollama 的聊天服务。我们将通过一个简单的 C# 控制台应用程序来展示如何实现这一点。

前提条件

在本地安装 ollama 服务,并且安装至少一个模型,这次我们的模型是 llama3.1:8b。具体如何安装就不赘述了,请参考以往文章:

安装 SK 及 ollama connector

首先在本地创建一个 Console 项目,然后安装以下包:

dotnet add package Microsoft.SemanticKernel --version 1.21.1
dotnet add package Microsoft.SemanticKernel.Connectors.Ollama --version 1.21.1-alpha

注意:ollama connector 还是 alpha 版本,请勿用于生产

修改 Program 文件

添加命名空间

首先,我们需要引入一些必要的命名空间:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.Ollama;

配置 Ollama 服务

接下来,我们需要配置 Ollama 服务的端点和模型 ID ,并添加 Ollama 的聊天服务:

var endpoint = new Uri("http://localhost:11434");
var modelId = "llama3.1:8b"; var builder = Kernel.CreateBuilder();
#pragma warning disable SKEXP0070
builder.Services.AddScoped<IChatCompletionService>(_ => new OllamaChatCompletionService(modelId, endpoint));

注意:OllamaChatCompletionService 为实验性质所以我们需求手工关闭 SKEXP0070 的警告

获取聊天服务

var chatService = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
history.AddSystemMessage("This is a llama3 assistant ...");

聊天循环

最后,我们实现一个简单的聊天循环,读取用户输入并获取 Ollama 的回复:

while (true)
{
Console.Write("You:"); var input = Console.ReadLine(); if (string.IsNullOrWhiteSpace(input))
{
break;
} history.AddUserMessage(input); var contents = await chatService.GetChatMessageContentsAsync(history); foreach (var chatMessageContent in contents)
{
var content = chatMessageContent.Content;
Console.WriteLine($"Ollama: {content}");
history.AddMessage(chatMessageContent.Role, content ?? "");
}
}

试一下

让我们运行项目在 Console 中跟 ollama 进行对话吧。

总结

通过这篇博客,我们展示了如何使用 Microsoft 的 SemanticKernel 框架对接 Ollama 的聊天服务。希望这篇博客能帮助您更好地理解和使用这些工具。如果您有任何问题或建议,请随时在评论区留言。

关注我的公众号一起玩转技术

使用 SemanticKernel 对接 Ollma的更多相关文章

  1. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

  2. .NET 对接JAVA 使用Modulus,Exponent RSA 加密

    最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java  RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs. ...

  3. 通过AngularJS实现前端与后台的数据对接(一)——预备工作篇

    最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的 ...

  4. freeswitch对接其它SIP设备

    这几天用到freeswitch对接其它设备方面的知识,这里整理下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 一.freeswitch作为被叫 ...

  5. 萌新笔记——封装hiredis——C++与redis对接(一)(string的SET与GET操作)

    在菜鸟教程自学了redis,总想着像Mysql一样,在C/C++中进行对接.于是查询了一些资料,最后找到了hiredis.然而直接用它的话,难免有点不方便.于是,对其进行封装. hiredis直接去g ...

  6. spark 2.0 中 pyspark 对接 Ipython

    pyspark 2.0 对接 ipython 在安装spark2.0 后,以往的对接ipython方法失效,会报如下错错误: 因为在spark2.0后对接ipython的方法进行了变更我们只需要在py ...

  7. Web Api 与 Andriod 接口对接开发经验

    最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用Asp.Net Web Api去跟 Andriod 那端做接口对接工作,自己也是第一次接触Web ...

  8. 【工业串口和网络软件通讯平台(SuperIO)教程】八.SuperIO通讯机制与设备驱动对接的说明

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    通讯机制说明 通讯的总体机制采用呼叫应答方式,就是上位机软件主动发送请求数据命令,下位机终端接 ...

  9. 【原】iOS学习之文件管理器(NSFileManager)和文件对接器(NSFileHandle)

    1.文件管理器(NSFileManager) 1> 主要作用及功能方法 主要作用:此类主要是对文件进行的操作(创建/删除/改名等)以及文件信息的获取. 功能方法: 2> 创建文件夹 创建所 ...

  10. 对接第三方支付接口-获取http中的返回参数

    这几天对接第三方支付接口,在回调通知里获取返回参数,有一家返回的json格式,请求参数可以从标准输入流中获取. //1.解析参数 , 读取请求内容 BufferedReader br; String ...

随机推荐

  1. 处理英文中的单数复数 (pluralize, singular plural)

    因为英语很烂, 有时候很烦这个. 如果是 hard code 的情况, 如果我不清楚的话就会去这里找 https://www.wordhippo.com/what-is/the-plural-of/l ...

  2. Servlet——Request请求转发

    Request请求转发       特点:     

  3. ChatGPT转发工具-springboot

    背景 国内服务器无法访问openAI接口,我想过有两种实现方式 代理工具类似 tinyproxy.nginx 开发一个转发客户端(java.python都可以实现),提供一个api接口 源码 gith ...

  4. 课时04:了解HTTP网络协议

    什么是HTTP协议 HTTP(HyperText Transfer Protocol)叫超文本传输协议,它是web服务器和客户端直接进行数据传输的规则,是一个无状态的应用层协议. HTTP协议工作原理 ...

  5. 内核模块踩内存问题定位利器- hardware breakpoint

    内核由于共享内存地址空间,如果没有合适的工具,很多踩内存的问题即使复现,也无法快速定位: 在新的内核版本中引入了一个新工具hardware breakpoint,其能够监视对指定的地址的特定类型(读/ ...

  6. 深度学习卷积、全连接层、深度可分离层参数量和FLOPs计算公式

    来源 卷积: 输入尺寸  ,卷积核的大小为  * ,输出的尺寸大小为  参数量 (1)不考虑bias:(2)考虑bias: FLOPs (1)不考虑bias 解释:先计算输出的中一个元素需要的计算量, ...

  7. 7-11 leetcode 2612

    请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠这么多毫秒.要求此函数可以解析任何值. ps: promise 期约函数 (异步函数)的使用 ,promise 是一个对象  new ...

  8. Vue3 和 Vue2 的区别 ?

    1. Vue3 和 VUe2 性能提升 :使用 proxy 代替 defainProperty 实现响应式数据 :使用 ts 书写代码 : 新特性有:组合 api compositionApi  :新 ...

  9. C++ 命令行传参 参数使用 坐标参数的转换

    目录 1. 什么是命令行传参 2. 如何传参 3. 应用实例 4. 问题 1. 什么是命令行传参 命令行传参就是在 cmd 命令提示符, 或者 Linux shell 中使用可执行程序时, 可以添加 ...

  10. nginx记录日志时记录服务器响应的内容

    目前的 nginx 是不支持输出 response 报文体的 使用body_filter_by_lua来分配请求报文体给一个nginx变量.下面是一个示例 worker_processes 1; er ...