本期内容我们将介绍

  1. 如何在MAF中使用tools(工具),以调用我们代码中的函数

  2. 让Agent以指定的格式输出

补丁时间

探索 Microsoft Agent Framework:构建你的第一个 AI Agent(入门篇)https://blog.csdn.net/scixing/article/details/159174859?spm=1001.2014.3001.5501

在上期我们与AI使用图片交流时需要用将URL发送给AI,这对在线的图片自然方便,但对本地图片就不太友好了。

所以我们其实还有更直接的办法:直接把图片文件的内容读进去就行

然后其以DataContent形式上传即可,

var image = File.ReadAllBytes(@"\xx\demo.png");
var messages = new Microsoft.Extensions.AI
    .ChatMessage(ChatRole.User, [
        new TextContent("这张图片是什么"),
        new DataContent(image, "image/png")
        ]);

比如我拿了张开发者大会上stephen和scott聊天的照片,Agent便能认出这是一个怎么样的场景

图片如下

图片

补丁结束,我们进正题

Tools

在MAF中,当然也支持Tools这个特性,利用这个特性我们可以让agent有能力去调用我们代码中的函数。

借用此特性,我们可以让Agent不再从其虚幻,不可控的”知识库“中凭空生成答案,或是让AI可以调用我们想要在程序里执行的功能 

比如问"杭州天气怎么样",有了Tools我们就可以让agent直接去api中调用获取天气信息,再整合告诉用户,或是在其他地方继续使用

写法也非常简单:

// 先写个普通函数
string GetWeather(string city) 
{
    return $"杭州今天晴天,最高25度,最低15度";
}
// 然后包成Tool传给AI
AIAgent ai = new AzureOpenAIClient(...)
        .GetChatClient("gpt-4o")
        .AsAIAgent("你是个有诗意的AI", "Cosmos AI",
        tools: [AIFunctionFactory.Create(GetWeather)]
        );

Console.WriteLine( await ai.RunAsync("杭州的天气,如何?"));

这时候询问agent杭州天气,AI就会去调这个函数,拿到结果再输出。

为了让agent更清楚这函数是做什么用的,可以对齐添加描述:

[Description("获取指定城市的天气")]
string GetWeather(
    [Description("城市名,比如杭州、上海")] string city) 
{
    return $"The weather in {city} is sunny...";
}

这样agent可以更准确的使用Tools执行我们希望的操作  。

按指定格式输出

在非常多的场景下,大语言模型的职责是将语法混沌的自然语言转换为计算机可以轻松读懂的格式,例如:json 

最早的做法我们会在系统提示词中给写上例子,例如

请按以下格式输出
{
  "xxx": <xxxx>,
  "yyy": <yyyy>
}

但这样会经常出现不按要求的输出一些多余的内容,或是不符合字段的做法。 

最后还需要我们手动序列化。

如今在MAF中我们完全不需要这么麻烦

随着模型的发展,许多模型都已经直接支持定义输出的格式,MAF理所应当的也支持这个参数的设置。

比如我想要一个人的信息,希望Agent能直接返回给我一个对象:

public record Person(string Name, string Age);
var person = await ai.RunAsync<Person>("随便给我个人的信息");

如果不指定泛型,Agent大概会回你一大段话:"我想到了一个人,他叫小明,今年25..."

但现在指定了Person,函数就可以直接返回的就是一个实实在在的Person对象,.Name、.Age直接就能用

这本质上来说帮你实现了response_format的指定与最后的反序列化操作,

当然,如果你希望的话,也可以指定序列化的设置 

Console.WriteLine( await ai.RunAsync<Person>("随便给我个人的信息", 
                    serializerOptions: new(System.Text.Json.JsonSerializerDefaults.General)));

Tool + 结构化输出

接下来我们就可以轻松的将两者结合

[Description("获取随机人物信息")]
Person GetPerson() => new Person("Veyle", "1000");
// 建Agent时俩Tool一起传进去
AIAgent ai = new AzureOpenAIClient(
        new Uri(Environment.GetEnvironmentVariable("AZURE_AI_ENDPOINT")),
        new Azure.Identity.AzureCliCredential())
        .GetChatClient("o3")
        .AsAIAgent("你是一个充满宇宙诗意的AI助手,会很有想象力/诗意的回答用户的问题", "Cosmos AI",
        tools: [AIFunctionFactory.Create(GetPerson)]
        );
// 然后
var person = await ai.RunAsync<Person>("获取一个人物信息");

这时候Agent会首先意识到要调用GetPerson这个Tool,拿到返回的Person对象,然后便可以给你返回Person对象

非常简单就可以完成这两者的组合

学会了吗?学会了

Bilibili: @无聊的年

微信公众号:@scixing的炼丹房

【Microsoft Agent Framework】2. Tool与结构化输出_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1cnw3zxEhR?spm_id_from=333.788.videopod.sections&vd_source=1d76161a221ae4f697e4d44ab784eb80

图片

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐