共计 2299 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
最近在尝试用 C# 构建 AI Agent 时,发现市面上关于这方面的完整案例很少。大多数开发者都会遇到以下几个典型问题:

- 响应延迟 :当需要串联多个 AI 模型时,同步调用会导致请求堆积
- 状态管理混乱 :对话上下文和长期记忆难以持久化
- 扩展性差 :新增模型时需要修改核心逻辑
- 监控困难 :缺乏标准的性能指标收集方式
架构设计
经过多次迭代验证,我总结出这个分层架构方案(文字示意图):
[Client] ←HTTP/WebSocket→ [API Gateway] ←→ [Orchestrator] ←→ [Model Router]
↑ ↓
[Monitoring] ←——— [Memory Cache] [Model Pool]
- 通信层 :基于 ASP.NET Core 的 API 网关处理协议转换
- 控制层 :任务编排器管理生命周期和状态机
- 推理层 :策略路由将请求分发到具体模型
- 记忆模块 :混合使用 MemoryCache 和 Redis
核心实现
1. API 网关搭建
使用 Minimal API 快速构建端点:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<IAgentOrchestrator, AgentOrchestrator>();
var app = builder.Build();
app.MapPost("/chat", async (ChatRequest request, IAgentOrchestrator orchestrator) =>
{using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
return await orchestrator.ExecuteAsync(request, cts.Token);
});
2. 模型集成方案
针对不同框架的适配策略:
// ONNX Runtime 集成示例
public class OnnxModel : IInferenceStrategy
{
private InferenceSession _session;
public async Task<ModelResult> ExecuteAsync(ModelInput input)
{using var outputs = _session.Run(input.ToOnnxTensor());
return ProcessOutput(outputs);
}
}
// ML.NET 集成示例
public class MlnetModel : IInferenceStrategy
{
private PredictionEngine<ModelInput, ModelOutput> _engine;
public Task<ModelResult> ExecuteAsync(ModelInput input)
=> Task.FromResult(_engine.Predict(input));
}
3. 异步任务调度
使用 Channel 实现生产者 - 消费者模式:
public class InferenceQueue
{
private readonly Channel<InferenceTask> _channel;
public InferenceQueue()
{_channel = Channel.CreateBounded<InferenceTask>(100);
}
public async ValueTask EnqueueAsync(InferenceTask task)
=> await _channel.Writer.WriteAsync(task);
public async IAsyncEnumerable<ModelResult> ProcessAsync([EnumeratorCancellation] CancellationToken ct)
{await foreach (var task in _channel.Reader.ReadAllAsync(ct))
{yield return await _strategies[task.ModelType]
.ExecuteAsync(task.Input);
}
}
}
性能优化
-
线程池调优 :根据模型复杂度配置 MinThreads
ThreadPool.SetMinThreads(Environment.ProcessorCount * 2, 100); -
批处理技巧 :合并小请求提升 GPU 利用率
-
内存管理 :
- 对 Tensor 对象实现 IDisposable
- 使用 ArrayPool 减少 GC 压力
生产建议
监控方案
app.UseMiddleware<MetricsMiddleware>();
public class MetricsMiddleware
{public async Task InvokeAsync(HttpContext context)
{var sw = Stopwatch.StartNew();
await _next(context);
_metrics.Record(
context.Request.Path,
sw.ElapsedMilliseconds,
context.Response.StatusCode);
}
}
安全防护
- 使用 RateLimiter 中间件
- 输入参数白名单验证
进阶思考
- 如何实现跨会话的长期记忆存储?
- 当需要动态加载 / 卸载模型时,如何设计热更新机制?
- 在多 GPU 环境下,如何优化模型分配策略?
这套框架已经在我们的客服系统中稳定运行 6 个月,QPS 峰值达到 1200。关键是把状态管理和业务逻辑解耦,后续新增模型只需实现 IInferenceStrategy 接口即可。希望对大家有所启发!
正文完
发表至: 编程开发
近一天内
