.Net9中通过HttpClient简单调用Ollama中的DeepSeek R1模型

news/2025/2/8 15:32:33/文章来源:https://www.cnblogs.com/qubernet/p/18704234

本文主要使用.Net9中的HttpClient组件,调用本地部署的Ollama提供的API接口,获取对应的问答信息。

1、🥇测试环境

  • VS2022;

  • .Net9控制台程序;

  • HttpClient组件;

  • 本地部署的Ollama环境

  • DeepSeek R1模型(deepseek-r1:1.5b)

关于本地部署的Ollama环境,可参见文章【通过Ollama本地部署DeepSeek R1以及简单使用的教程(超详细)】。


2、🥈创建控制台程序

我们使用VS2022创建一个基于.Net9的控制台程序,具体如下所示:

控制台程序

控制台程序

控制台程序

上述我们就创建好了一个控制台程序。


3、🥉Ollama接口

Ollama为我们提供了多种接口,最常用的接口为:

  • POST /api/generate

  • POST /api/chat

上述两个接口为最常用的,具体说明可参见【https://github.com/ollama/ollama/blob/main/docs/api.md】说明,如下所示为部分使用说明的截图:

Ollama接口

Ollama接口


4、🏅调用实现

4.1、🎀generate接口

我们在Program.cs文件中编写具体的代码。

具体代码实现如下所示(复制粘贴即可运行),都有对应的说明:

using System.Data;
using System.Text;
using System.Text.Json;// HttpClient实例
var httpClient = new HttpClient();// Ollama API请求地址
var requestUrl = "http://localhost:11434/api/generate";Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("请输入对话内容(输入exit退出):");while (true)
{// 读取输入的内容var input = Console.ReadLine();if (input != null && input.ToLower() == "exit"){Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine("程序即将退出...");// 退出循环,程序结束break;}// 请求参数var requestData = new{// 指定模型标识符model = "deepseek-r1:1.5b",// 输入的提示文本prompt = input,// 是否启用流式响应stream = true,// 其他选项options = new{// 控制生成随机性(0-1)temperature = 0.7,// 最大生成 token 数max_tokens = 500}};// 创建HttpRequestMessage实例以及设置请求内容using var request = new HttpRequestMessage(HttpMethod.Post, requestUrl);request.Content = new StringContent(JsonSerializer.Serialize(requestData), Encoding.UTF8, "application/json");// 发送请求并获取响应using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);await using var stream = await response.Content.ReadAsStreamAsync();using var reader = new StreamReader(stream);// 循环读取响应流while (!reader.EndOfStream){var content = await reader.ReadLineAsync();if (!string.IsNullOrEmpty(content)){var partialResponse = JsonSerializer.Deserialize<OllamaResponse>(content);// 输出响应内容Console.ForegroundColor = ConsoleColor.White;Console.Write(partialResponse?.response);}}Console.ForegroundColor = ConsoleColor.Green;Console.WriteLine("\r\n\r\n请输入对话内容(输入exit退出):");
}/// <summary>
/// Ollama API响应实体类
/// </summary>
public class OllamaResponse
{/// <summary>/// 模型标识符/// </summary>public string model { get; set; }/// <summary>/// 创建时间戳/// </summary>public string created_at { get; set; }/// <summary>/// 响应内容/// </summary>public string response { get; set; }/// <summary>/// 是否完成/// </summary>public bool done { get; set; }/// <summary>/// 完成原因/// </summary>public string done_reason { get; set; }public int[] context { get; set; }public long total_duration { get; set; }public long load_duration { get; set; }public int prompt_eval_count { get; set; }public long prompt_eval_duration { get; set; }public int eval_count { get; set; }public long eval_duration { get; set; }
}

运行效果:

运行效果

4.2、🎁chat接口

我们在Program.cs文件中编写具体的代码。

具体代码实现如下所示(复制粘贴即可运行),都有对应的说明:

using System.Data;
using System.Text;
using System.Text.Json;// HttpClient实例
var httpClient = new HttpClient();// Ollama API请求地址
var requestUrl = "http://localhost:11434/api/chat";Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("请输入对话内容(输入exit退出):");while (true)
{// 读取输入的内容var input = Console.ReadLine();if (input != null && input.ToLower() == "exit"){Console.ForegroundColor = ConsoleColor.Red;Console.WriteLine("程序即将退出...");// 退出循环,程序结束break;}// 请求参数var requestData = new{// 指定模型标识符model = "deepseek-r1:1.5b",// 输入的提示文本messages = new[]{new { role = "user", content = input }},// 是否启用流式响应stream = true,// 其他选项options = new{// 控制生成随机性(0-1)temperature = 0.7,// 最大生成 token 数max_tokens = 500}};// 创建HttpRequestMessage实例以及设置请求内容using var request = new HttpRequestMessage(HttpMethod.Post, requestUrl);request.Content = new StringContent(JsonSerializer.Serialize(requestData), Encoding.UTF8, "application/json");// 发送请求并获取响应using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);await using var stream = await response.Content.ReadAsStreamAsync();using var reader = new StreamReader(stream);// 循环读取响应流while (!reader.EndOfStream){var content = await reader.ReadLineAsync();if (!string.IsNullOrEmpty(content)){var partialResponse = JsonSerializer.Deserialize<OllamaResponse>(content);// 输出响应内容Console.ForegroundColor = ConsoleColor.White;Console.Write(partialResponse?.message.content);}}Console.ForegroundColor = ConsoleColor.Green;Console.WriteLine("\r\n\r\n请输入对话内容(输入exit退出):");
}/// <summary>
/// Ollama API响应实体类
/// </summary>
public class OllamaResponse
{/// <summary>/// 模型标识符/// </summary>public string model { get; set; }/// <summary>/// 创建时间戳/// </summary>public string created_at { get; set; }/// <summary>/// 响应内容/// </summary>public OllamaResponseMessage message { get; set; }/// <summary>/// 是否完成/// </summary>public bool done { get; set; }/// <summary>/// 完成原因/// </summary>public string done_reason { get; set; }public long total_duration { get; set; }public long load_duration { get; set; }public int prompt_eval_count { get; set; }public long prompt_eval_duration { get; set; }public int eval_count { get; set; }public long eval_duration { get; set; }
}/// <summary>
/// Ollama API响应实体类的message子类
/// </summary>
public class OllamaResponseMessage
{/// <summary>/// 角色/// </summary>public string role { get; set; }/// <summary>/// 内容/// </summary>public string content { get; set; }
}

运行效果:

运行效果


到此,通过.Net9的HttpClient简单调用Ollama的API就完成了。


5、🔖其他文章:

  • 通过Ollama本地部署DeepSeek R1以及简单使用的教程(超详细)

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

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

相关文章

变革管理的黄金法则:五大模型+工具,助你轻松应对项目管理挑战

变革模型与项目管理工具的结合运用可以形成一个系统化、高效化的变革管理体系。通过明确变革需求与目标、执行变革计划、评估与反馈以及持续优化改进等步骤,可以确保变革的顺利实施和成功落地。项目管理中的变革模型是指一系列指导和管理组织内部变革过程的框架和方法。这些模…

ollama部署本地模型的一些坑

1.ollama pull时进度回退:不知是否最近太多人下载导致服务器问题,下载大点的模型经常进度条往回退,解决方法就是每隔一会关闭进程重新下载,断点续传可以继续下载# 用法:python .\run.py 模型名字import subprocess import time import os import sys import signaldef run…

P5250 【深基17.例5】木材仓库(set)

由于题目保证木材的长度互不相同所以很自然的想到要用set op=1时 使用find函数查找length 如果it==s.end(),说明仓库里没有该长度的木材,应该insert 反之输出“Already Exist” op=2时 使用lower_bound 函数查找第一个大于等于length的木材,如果*it=length说明该仓库中有与…

海外泼天流量丨浅谈全球化技术架构

全球化是对技术架构的终极挑战,面临的不仅仅是技术的问题,而是包含了经济、文化等多因素差异的用户关系问题。积极借助遍布全球的云计算基础设施和云原生的架构设计原则,将能更加高效的构建高可用的全球化技术架构,支持全球业务的持续增长。作者:唐三、望宸,白玙、榆松、…

d2l-CV-微调

动手学深度学习-计算机视觉-微调微调(fine tuning)是计算机视觉中非常重要的一种技术。 微调的作用:让在大数据集上训练得到的模型,能够提高在小数据集上任务的精度(例如用ImageNet上训练的模型去识别热狗数据集) 微调是迁移学习(transfer learning)中的一种技术,将从 源数…

“爆款”批量生成,如何实现一键创作 AI 有声绘本?

有声读物作为备受欢迎的内容形式之一,已在教育、影视、文化及娱乐等多个领域广泛应用。本方案通过云原生应用开发平台 CAP、函数计算 FC 和百炼模型服务,实现了有声绘本读物的自动化创作,解决了传统制作中步骤繁琐、周期长和高技术门槛的问题,显著提高了创作效率。作者:寒…

数据可视化分析平台 DataEase

https://www.cnblogs.com/cmt/p/186550891Panel 联合会员已上线,立即了解元旦之后,我们和国内领先的开源软件公司飞致云达成了重要合作,合作分两部分,一是推广飞致云旗下的免费开源软件,一是双方合作推出联合会员。 飞致云旗下有多款免费开源软件,1月6日上线了第一个文字…

一文搞懂大模型备案全部内容

大模型备案对象 大模型备案主要面向开发、运营大模型的企业、机构等主体(官方要求是具备舆论属性和社会动员能力的产品,而大模型产品基本都符合这两点特征)。比如,像百度开发了文心一言这样的大模型,百度就属于大模型备案的目标群体。 大模型备案材料 主要材料如下: 1、大…

SeaTunnel数据同步(Oracle to mysql)

因为datax2023年9月以后就没有更新,所以想找个新的切活跃的etl开源工具。 apache SeaTunnel是一个非常易用、超高性能的分布式数据集成平台,支持实时海量数据同步。 每天可稳定高效同步数百亿数据,已被近百家企业应用于生产。 直接安装体验:export version="2.3.9&quo…

锚索测力计长期预应力 水电、铁路、公路、矿山、国防、建筑安全监测

锚索测力计长期预应力 水电、铁路、公路、矿山、国防、建筑安全监测精准稳定的振弦式传感器,GEO ACxxxx型振弦式锚索测力计,是长期监测预应力锚索压力的最佳选择。该传感器采用特制的应变计作为传感部件,无需温度修正,可提供准确可靠的测值。适用于预应力锚索的岩体或建筑物…

vs调试.net应用,一运行断点就无法命中,未加载任何符号

原因:没有加载pdb文件导致 解决:右键程序集 -> 属性 -> 生成 -> 常规 -> 调试符号 由"无"改为"PDB文件,可跨平台移植" 再次运行,断点正常命中

Java教程_002

final关键字 final 关键字是最终的意思,可以修饰(类、方法、变量) 修饰类:该类被称为最终类,特点是不能被继承了。 修饰方法:该方法被称为最终方法,特点是不能被重写了。 修饰变量:该变量只能被赋值一次。 final修饰的变量必须赋值,要么在定义时赋值,要么在构造器中赋…