.Net9中通過HttpClient簡單調用Ollama中的DeepSeek R1模型
本文主要使用.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】說明,如下所示為部分使用說明的截圖:


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就完成了。

浙公網安備 33010602011771號