用 NVIDIA Nemotron 3 Super + .NET 构建有记忆的多轮对话

  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创
  • 📢作者格言:2026年,一个巨大的转折点,开启自由职业,技术栈.NET、VUE、嵌入式C、大量低价接私活中,欢迎dddd......

序言

英伟达免费的大模型Nemotron最大的优点就是免费,可商用以及支持单卡部署,极大降低了大模型私有化的难度,鉴于此,咱们就来尝尝鲜吧。由于我手头没有显卡支持,只好退而求其次,使用英伟达免费的线上模型尝试了...

1、为什么选择 Nemotron 3 Super

2025 年 12 月,NVIDIA 发布 Nemotron 3 开放模型家族,覆盖 Nano、Super 和 Ultra,目标直指 Agent、工具调用和多智能体工作流。2026 年 3 月上线的 Nemotron 3 Super 120B-A12B 共有 120B 参数,但每个 token 只激活约 12B 参数;它采用 Mamba-2、Attention、Latent MoE 和多 token 预测的混合架构,在效率与能力之间做了很有意思的平衡。

根据 NVIDIA 模型介绍,Super 支持中文、代码、工具调用和长上下文,最高可扩展到 100 万 token,尤其适合聊天机器人、RAG 和 Agent 场景。对 .NET 开发者更实用的一点是:NVIDIA 托管接口兼容 OpenAI API,因此现有 OpenAIClient 和 Microsoft Agent Framework 基本不需要更换编程模型。

2、开英伟达账号

直接导航到英伟达开发社区,点它即可 点这个大大的按钮,然后在页面右上角点击登录或注册账号即可,推荐使用gmail邮箱。 注册登录后,依然到这个页面,搜索 Nemotron 3 Super

选择第一个搜索结果,然后开通API Key,右上角。 开通api时需要填写手机号,这个可以用打码平台,开通后按照例子就可以简单测试了。 权益还是可以轻松应对测试的。

3、项目搭建

先输入ai配置,如下:

json 复制代码
{
  "OpenApi": {
    "UseModel": "Nemotron3",
    "Nemotron3": {
      "BaseUrl": "https://integrate.api.nvidia.com/v1",
      "Model": "nvidia/nemotron-3-super-120b-a12b",
      "ApiKey": "<NVIDIA_API_KEY>",
      "Temperature": 1.0,
      "TopP": 0.95,
      "Timeout": 300
    }
  }
}

3.1、建立OppenAI的兼容客户端

NVIDIA 模型并不是 OpenAI 模型,但接口协议兼容,因此只需替换端点、密钥和模型名:

csharp 复制代码
OpenAIClient client = new(
    new ApiKeyCredential(currentAi.ApiKey),
    new OpenAIClientOptions
    {
        Endpoint = new Uri(currentAi.BaseUrl),
        NetworkTimeout = TimeSpan.FromSeconds(currentAi.Timeout)
    });

var chatClient = client.GetChatClient(currentAi.Model);

AIAgent agent = chatClient.AsAIAgent(
    instructions: "你是个非常友善的小助手,每次回答问题都很简洁。",
    name: "对话小助手");

这也是参考文章中接入第三方模型的关键思路:让兼容接口负责推理,让 Agent Framework 负责会话、上下文和后续工具编排。

3.2、同一个 Session,就是多轮对话的关键

微软的MAF采用Session管理多次会话,模型接口本身不会凭空记住上一次独立请求。真正让第二轮理解"我是谁"的,是两次调用复用了同一个 AgentSession:

csharp 复制代码
AgentSession session = await agent.CreateSessionAsync();

await foreach (var update in agent.RunStreamingAsync(
    "我叫嘟嘟,我热爱大象", session))
{
    Console.Write(update);
}

Console.WriteLine();

await foreach (var update in agent.RunStreamingAsync(
    "你知道我是谁吗?", session))
{
    Console.Write(update);
}

第一轮把"名字是嘟嘟、喜欢大象"写入会话历史;第二轮虽然没有重复这些信息,但 Framework 会把相关历史随请求交给 Nemotron。因此,正常效果应是模型回答"你叫嘟嘟",并可能补充"你喜欢大象"。如果第二轮新建了另一个 session,这段上下文就不会自动存在。

RunStreamingAsync 还会把生成内容分片写到控制台。它不会改变最终答案,却显著缩短用户感知到的首字等待时间,适合客服和聊天窗口。

3.3、运行结果

简介的对话,对话中 可见,AI确实记录了上次对话中的内容。

3.4、 演示到生产

当前示例验证的是进程内短期记忆。项目还提供了 VectorChatHistoryProvider:它按 SessionId 保存请求与响应,调用前取回最近 10 条记录。这为跨请求、跨进程的持久化留下了接口,但生产环境还应继续处理:

  • 用真正的向量数据库或持久化存储替代临时实现,并设置历史裁剪策略;
  • 不记录 API Key、完整请求头和敏感对话,生产环境关闭消息级 Debug 日志;
  • 对 429、超时和网络错误增加退避重试与取消令牌;
  • 用固定问题集评估中文一致性、上下文召回率、首 token 延迟和单轮成本;
  • 长上下文容量不是无限记忆的替代品,历史越长,延迟和费用通常也越高。

4、结论

这次接入最有价值的地方,不是写了多少适配代码,而是边界非常清晰:Nemotron 3 Super 提供推理与对话能力,OpenAI 兼容层降低 SDK 迁移成本,Microsoft Agent Framework 用 AgentSession 管理多轮上下文。只要复用 session,我们就从一次性问答迈进了真正连贯的 Agent 对话;再接入持久化历史、工具和 RAG,就能逐步扩展为生产级应用。

参考资料

好了,你学废了吗?

相关推荐
疯狂打码的少年1 小时前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法
神奇小汤圆1 小时前
JUC三大常用工具类CountDownLatch、CyclicBarrier、Semaphore
后端
Keven_111 小时前
算法札记:区分稀疏图与稠密图在经验上的数学计算差异
算法·稠密图·稀疏图
卷无止境2 小时前
当FastAPI项目开始"膨胀",代码该往哪儿放
后端·python
fliter2 小时前
程序员每天能省 1 小时的 50 个 macOS/终端/Git/浏览器技巧
后端
神奇小汤圆2 小时前
Redis为什么使用哈希槽而不用一致性哈希
后端
用户8356290780512 小时前
Python设置PowerPoint幻灯片背景的方法
后端·python
站大爷IP2 小时前
Python 的 is 把我坑惨了,原来 == 和 is 在小整数池外完全是两码事
后端
用户40966601317512 小时前
Jackson 序列化:@JsonIgnore / @JsonProperty / @JsonFormat / @JsonInclude / @JsonUnwrapped 一次讲清楚
java·后端