.NET 项目中接入深度求索(DeepSeek)的 AI 能力,核心思路和接入豆包类似,都是通过调用其开放平台的 REST API 实现,只是 API 地址、鉴权方式和参数格式有差异。下面我为你提供一个完整、可直接运行的 .NET 示例,覆盖从环境准备到 API 调用的全流程。

前置准备

  1. 获取 API Key:前往 DeepSeek 开放平台 注册账号,创建应用并获取 API Key(DeepSeek 仅需 API Key 即可鉴权)。
  2. 环境要求:.NET Core 3.1 及以上版本(推荐 .NET 6/8),无需额外安装第三方库,使用官方 System.Net.HttpSystem.Text.Json 即可。

完整实现代码

以下以 DeepSeek 通用对话模型(deepseek-chat)为例,提供控制台项目示例,核心逻辑可直接复用至 ASP.NET Core、WinForm 等项目:

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace DeepSeekDotNetDemo
{
    // DeepSeek API 请求模型(严格匹配官方格式)
    public class DeepSeekRequest
    {
        /// <summary>
        /// 模型名称(必填,如 deepseek-chat、deepseek-coder-v2 等)
        /// </summary>
        public string Model { get; set; } = "deepseek-chat";

        /// <summary>
        /// 对话消息列表(支持多轮对话)
        /// </summary>
        public List<DeepSeekMessage> Messages { get; set; } = new();

        /// <summary>
        /// 温度参数(0-1,值越高回答越随机)
        /// </summary>
        public float Temperature { get; set; } = 0.7f;

        /// <summary>
        /// 最大生成令牌数
        /// </summary>
        public int MaxTokens { get; set; } = 2048;
    }

    // 单条对话消息模型
    public class DeepSeekMessage
    {
        /// <summary>
        /// 角色(user=用户、assistant=助手、system=系统提示)
        /// </summary>
        public string Role { get; set; }

        /// <summary>
        /// 消息内容
        /// </summary>
        public string Content { get; set; }
    }

    // DeepSeek API 响应模型
    public class DeepSeekResponse
    {
        public string Id { get; set; }
        public string Object { get; set; }
        public long Created { get; set; }
        public string Model { get; set; }
        public List<DeepSeekChoice> Choices { get; set; } = new();
        public DeepSeekUsage Usage { get; set; }
    }

    public class DeepSeekChoice
    {
        public int Index { get; set; }
        public DeepSeekMessage Message { get; set; }
        public string FinishReason { get; set; }
    }

    public class DeepSeekUsage
    {
        public int PromptTokens { get; set; }
        public int CompletionTokens { get; set; }
        public int TotalTokens { get; set; }
    }

    class Program
    {
        // 替换为你自己的 DeepSeek API Key
        private const string DeepSeekApiKey = "你的DeepSeek API Key";
        // DeepSeek 官方 API 地址(固定,无需修改)
        private const string DeepSeekApiUrl = "https://api.deepseek.com/v1/chat/completions";

        static async Task Main(string[] args)
        {
            try
            {
                // 1. 创建 HttpClient(推荐复用,避免频繁创建)
                using var httpClient = new HttpClient();
                
                // 2. 设置鉴权和请求头(核心:Authorization 以 Bearer + API Key 格式)
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", DeepSeekApiKey);
                httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                // 3. 构造请求参数(支持多轮对话,示例为单轮)
                var requestData = new DeepSeekRequest
                {
                    Temperature = 0.5f,
                    MaxTokens = 2048,
                    Messages = new List<DeepSeekMessage>
                    {
                        // 可选:系统提示,定义助手行为
                        new DeepSeekMessage { Role = "system", Content = "你是一个精通.NET开发的资深工程师,回答简洁且实用" },
                        // 必选:用户提问
                        new DeepSeekMessage { Role = "user", Content = "用C#写一个异步读取文件的示例,并添加详细注释" }
                    }
                };

                // 4. 序列化请求参数为 JSON
                var jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
                var jsonContent = new StringContent(
                    JsonSerializer.Serialize(requestData, jsonOptions),
                    Encoding.UTF8,
                    "application/json");

                // 5. 发送 POST 请求
                var response = await httpClient.PostAsync(DeepSeekApiUrl, jsonContent);

                // 6. 验证响应状态(非200会抛出异常)
                response.EnsureSuccessStatusCode();

                // 7. 解析响应结果
                var responseJson = await response.Content.ReadAsStringAsync();
                var deepSeekResponse = JsonSerializer.Deserialize<DeepSeekResponse>(responseJson, jsonOptions);

                // 8. 输出结果
                if (deepSeekResponse?.Choices?.Count > 0)
                {
                    Console.WriteLine("=== DeepSeek 回答 ===");
                    Console.WriteLine(deepSeekResponse.Choices[0].Message.Content);
                    
                    // 可选:输出令牌使用情况
                    Console.WriteLine("\n=== 令牌使用情况 ===");
                    Console.WriteLine($"提问令牌:{deepSeekResponse.Usage.PromptTokens}");
                    Console.WriteLine($"回答令牌:{deepSeekResponse.Usage.CompletionTokens}");
                    Console.WriteLine($"总令牌:{deepSeekResponse.Usage.TotalTokens}");
                }
                else
                {
                    Console.WriteLine("未获取到有效回答");
                }
            }
            catch (HttpRequestException ex)
            {
                Console.WriteLine($"网络请求异常:{ex.Message}");
                // 若 API Key 错误,会返回 401/403,可在此处针对性处理
                if (ex.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                {
                    Console.WriteLine("提示:API Key 无效或已过期,请检查!");
                }
            }
            catch (JsonException ex)
            {
                Console.WriteLine($"JSON 解析异常:{ex.Message}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"未知异常:{ex.Message}");
            }

            Console.WriteLine("\n按任意键退出...");
            Console.ReadKey();
        }
    }
}

关键代码解释

  1. 参数模型设计:DeepSeek 的 API 格式和 OpenAI 兼容,核心是 Messages 列表(支持多轮对话),每个消息包含 Role(角色)和 Content(内容),这是和豆包 API 最主要的区别。
  2. JSON 序列化配置:设置 PropertyNamingPolicy = JsonNamingPolicy.CamelCase,确保 .NET 类的 PascalCase 命名(如 MaxTokens)能正确序列化为 API 要求的 camelCase(如 maxTokens)。
  3. 鉴权方式:和豆包一致,都是在请求头中添加 Authorization: Bearer {API Key},无需额外的 Secret 签名。
  4. 异常处理:针对性捕获 401 未授权异常,提示用户检查 API Key,更易排查问题。
  5. 多轮对话支持:只需在 Messages 列表中按 user→assistant→user 的顺序添加历史消息即可,示例中已包含 system 角色(可选,用于定义助手行为)。

注意事项

  1. 模型选择:DeepSeek 支持多个模型,如 deepseek-chat(通用对话)、deepseek-coder-v2(代码专用)、deepseek-math(数学推理),可根据需求修改 Model 字段。
  2. API Key 安全:生产环境不要硬编码 API Key,建议通过 appsettings.json 或环境变量读取,示例:

    csharp

    运行

    // ASP.NET Core 中读取配置
    var deepSeekApiKey = builder.Configuration["DeepSeek:ApiKey"];
    
  3. 高并发优化:若在 Web 项目中高频率调用,建议使用 IHttpClientFactory 创建 HttpClient,避免端口耗尽:
    // 在 Program.cs 中注册
    builder.Services.AddHttpClient("DeepSeekClient", client =>
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", deepSeekApiKey);
        client.BaseAddress = new Uri("https://api.deepseek.com/");
    });
    // 在控制器中注入
    private readonly IHttpClientFactory _httpClientFactory;
    public YourController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }
    // 使用时
    var client = _httpClientFactory.CreateClient("DeepSeekClient");
    
  4. 速率限制:DeepSeek 对 API 调用有频率 / 令牌限制,若超出会返回 429 异常,需在代码中添加重试逻辑(如使用 Polly 库)。

总结

  1. .NET 接入 DeepSeek 的核心是调用其兼容 OpenAI 格式的 REST API,关键是构造正确的 Messages 列表参数和配置 Bearer 鉴权。
  2. 需注意 JSON 序列化的命名规范(camelCase),以及模型名称、API 地址的正确性。
  3. 生产环境需做好 API Key 安全管理、HttpClient 复用和异常重试,保证调用稳定性。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐