.NET 项目中接入深度求索(DeepSeek)的 AI
摘要:本文详细介绍了在.NET项目中接入DeepSeek AI服务的完整流程。通过调用DeepSeek开放平台的REST API实现,使用System.Net.Http和System.Text.Json进行请求处理。文章包含从获取API Key、环境准备到完整代码实现的各个环节,重点说明了请求模型构建、JSON序列化配置、鉴权方式等核心内容,并提供了异常处理、多轮对话支持等实用技巧。同时给出了生产
·
.NET 项目中接入深度求索(DeepSeek)的 AI 能力,核心思路和接入豆包类似,都是通过调用其开放平台的 REST API 实现,只是 API 地址、鉴权方式和参数格式有差异。下面我为你提供一个完整、可直接运行的 .NET 示例,覆盖从环境准备到 API 调用的全流程。
前置准备
- 获取 API Key:前往 DeepSeek 开放平台 注册账号,创建应用并获取
API Key(DeepSeek 仅需 API Key 即可鉴权)。 - 环境要求:.NET Core 3.1 及以上版本(推荐 .NET 6/8),无需额外安装第三方库,使用官方
System.Net.Http和System.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();
}
}
}
关键代码解释
- 参数模型设计:DeepSeek 的 API 格式和 OpenAI 兼容,核心是
Messages列表(支持多轮对话),每个消息包含Role(角色)和Content(内容),这是和豆包 API 最主要的区别。 - JSON 序列化配置:设置
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,确保 .NET 类的 PascalCase 命名(如MaxTokens)能正确序列化为 API 要求的 camelCase(如maxTokens)。 - 鉴权方式:和豆包一致,都是在请求头中添加
Authorization: Bearer {API Key},无需额外的 Secret 签名。 - 异常处理:针对性捕获
401未授权异常,提示用户检查 API Key,更易排查问题。 - 多轮对话支持:只需在
Messages列表中按user→assistant→user的顺序添加历史消息即可,示例中已包含system角色(可选,用于定义助手行为)。
注意事项
- 模型选择:DeepSeek 支持多个模型,如
deepseek-chat(通用对话)、deepseek-coder-v2(代码专用)、deepseek-math(数学推理),可根据需求修改Model字段。 - API Key 安全:生产环境不要硬编码 API Key,建议通过
appsettings.json或环境变量读取,示例:csharp
运行
// ASP.NET Core 中读取配置 var deepSeekApiKey = builder.Configuration["DeepSeek:ApiKey"]; - 高并发优化:若在 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"); - 速率限制:DeepSeek 对 API 调用有频率 / 令牌限制,若超出会返回 429 异常,需在代码中添加重试逻辑(如使用
Polly库)。
总结
- .NET 接入 DeepSeek 的核心是调用其兼容 OpenAI 格式的 REST API,关键是构造正确的
Messages列表参数和配置 Bearer 鉴权。 - 需注意 JSON 序列化的命名规范(camelCase),以及模型名称、API 地址的正确性。
- 生产环境需做好 API Key 安全管理、HttpClient 复用和异常重试,保证调用稳定性。
更多推荐



所有评论(0)