Ollama系列教程(八):semantic kernel调用ollama接口

我是对本地大模型有执念的!因为它安全性好,数据完全被自己掌控。在前面的内容里面分享了如何使用OllamaSharp访问ollama接口,今天分享如何使用Semantic Kernel来访问ollama接口。

关于Semantic Kernel

Semantic Kernel(SK) 是一款模型无关的SDK,能够帮助开发者快速构建、编排和部署AI代理及多代理系统。无论是开发简单的聊天机器人,还是构建复杂的多代理工作流,该工具都能以企业级的可靠性和灵活性提供所需支持。

地址:github.com/microsoft/s...

为什么使用SK?

我们可以直接使用类似OllamaSharp这样的SDK来调用某个大模型的接口,但是如果我们即要访问Ollama里面的模型,又要访问OpenAI的接口,还要兼容DeepSeek的接口,这个时候就需要一个集成开发框架了。在.net平台,最好用且功能最全的,目前只有SK(如果还有其它框架请不吝赐教)。

使用SK

首先要添加框架引用:

csharp 复制代码
	dotnet add package Microsoft.SemanticKernel

由于我们要访问Ollama,因此还需要添加SK的Ollama连接器:

csharp 复制代码
	dotnet add package Microsoft.SemanticKernel.Connectors.Ollama

注意:为了避免编码时收到SKEXP0070、SKEXP0010这种错误,我们先在项目里面把他们屏蔽掉。

markdown 复制代码
	<PropertyGroup>

	    ......

		<NoWarn>$(NoWarn);SKEXP0001,SKEXP0010,SKEXP0070</NoWarn>

	</PropertyGroup>

	 

初始化SK

ini 复制代码
	var endpoint = new Uri("http://localhost:11434");

	var ollama = new OllamaApiClient(endpoint);

	 

	// Create a kernel builder

	var builder = Kernel.CreateBuilder().AddOllamaChatCompletion(ollama);

	 

	// Build the kernel

	Kernel kernel = builder.Build();

添加和使用插件

我们可以把sk里面的插件理解成function calling里面的function,本质上都是大预言模型里面的tools节点

ini 复制代码
	kernel.Plugins.AddFromType<DateTimePlugin>("DateTimePlugin");

	 

	var executionSettings = new OllamaPromptExecutionSettings()

	{

	    FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),

	};

代码说明:

  1. 添加插件,插件定义见下文
  2. 设置插件的执行方式,我们采用自动选择和执行插件

Plugin的定义

csharp 复制代码
	internal class DateTimePlugin

	{

	    [KernelFunction("get_current_datetime")]

	    [Description("Get current datetime and day of week")]

	    public Task<string> GetCurrentDateTime()

	    {

	        return Task.FromResult(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ddd"));

	    }

	}

创建对话

markdown 复制代码
	var chatService = kernel.GetRequiredService<IChatCompletionService>();

	 

	Console.WriteLine();

	Console.WriteLine($"Chat with {ollama.SelectedModel}");

	 

	var systemPrompt = "You are a helpful assistant that knows about AI.";

	var chatHistory = new ChatHistory(systemPrompt);

	Console.WriteLine($">>System: {systemPrompt}");

	 

	while (true)

	{

	    Console.Write(">>User: ");

	    var message = Console.ReadLine();

	 

	    chatHistory.AddUserMessage(message);

	    Console.Write(">>Assistant: ");

	 

	    var reply = await chatService.GetChatMessageContentAsync(chatHistory,

	        executionSettings: executionSettings,

	        kernel: kernel);

	    Console.WriteLine(reply);

	 

	    // Add the message from the agent to the chat history

	    chatHistory.AddMessage(reply.Role, reply.Content ?? string.Empty);

	}

	 

代码说明:

  1. 首先在这段代码中创建一个chatService,用来和大模型进行对话
  2. systemPrompt是我们预设的大模型系统级别指令,通过systemPrompt可以更好的控制大模型的输出
  3. chatHistory用来存储会话历史
  4. while循环中进行对话,同时将user和assistant的对话内容临时存储在chatHistory

总结

以上就是今天分享的全部内容,主要介绍如何使用semantic kernel,并通过sk来访问ollama提供的大模型服务。

原文地址:https://www.cnblogs.com/youring2/p/18813889

相关推荐
1点东西1 天前
做了近两年的Agent开发,其实真正要学的就是这五件事
llm·agent·ai编程
程序猿编码1 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
duyacode1 天前
FastAPI为什么成为默认答案
程序员
Java_AI工程师1 天前
90%的人写Function Calling,只写了"把参数传给工具执行"这一步,剩下的参数校验、错误重试、超时控制、结果格式化,全是空白。
java·人工智能·程序员
Hilaku1 天前
为什么死磕 1px 的团队,用户体验反而更差?
前端·javascript·程序员
小林ixn1 天前
从 LangChain 到 LangGraph:用「网状工作流」解锁多 Agent 协作的正确姿势
langchain·llm·agent
武子康1 天前
自己做一个 Mini Reviewer:让 AI 审到本次准备提交的代码
人工智能·llm·agent
CODER03041 天前
ubuntu22.04部署完整deepseek局域网web服务全过程(RTX5090安装黑屏+web端多人并发)
pytorch·webui·ubuntu22.04·ollama·deepseek·rtx5090·自然语言模型
codigger1 天前
我用 AI 做完整项目后,总结出一套把需求钉死的工作流
ai·程序员·编程·ai编程·#人工智能
SimonKing1 天前
SpringBoot 集成 SSE 实现服务端推送或可代替Websocket
java·后端·程序员