|
这段代码里,我觉得有 4 个点特别值得注意。 第一,这段代码里,我觉得有 4 个点特别值得注意。 第一,任务名被显式定义了。 不是“随手调一个方法”,而是注册了一个明确的任务:ResearchAndSummarize。 这件事在 demo 里看起来像形式感,但在工程里很重要。因为任务一旦被命名,后面你才能围绕它做日志、状态、监控、审批和调度。 第二,输入输出边界被显式定义了。 这里的输入是 string[] topics,输出是 string[] summaries。 这意味着任务边界开始清晰了。系统知道这个任务吃什么、吐什么。后面你要做校验、测试、扩展,就都有抓手。 第三,步骤结构被显式固化了。 先 CollectAsync,再 SummarizeAsync。 这听起来像废话,其实不是。因为很多智能体系统一开始都是靠 prompt 让模型“自己想步骤”。这种方式灵活,但不稳定。Harness 的价值之一,就是把那些已经稳定下来的执行骨架显式化。 第四,后续扩展点变清楚了。 现在这个示例很小,但你已经很容易想象后面能加什么var harness = new ResearchHarness(); var topics = new[]{ "Microsoft Agent Framework", "Harness Engineering", ".NET Agent Runtime"};var summaries = await harness.ExecuteTaskAsync<string[], string[]>( "ResearchAndSummarize", topics, CancellationToken.None);Console.WriteLine("Final Summaries:");foreach (var summary in summaries){ Console.WriteLine(summary);}任务名被显式定义了。 不是“随手调一个方法”,而是注册了一个明确的任务:ResearchAndSummarize。 这件事在 demo 里看起来像形式感,但在工程里很重要。因为任务一旦被命名,后面你才能围绕它做日志、状态、监控、审批和调度。 第二,输入输出边界被显式定义了。 这里的输入是 string[] topics,输出是 string[] summaries。 这意味着任务边界开始清晰了。系统知道这个任务吃什么、吐什么。后面你要做校验、测试、扩展,就都有抓手。 第三,步骤结构被显式固化了。 先 CollectAsync,再 SummarizeAsync。 这听起来像废话,其实不是。因为很多智能体系统一开始都是靠 prompt 让模型“自己想步骤”。这种方式灵活,但不稳定。Harness 的价值之一,就是把那些已经稳定下来的执行骨架显式化。 第四,后续扩展点变清楚了。 现在这个示例很小,但你已经很容易想象后面能加什么var harness = new ResearchHarness(); var topics = new[]{ "Microsoft Agent Framework", "Harness Engineering", ".NET Agent Runtime"};var summaries = await harness.ExecuteTaskAsync<string[], string[]>( "ResearchAndSummarize", topics, CancellationToken.None);Console.WriteLine("Final Summaries:");foreach (var summary in summaries){ Console.WriteLine(summary);}
|