编辑
2025-10-21
C#
00

目录

项目结构与主要类介绍
基本配置类
调用 AI 接口的核心方法
构建请求 Payload
设置请求头与序列化
调用接口并处理返回
配置文件示例
总结与扩展

下面这篇文章将带你一步步了解,如何通过 .NET 调用硅基流动(Siliconflow)或阿里云(Aliyun)的 AI 接口。示例代码中的主要实现包括请求数据结构定义、调用接口的逻辑以及处理返回值的方式。希望能帮助你更好地理解并掌握这一流程。


项目结构与主要类介绍

在代码中,我们可以看到如下几个关键的类和结构,它们共同完成了调用 AI 接口的需求:

  1. AIOptions

    这是一个配置类,用于加载并存储 AI 接口相关的配置信息。包含两大配置:

    • Siliconflow
    • Aliyun
  2. AiConfig

    管理每个 AI 提供商所需的基础信息(如 Url、ApiKey)和具体请求消息(ChatRequest)。

  3. ChatRequest

    用于封装请求给 AI 的信息,包括:

    • 使用的模型(model)
    • 消息内容(messages)
    • 是否流式返回(stream)
    • 各种可控参数(max_tokens、temperature、top_p 等)
    • ResponseFormat (决定返回对象的格式,如 JSON 等)
    • 可能使用的工具(tools) 等
  4. ChatMessage

    用于表示单条消息,目前常见字段有:

    • role:消息角色(通常有 system、user、assistant 等)
    • content:消息内容
  5. ResponseFormat

    用于指定响应格式,示例中只是表明使用 JSON 解析收到的返回数据。

  6. AiBasic

    用于存储最核心的接口访问路径(Url)和授权密钥(Api_key)。

  7. Tool / Function

    在部分扩展场景中会用到,用于定义函数或工具信息,与消息上下文结合使用,实现更灵活的功能调用。

此处需要注意的是,代码中示例只给出了固定的结构,可根据需要做进一步扩展,在多种业务场景下可以灵活组合。


基本配置类

C#
public class AIOptions : IConfigurableOptions { public AiConfig Siliconflow { get; set; } public AiConfig Aliyun { get; set; } } public class AiConfig { public AiBasic Config { get; set; } public ChatRequest Info { get; set; } } public class ChatMessage { public string role { get; set; } public string content { get; set; } } public class Function { public string description { get; set; } public string name { get; set; } public object parameters { get; set; } public bool strict { get; set; } } public class Tool { public string type { get; set; } public Function function { get; set; } } public class ResponseFormat { public string type { get; set; } } public class AiBasic { public string Url { get; set; } public string Api_key { get; set; } } public class ChatRequest { public string model { get; set; } public ChatMessage[] messages { get; set; } public bool stream { get; set; } public int? max_tokens { get; set; } public string[]? stop { get; set; } public double? temperature { get; set; } public double? top_p { get; set; } public int? top_k { get; set; } public double? frequency_penalty { get; set; } public int? n { get; set; } public ResponseFormat? response_format { get; set; } public Tool[]? tools { get; set; } }

调用 AI 接口的核心方法

代码中最关键的逻辑就是以下方法:

C#
/// <summary> /// 调用AI发送消息 /// </summary> /// <param name="prompt"></param> /// <returns></returns> public async Task<ChatCompletionResponse> AiSendMessage(string prompt) { // 构建请求payload var payload = _aIOptions.Aliyun.Info; payload.response_format = new ResponseFormat { type = "json_object" }; var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // 将用户实际请求贴到 messages 的 content 中 payload.messages[0].content = prompt; // 序列化payload var jsonContent = JsonSerializer.Serialize(payload, options); using (var client = new HttpClient()) { // 设置请求头 client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _aIOptions.Aliyun.Config.Api_key); // 创建StringContent,设置Content-Type var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); try { // 发送POST请求 var response = await client.PostAsync(_aIOptions.Aliyun.Config.Url, content); // 确保请求成功 response.EnsureSuccessStatusCode(); // 读取响应内容 var result = await response.Content.ReadAsStringAsync(); ChatCompletionResponse chatCompletionResponse = JsonSerializer.Deserialize<ChatCompletionResponse>(result); return chatCompletionResponse; } catch (HttpRequestException e) { // 根据业务需求处理异常 } return null; } }

构建请求 Payload

在请求开始前,需要将用户的输入内容(prompt)以及其他配置选项赋值到 payload(也就是 ChatRequest 对象)上。示例中将 prompt 的内容赋给了 payload.messages[0].content

设置请求头与序列化

创建 HttpClient 时,通过 client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _aIOptions.Aliyun.Config.Api_key) 添加了 Authorization 请求头,用于通过 Bearer Token 的方式来进行身份验证。

随后使用 JsonSerializerpayload 转成 StringContent 后,以 application/json 格式发送。

调用接口并处理返回

调用 PostAsync 方法发送请求后,通过 response.EnsureSuccessStatusCode() 确保没有发生错误(非 2xx 状态码将抛出异常)。然后将结果反序列化成我们定义的 ChatCompletionResponse,最终返回给调用方。如果出现异常,则根据业务场景进行相应处理。


配置文件示例

在文章尾部给出的 JSON 片段展示了 Furion 配置文件(可以是 appsettings.json 或者其他配置文件中)中的 AI 配置示例,也就是在 “AI” 节点下分别存放了给硅基流动和阿里云的请求信息。通过这种方式可以灵活地切换不同的 AI 供应商。

示例配置大致如下:

JSON
{ "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", "AI": { "Siliconflow": { "Config": { "url": "https://api.siliconflow.cn/v1/chat/completions", "api_key": "sk-xxxxxxxxxxxxxxxxxxxxxxxx" }, "Info": { "model": "Qwen/Qwen2.5-72B-Instruct-128K", "messages": [ { "role": "user", "content": "" } ], "stream": false } }, "Aliyun": { "Config": { "url": "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions", "api_key": "sk-yyyyyyyyyyyyyyyyyyyyyyyy" }, "Info": { "model": "qwen-plus", "messages": [ { "role": "user", "content": "" } ], "stream": false } } } }
  • url: 表示 AI 所在的 API 地址。
  • api_key: 访问该服务所需的密钥。
  • messages: 默认的消息数组,会在正式调用时覆盖具体的 content 内容。

通过 AIOptions 类,.NET 会将以上 JSON 配置信息映射到内存中,使我们能在代码中便捷地调取相应的信息。


总结与扩展

  1. 可自由切换供应商:由于把硅基流动(Siliconflow)和阿里(Aliyun)的配置封装在 AIOptions 中,我们可以在运行时任意切换需要调用的 AI 提供商。例如,改写 _aIOptions.Aliyun.Info_aIOptions.Siliconflow.Info 即可切换。
  2. 异常与安全:要根据业务需求做好异常捕获与安全策略,尤其是生产环境中需要做好超时、重试策略、Key 保护以及超出额度等限制的异常处理。
  3. 消息上下文:在某些场景下,你可能需要多轮对话,将上下文信息存储到 messages 数组中,让 AI 保持会话记忆。相应地,可以在调用前向 messages 数组中插入更多历史消息(如 assistant 的回复、使用过的 system 提示等),以实现更完善的上下文对话体验。
  4. 功能扩展:当使用工具或函数调用时(例如要让 AI 调用某个函数做进一步分析),可以借助 toolsFunction 字段,事先定义好函数的描述和入参,之后在上下文中提示 AI 有哪些可用函数,以及如何调用它们。

通过上述讲解,相信你已经了解了代码中各部分的功能与作用,以及如何结合配置文件来调用硅基流动或阿里的 AI 接口。你可以在此基础上做更深入的封装,以适配更广阔的业务场景,从而打造一个功能丰富又安全可靠的 .NET AI 调用方案。祝你开发顺利!

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!