在C#程序中调用大模型的API

当前,以ChatGPT、DeepSeek为代表的各种大语言模型层出不穷,让我们切实感受到人工智能的强大。如果能在程序中集成大语言模型的问答能力,那么将能实现一些非常有用和非常有趣的需求。

本文简单介绍在C#应用中调用大模型接口的几种常用方法。

使用HttpClient访问

这是最底层的方式,其它方式都是对它的进一步封装,了解这种方式有利于我们了解大模型接口调用的底层原理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

var apiKey = "XXX";
const string baseUrl = "https://api.deepseek.com/v1/";
const string model = "deepseek-chat";

using var httpClient = new HttpClient() {
Timeout = TimeSpan.FromSeconds(600)
};
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

// 构建请求体
var requestBody = new {
model = model,
messages = new[]
{
new
{
role = "system",
content = @"你是一个严格的中英互译工具,仅执行翻译任务,不做任何额外解释、拓展或对话。
规则:
1. 自动识别用户输入的语言(中文/英文);
2. 仅将内容翻译成另一种语言,输出纯翻译结果,无其他文字;
3. 严格遵守以上规则,不偏离翻译任务。"
},
new
{
role = "user",
content = "人工智能是什么?它能做哪些好玩的事情?"
}
},
temperature = 0.1, // 降低随机性
max_tokens = 1000,
stream = false
};

var jsonContent = JsonSerializer.Serialize(requestBody);
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

// 发送POST请求
var response = await httpClient.PostAsync($"{baseUrl}/chat/completions", content);
response.EnsureSuccessStatusCode();

// 读取响应
var responseBody = await response.Content.ReadAsStringAsync();

// 解析响应
using var doc = JsonDocument.Parse(responseBody);
var root = doc.RootElement;

// 提取AI回复内容
if (root.TryGetProperty("choices", out var choices) && choices.GetArrayLength() > 0) {
var firstChoice = choices[0];
if (firstChoice.TryGetProperty("message", out var message) &&
message.TryGetProperty("content", out var aiContent)) {
Console.WriteLine("AI回复:");
Console.WriteLine(aiContent.GetString());
Console.WriteLine();
}
}

// 显示使用统计
if (root.TryGetProperty("usage", out var usage)) {
Console.WriteLine("使用统计:");
Console.WriteLine($" 提示词令牌数: {usage.GetProperty("prompt_tokens").GetInt32()}");
Console.WriteLine($" 完成令牌数: {usage.GetProperty("completion_tokens").GetInt32()}");
Console.WriteLine($" 总令牌数: {usage.GetProperty("total_tokens").GetInt32()}");
}

使用OpenAPI包访问

第一种方式是先创建OpenAI通用客户端,然后转成聊天客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static async Task Main(string[] args) {
var apiKey = "XXX";
var credential = new ApiKeyCredential(apiKey);
var options = new OpenAIClientOptions {
Endpoint = new Uri("https://api.deepseek.com/v1/")
};
var client = new OpenAIClient(credential, options);
var chatClient = client.GetChatClient("deepseek-chat");

ChatMessage[] messages = [
ChatMessage.CreateSystemMessage("你是一个中英翻译家,请自动识别用户说给的语言,并将其翻译成另外一种语言。"),
ChatMessage.CreateUserMessage("人工智能是什么?它能做哪些好玩的事情?")
];
var response = await chatClient.CompleteChatAsync(messages);
Console.WriteLine(response.Value.Content.FirstOrDefault()?.Text);
}

第二种方式是直接创建OpenAI聊天客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static async Task Main(string[] args) {
var apiKey = "XXX";
var credential = new ApiKeyCredential(apiKey);
var options = new OpenAIClientOptions {
Endpoint = new Uri("https://api.deepseek.com/v1/")
};
var client = new ChatClient("deepseek-chat", credential, options);

ChatMessage[] messages = [
ChatMessage.CreateSystemMessage("你是一个中英翻译家,请自动识别用户说给的语言,并将其翻译成另外一种语言。"),
ChatMessage.CreateUserMessage("人工智能是什么?它能做哪些好玩的事情?")
];
var response = await client.CompleteChatAsync(messages);
Console.WriteLine(response.Value.Content.FirstOrDefault()?.Text);
}

使用微软定制库访问

微软的Microsoft.Extensions.AI.OpenAI库是基于OpenAI库实现的,提供统一方式访问OpenAI兼容的大模型,非常方便。且提供了强大的与.NET集成的能力,在.NET工程中可作为第一选择。

在Ollama上部署的大模型也支持OpenAI方式访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static async Task Main(string[] args) {
var model = "deepseek-chat";
var apiKey = "XXX";
var baseUrl = "https://api.deepseek.com/v1/";

// 可以访问Ollama部署的大模型
// var model = "deepseek-r1:14b";
// var apiKey = "ollama";
// var baseUrl = "XXX";

IChatClient client =
new OpenAI.Chat.ChatClient(model, new ApiKeyCredential(apiKey),
new OpenAI.OpenAIClientOptions() { Endpoint = new Uri(baseUrl) }).AsIChatClient();

ChatMessage[] messages = [
new(ChatRole.System,"你是一个中英翻译家,请自动识别用户说给的语言,并将其翻译成另外一种语言。"),
new(ChatRole.User, "人工智能是什么?它能做哪些好玩的事情?")
];
var chatResponse = client.GetStreamingResponseAsync(messages);
await foreach (var update in chatResponse) {
Console.Write(update.Text);
}
}

(转载本站文章请注明作者和出处lihaohello.top,请勿用于任何商业用途)

评论