动态

详情 返回 返回

在 .NET AI 聊天應用中升級到 Microsoft 代理框架 - 动态 详情

在 .NET AI 聊天應用中升級到 Microsoft 代理框架

引言

隨着人工智能技術的快速發展,簡單的聊天機器人已經不能滿足複雜業務場景的需求。Microsoft 代理框架(Microsoft Agent Framework)為 .NET 開發者提供了構建智能代理(AI Agent)的能力,使應用程序能夠實現多步推理、工具調用和複雜工作流編排。本文將詳細介紹如何將一個基礎的 .NET AI 聊天應用升級為基於 Microsoft 代理框架的智能代理系統,包括環境準備、框架集成、功能擴展和最佳實踐等內容。

1. Microsoft 代理框架概述

Microsoft 代理框架是微軟推出的 .NET AI 代理開發框架,相比傳統聊天機器人,它具有以下核心能力:

  • 多步驟工作流推理:能夠分解複雜任務為多個執行步驟
  • 工具調用能力:可與API、數據庫和服務進行交互
  • 上下文保持:維護整個對話的上下文一致性
  • 自主決策:根據指令和數據做出智能判斷
  • 多代理協作:支持多個代理協同工作

該框架基於 .NET 開發者熟悉的模式構建,如依賴注入、中間件和遙測技術,與 Microsoft.Extensions.AI 深度集成,為開發者提供了熟悉的開發體驗。

2. 環境準備與基礎應用創建

2.1 先決條件

在開始升級前,需要準備以下環境:

  • .NET 9 SDK
  • Visual Studio 2022 或 VS Code(含 C# Dev Kit)
  • Azure 賬號(可訪問 Azure OpenAI)
  • 安裝 .NET AI 應用模板
2.2 創建基礎應用

使用 .NET AI 模板創建基礎聊天應用:

dotnet new install Microsoft.Extensions.AI.Templates
dotnet new ai-chat-webapp -n ChatApp20 -ai azure-openai -vs local -or aspire

該命令會創建一個包含三個項目的解決方案:

  • ChatApp20.Web:Blazor Server 聊天界面
  • ChatApp20.AppHost:.NET Aspire 業務流程
  • ChatApp20.ServiceDefaults:共享服務配置
2.3 項目結構分析

關鍵文件結構如下:

ChatApp20/
├── ChatApp20.Web/
│   ├── Components/Pages/Chat/ # 聊天界面
│   ├── Services/ # 數據服務
│   ├── Program.cs # AI 配置
│   └── wwwroot/Data/ # 示例PDF
├── ChatApp20.AppHost/
└── ChatApp20.ServiceDefaults/

初始的 Program.cs 已配置了 Azure OpenAI 客户端、語義搜索和向量存儲功能。

3. 集成 Microsoft 代理框架

3.1 安裝必要的 NuGet 包

在 ChatApp20.Web.csproj 中添加以下包引用:

<itemgroup>
  <packagereference Include="Microsoft.Agents.AI" Version="1.0.0-preview.251009.1" />
  <packagereference Include="Microsoft.Agents.AI.Abstractions" Version="1.0.0-preview.251009.1" />
  <packagereference Include="Microsoft.Agents.AI.Hosting" Version="1.0.0-preview.251009.1" />
  <packagereference Include="Microsoft.Agents.AI.Hosting.OpenAI" Version="1.0.0-alpha.251009.1" />
  <packagereference Include="Microsoft.Agents.AI.OpenAI" Version="1.0.0-preview.251009.1" />
</itemgroup>

這些包提供了代理框架的核心功能、抽象定義和 OpenAI 集成支持。

3.2 創建專用工具服務

將搜索功能從 UI 組件移到專用服務類中:

using System.ComponentModel;

namespace ChatApp20.Web.Services;

public class SearchFunctions
{
    private readonly SemanticSearch _semanticSearch;

    public SearchFunctions(SemanticSearch semanticSearch)
    {
        _semanticSearch = semanticSearch;
    }

    [Description("Searches for information using a phrase or keyword")]
    public async Task<ienumerable<string>&gt; SearchAsync(
        [Description("The phrase to search for.")] string searchPhrase,
        [Description("Filter by filename if specified")] string? filenameFilter = null)
    {
        var results = await _semanticSearch.SearchAsync(searchPhrase, filenameFilter, 5);
        return results.Select(r =&gt; 
            $"<result filename="\&quot;{r.DocumentId}\&quot;" page_number="\&quot;{r.PageNumber}\&quot;">{r.Text}</result>");
    }
}

這種設計實現了關注點分離,便於測試和擴展。

3.3 配置 AI 代理

在 Program.cs 中註冊代理服務:

// 註冊搜索功能服務
builder.Services.AddSingleton<searchfunctions>();

// 配置 AI 代理
builder.AddAIAgent("ChatAgent", (sp, key) =&gt; 
{
    var searchFunctions = sp.GetRequiredService<searchfunctions>();
    var chatClient = sp.GetRequiredService<ichatclient>();
    
    return chatClient.CreateAIAgent(
        name: key,
        instructions: "You are a helpful assistant that provides short and accurate answers.",
        tools: [AIFunctionFactory.Create(searchFunctions.SearchAsync)]
    )
    .UseOpenTelemetry(c =&gt; c.EnableSensitiveData = builder.Environment.IsDevelopment())
    .Build();
});

關鍵配置點包括:

  • 代理名稱標識
  • 系統指令定義代理行為
  • 工具註冊和方法綁定
  • 集成遙測監控

4. 更新聊天界面組件

4.1 修改 Chat.razor

更新組件代碼以使用代理框架:

@inject IServiceProvider ServiceProvider
@using Microsoft.Agents.AI

@code {
    private AIAgent _agent;

    protected override void OnInitialized()
    {
        _agent = ServiceProvider.GetRequiredKeyedService<aiagent>("ChatAgent");
    }

    private async Task AddUserMessageAsync(ChatMessage userMessage)
    {
        // ... 原有消息處理邏輯
        
        await foreach (var update in _agent.RunStreamingAsync(
            messages.Skip(statefulMessageCount),
            currentResponseCancellation.Token))
        {
            // 處理流式響應
        }
    }
}
4.2 響應流處理

代理框架支持流式響應,提供更流暢的用户體驗。

5. 測試與驗證

5.1 使用 .NET Aspire 運行

.NET Aspire 提供了統一的服務管理面板,可以:

  • 查看服務發現
  • 監控日誌和遙測數據
  • 檢查服務健康狀況
  • 管理配置和密鑰

啓動應用後,Aspire 儀表板會自動打開,顯示各組件狀態和交互情況。

5.2 測試代理行為

典型的測試場景包括:

基礎對話測試

用户:你好!
代理:你好!我是一個樂於助人的AI助手。

工具調用測試

用户:應急生存套裝應該包含哪些物品?
代理:基礎生存套裝應包含:<result filename="Survival_Kit.pdf" page_number="2">防水火柴、急救包...</result>

文件特定查詢

用户:GPS手錶有哪些功能?
代理:主要功能包括:<result filename="GPS_Watch.pdf" page_number="3">實時追蹤、路線規劃...</result>

通過 Aspire 儀表板可以實時觀察代理的決策過程、工具調用參數和響應生成情況。

6. 高級應用場景

6.1 添加更多工具

擴展代理能力,如添加天氣查詢:

public class WeatherFunctions
{
    [Description("獲取指定位置的天氣情況")]
    public async Task<string> GetWeatherAsync(
        [Description("城市名稱")] string city)
    {
        // 調用天氣API
        return $"{city}天氣:晴,25°C";
    }
}

// 註冊到代理
builder.AddAIAgent("ChatAgent", (sp, key) =&gt; 
{
    // ... 其他配置
    tools: [
        AIFunctionFactory.Create(searchFunctions.SearchAsync),
        AIFunctionFactory.Create(weatherFunctions.GetWeatherAsync)
    ]
});
6.2 多代理協作

實現專業化代理協作:

// 研究代理
builder.AddAIAgent("ResearchAgent", (sp, key) =&gt; 
{
    // 專注於信息檢索
});

// 寫作代理
builder.AddAIAgent("WritingAgent", (sp, key) =&gt; 
{
    // 專注於內容生成
});

// 協調代理
builder.AddAIAgent("CoordinatorAgent", (sp, key) =&gt; 
{
    // 協調其他代理工作
});

這種架構適合複雜的內容生成場景。

6.3 自定義中間件

添加代理行為定製:

.AsBuilder()
.Use(async (messages, options, next, ct) =&gt; 
{
    // 調用前處理
    logger.LogInformation("Processing {count} messages", messages.Count());
    
    var result = await next(messages, options, ct);
    
    // 調用後處理
    logger.LogInformation("Generated response");
    return result;
})

可用於實現緩存、日誌、驗證等橫切關注點。

7. 最佳實踐與性能優化

7.1 工具設計指南
  • 提供清晰的工具描述
  • 參數説明要詳細具體
  • 返回格式標準化
  • 錯誤處理要健壯
7.2 測試策略

編寫全面的單元和集成測試:

[Fact]
public async Task SearchAsync_ReturnsFormattedResults()
{
    // 準備模擬數據
    var mockSearch = new Mock<semanticsearch>();
    mockSearch.Setup(x =&gt; x.SearchAsync("test", null, 5))
        .ReturnsAsync(/* 測試數據 */);
    
    // 執行測試
    var functions = new SearchFunctions(mockSearch.Object);
    var results = await functions.SearchAsync("test");
    
    // 驗證結果
    Assert.Contains("test data", results.First());
}
7.3 性能考量
  • 流式 vs 非流式:交互式場景用流式,批處理用非流式
  • 工具調用優化:減少不必要的工具調用
  • 監控指標:跟蹤令牌用量、響應時間、錯誤率等
7.4 部署到 Azure

使用 .NET Aspire 的 Azure 部署工具:

az login
cd ChatApp20.AppHost
azd init
azd up

該流程會自動配置所有必要的 Azure 資源。

結論

通過將 .NET AI 聊天應用升級到 Microsoft 代理框架,開發者可以獲得更強大的AI能力,包括複雜任務處理、工具集成和多代理協作。本文詳細介紹了從環境準備、框架集成到高級應用的完整流程,並提供了最佳實踐指導。關鍵優勢包括:

  1. 架構清晰:實現關注點分離,提升可維護性
  2. 擴展性強:易於添加新工具和代理類型
  3. 開發友好:基於熟悉的 .NET 模式構建
  4. 可觀測性好:內置遙測和監控支持

隨着 AI 代理技術的不斷髮展,採用 Microsoft 代理框架將為 .NET 開發者提供構建下一代智能應用的堅實基礎。

user avatar hankin_liu 头像 asmallwhitecat 头像 dtux 头像 fsjohnhuang 头像 cixiangdelang 头像 openkylin 头像 today_5aa33dd13dda9 头像 recordyu 头像 linzai_6904290569daa 头像 huopodelianpen 头像
点赞 10 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.