当前,以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" );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;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/" ; 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); } }