下面这篇文章将带你一步步了解,如何通过 .NET 调用硅基流动(Siliconflow)或阿里云(Aliyun)的 AI 接口。示例代码中的主要实现包括请求数据结构定义、调用接口的逻辑以及处理返回值的方式。希望能帮助你更好地理解并掌握这一流程。
在代码中,我们可以看到如下几个关键的类和结构,它们共同完成了调用 AI 接口的需求:
AIOptions
这是一个配置类,用于加载并存储 AI 接口相关的配置信息。包含两大配置:
AiConfig
管理每个 AI 提供商所需的基础信息(如 Url、ApiKey)和具体请求消息(ChatRequest)。
ChatRequest
用于封装请求给 AI 的信息,包括:
ChatMessage
用于表示单条消息,目前常见字段有:
ResponseFormat
用于指定响应格式,示例中只是表明使用 JSON 解析收到的返回数据。
AiBasic
用于存储最核心的接口访问路径(Url)和授权密钥(Api_key)。
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; }
}
代码中最关键的逻辑就是以下方法:
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;
}
}
在请求开始前,需要将用户的输入内容(prompt)以及其他配置选项赋值到 payload
(也就是 ChatRequest
对象)上。示例中将 prompt
的内容赋给了 payload.messages[0].content
。
创建 HttpClient
时,通过 client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _aIOptions.Aliyun.Config.Api_key)
添加了 Authorization
请求头,用于通过 Bearer Token 的方式来进行身份验证。
随后使用 JsonSerializer
将 payload
转成 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 配置信息映射到内存中,使我们能在代码中便捷地调取相应的信息。
AIOptions
中,我们可以在运行时任意切换需要调用的 AI 提供商。例如,改写 _aIOptions.Aliyun.Info
为 _aIOptions.Siliconflow.Info
即可切换。messages
数组中,让 AI 保持会话记忆。相应地,可以在调用前向 messages
数组中插入更多历史消息(如 assistant 的回复、使用过的 system 提示等),以实现更完善的上下文对话体验。tools
、Function
字段,事先定义好函数的描述和入参,之后在上下文中提示 AI 有哪些可用函数,以及如何调用它们。通过上述讲解,相信你已经了解了代码中各部分的功能与作用,以及如何结合配置文件来调用硅基流动或阿里的 AI 接口。你可以在此基础上做更深入的封装,以适配更广阔的业务场景,从而打造一个功能丰富又安全可靠的 .NET AI 调用方案。祝你开发顺利!
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!