Skip to content

常见问题


认证与配置

Q:DefaultAzureCredential 在本地开发时认证失败怎么办?

先确认已经执行过 az login 登录 Azure CLI。如果仍然失败,可以设置环境变量 AZURE_TENANT_IDAZURE_CLIENT_IDAZURE_CLIENT_SECRET 来使用服务主体认证。也可以在代码中临时换用 AzureCliCredential 来排查问题。

Q:生产环境应该用什么认证方式?

如果你运行在 Azure 托管环境中(Azure App Service、Azure Container Apps、Azure VM),使用 ManagedIdentityCredential。如果运行在自托管的服务器上,使用 ClientSecretCredential永远不要在生产环境使用 DefaultAzureCredential——它的链式尝试机制会导致不必要的延迟,多个认证来源也会增加安全风险。

Q:必须用 Azure OpenAI 吗?能不能用其他模型?

Microsoft.Agents.AI 支持任何实现了 IChatClient 接口的 AI 提供商。官方支持 OpenAI、Azure OpenAI、Anthropic。你也可以通过自定义 IChatClient 实现来接入 Ollama、DeepSeek、智谱等任何兼容 OpenAI API 的模型。

Agent 行为

Q:Agent 不调用注册的工具,而是自己编答案怎么办?

根本原因通常是工具的 [Description] 写得太模糊。描述应该包含"触发条件"和"返回值格式"两个要素。例如,不要把工具写成 [Description("获取天气")],而要写成 [Description("根据城市名获取实时天气数据。当用户问天气时调用此工具。返回格式:城市名、温度、天气状况")]

Q:Agent 在多轮对话中自己纠正之前的回答,这是好是坏?

Agent 有能力在后续对话中纠正自己之前的错误——这是 Agent 的优势,它不像传统程序那样一次执行就固定结果。但这意味着你需要在关键业务场景中对 Agent 的输出做验证。

工具设计

Q:一个 Agent 可以注册多少个工具?

理论上没有硬性限制,但实践中建议控制在 20 个以内。工具越多,LLM 选错工具的概率就越高。如果你有大量工具,考虑分组策略:创建一个"路由 Agent"先判断用户意图,然后路由到专门的子 Agent。

Q:工具函数的参数类型有什么限制?

AIFunctionFactory.Create 支持大部分常见类型:stringintdoubleboolDateTime、枚举类型以及它们的数组和可空版本。不支持复杂的嵌套对象、泛型类型或接口类型。需要复杂参数时,考虑把 JSON 字符串作为参数传入,在工具内部反序列化。

性能与成本

Q:流式响应和非流式响应哪个更贵?

Token 计费是一样的——LLM 按生成的 Token 数量计费,和是否流式无关。流式只是改变了返回方式。从用户体验角度,流式响应几乎是必须的。

Q:多轮对话的 Token 消耗怎么控制?

每轮对话的 Token 消耗 = 用户输入 + Agent 回复 + 历史上下文。控制策略有三种:滑动窗口(只保留最近 N 轮)、摘要压缩(早期对话压缩为摘要)、分段加载(Session 序列化后分段处理)。通常组合使用:保留最近 20 轮完整对话,更早的内容压缩为摘要。

架构设计

Q:AgentSession 和 ChatHistoryProvider 有什么区别?

ChatHistoryProvider 管理底层消息列表的"存储方式"。AgentSession 是更高层次的抽象,除了消息历史还包含会话状态、工具调用上下文等。简单来说:如果你只需要控制"对话历史怎么存",用 ChatHistoryProvider;如果你需要管理"完整的会话生命周期",用 AgentSession

调试技巧

Q:怎么查看 Agent 内部调用了哪些工具?

  1. 在工具函数内部加 Console.WriteLine 或日志输出
  2. 用 ASP.NET Core 的 ILogger 记录每次工具调用
  3. 检查 AgentResponse 中的内容类型——有 FunctionCallContentFunctionResultContent 说明工具被调用了

Q:想要中途停止 RunStreamingAsync 怎么办?

RunStreamingAsync 支持 CancellationToken。创建一个 CancellationTokenSource,用户点击"停止"时调用 cts.Cancel()。注意取消流式只停止接收新 Token,不会回滚已经完成的操作。

Q:Agent 在开发环境正常,部署到生产后工具调用不工作了?

最可能的原因:生产环境模型不同导致 Function Calling 行为差异、网络策略阻止了工具调用的 API 请求、认证方式不同、生产环境的 Prompt 模板被修改了。


学习路径建议

第一阶段:巩固基础(1-2 周) 把本教程每个章节的代码亲手敲一遍。不要复制粘贴——亲手敲代码的过程中遇到的那些编译错误,是你真正理解 API 的契机。

第二阶段:探索官方文档(1 周) 通读 Microsoft Learn 上的 Agent Framework 官方文档,重点看 Tools、Conversations、Running Agents、Middleware 等子页面。

第三阶段:企业实战(2-4 周) 选择一个真实业务场景(内部 IT 工单系统、智能客服、文档处理流水线),从头设计并实现一个完整的 Agent 应用。

第四阶段:架构深入(长期) 学习 A2A 协议、多 Agent 协作模式、向量数据库集成、CI/CD 部署流水线。关注 Agent Pipeline、Observability、Evaluation、Agent Safety 等高级主题。

版本兼容性

  • NuGet 包的 prerelease 标记Azure.AI.ProjectsMicrosoft.Agents.AI.Foundry 当前为 prerelease 版本
  • .NET 版本要求:.NET 8 或更高版本
  • Workflow 包独立性Microsoft.Agents.AI.Workflows 是独立的,不使用工作流时可不引用
  • A2A 协议包依赖Microsoft.Agents.AI.Hosting.A2A.AspNetCore 依赖 ASP.NET Core,不能在 Console 应用中使用

参考资源

资源名称访问地址
MS Learn 官方文档(中文)learn.microsoft.com/zh-cn/agent-framework
官方 GitHub 源代码仓库github.com/microsoft/agent-framework
NuGet 包页面nuget.org/packages/Microsoft.Agents.AI
Azure AI Foundry 门户ai.azure.com

核心心法

Agent 不是传统的程序,你写的不是控制逻辑,而是行为边界和决策指南。 工具是 Agent 的手脚,Prompt 是 Agent 的大脑,Session 是 Agent 的记忆,Workflow 是 Agent 的行动计划。把这四样设计好,Agent 自然会做出正确的决策。

从简单开始,逐步迭代。 不要试图在第一天就构建一个包含工具、多轮对话、工作流、A2A 协议的完美 Agent。先让一个最简单的 Agent 跑通,验证 LLM 连接正常。然后逐步添加工具、引入会话、加入工作流。每一步都验证前一步的功能不被破坏。

建议在项目初期就建立一套简单的评估机制——准备一组固定的测试问题,每次修改后都跑一遍,对比 Agent 的回答质量。这种"回归测试"在 Agent 开发中比传统单元测试更难做(因为答案不是精确的),但维护一个测试问题集仍然能帮你及早发现退化。

本文作者:比特矩阵 许可协议CC BY-NC-SA 4.0更新日期:2026 年 4 月(基于 Microsoft Agent Framework 官方文档) 官方文档learn.microsoft.com/zh-cn/agent-framework

学而不思则罔,思而不学则殆