**@版权声明:本文为版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
本文链接https://www.jianshu.com/p/b726fc1d9ef4?v=1749609215620
如有问题, 可邮件(yumxuanyi@qq.com)咨询。**
关键字:Ollama、LLM、C# 、Qwen3
1. 安装Ollama
Ollama是一个支持在Windows、Linux和MacOS上本地运行大语言模型的工具。它允许用户非常方便地运行和使用各种大语言模型,比如Qwen模型等。用户只需一行命令就可以启动模型。
从下面路径下载并安装Ollama:
Download Ollama on Windows
2. 部署本地大模型(Qwen3-1.7B)
2.1 下载大模型gguf文件
Qwen3-1.7B下载页面
打开下载页面,下载Qwen3-1.7B-BF16.gguf文件。
2.2 配置模型ModelFile文件
"在模型gguf下载页面,同时会提供parameters文件和template文件,这两个文件为模型参数文件和对话模板,在创建大模型之前需要将这些文件内容写入配置文件,否则模型会胡乱回答问题"
创建Qwen3-1.7B-BF16.txt文件文件,在文件中输入
# 配置gguf路径
FROM ./Qwen3-1.7B-BF16.gguf
#下面配置模型参数
parameter 参数名 参数值 # 参数名和参数值为parameters文件中提供的参数
parameter 参数名 参数值 # 参数名和参数值为parameters文件中提供的参数
...
parameter 参数名 参数值 # 参数名和参数值为parameters文件中提供的参数
# 下面两个参数也是parameters中提供的,只是用,分割的,这里将其分多条配置
parameter stop "<|im_start|>"
parameter stop "<|im_end|>"
#下面配置模型模板
TEMPLATE '""" 这里粘贴template文件中提供的内容 """
注:如果gguf下载页面提供了parameters和temlate文件那么必须在modelfile中配置,否则模型会胡乱回答问题
2.3 将模型gguf文件和ModelFile文件放入同一个文件夹
2.4 根据ModelFile文件创建Qwen3-1.7B-BF16模型
在cmd中,cd到模型所在的文件夹,或者在在资源管理器中浏览到模型所在的文件夹,在对话框中输入cmd,打开命令提示符窗口。
输入"Ollama create -f Qwen3-1.7B-BF16 Qwen3-1.7B-BF16"
注:倒数第二个Qwen3-1.7B-BF16为构件后模型的名称
注:最后一个Qwen3-1.7B-BF16为modelFile的名称
通过Ollama Crete命令我们就根据模型文件创建了模型
3. C#中连接模型
3.1 创建C# Windows控制台应用程序
3.2 安装依耐包
使用Visual Studio NuGet程序包管理器控制台安装依耐包。在Visual Studio菜单栏依次点击“工具”-“NuGet包管理器”-“程序包管理器控制台”,在包管理器命令行依次输入以下命令,安装这些依耐包
包路径和命令如下:
-
NuGet Gallery | Microsoft.Extensions.AI 9.6.0
NuGet\Install-package Microsoft.Extensions.AI -Version9.6.0 -
NuGet Gallery | Microsoft.Extensions.AI.Abstractions 9.6.0
NuGet\Install-package Microsoft.Extensions.AI.Abstractions -Version9.6.0 -
NuGet Gallery | OllamaSharp 5.2.2
NuGet\Install-package OllamaSharp -Version 5.2.2
3.3 编写实时聊天程序
using Microsoft.Extensions.AI;
using OllamaSharp;
var uri = new Uri("http//localhost:11434");
IChatClient client = new OllamaApiClient(uri,"Qwen3-1.7B-BF16");
client = ChatClientBuilderChatClientExtensions.AsBuilder(client).UseFuntionInvocation().Build();
List<ChatMessage> chatHistory = new List<ChatMessage>();
while(true)
{
Console("问题:");
//从控制台读取用户输入作为问题,创建一条ChatMessage,ChatRole.User表示LLM中用户的输入
chatHistory.Add(new ChatMessage(ChatRole.User,Console.ReadLine()));
//1. 使用client.GetStreamingResponseAsync(charHistory)会从大模型中返回模型回答信息,但是是以多段给出,所以模型输出一段就在控制太打印一段,最后同一添加到updates中
//2. 由于模型不能记忆上次回答的内容,这里将历史回答和当前问题的集合作为参数传给大模型,可以让模型回答本次问题前了解之前的内容
List<ChatResponseUpdate> updates = new List<ChatResponseUpdate>();
await foreach(ChatResponseUpdate update in client.GetStreamingResponseAsync(chatHistory))
{
Console.Write(update);
updates.Add(update);
}
Console.WirteLine();
chatHistory.AddMessages(updates);
}