ETJava Beta | Java    注册   登录
  • 搜索:
  • SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/mingupupu/p/18431071
    如有侵权 请联系我们删除  (页面底部联系我们)  

    SimpleAIAgent是基于C# Semantic Kernel 与 WPF构建的一款AI Agent探索应用。主要用于使用国产大语言模型或开源大语言模型构建AI Agent应用的探索学习,希望能够帮助到感兴趣的朋友。

    接下来我想分享一下我的AI Agent应用实践。

    翻译文本并将文本存入文件

    第一个例子是翻译文本,并将文本存入指定的文件。

    输入如下内容:

    image-20240925113714519

    执行过程

    第一步,LLM判断应该调用的函数与参数如下:

    image-20240925113837225

    第二步,LLM帮我们调用这个函数,并返回结果:

    image-20240925113939862

    第三步,LLM再次判断需要调用的函数与参数:

    image-20240925114202861

    第四步,LLM调用这个函数,并返回函数返回值:

    image-20240925114250823

    第五步,LLM判断任务已经完成,调用结束函数:

    image-20240925114350284

    第六步,返回最终的回应:

    image-20240925114503461

    查看结果

    image-20240925114554332

    会发现桌面多了一个文件,打开如下所示:

    image-20240925114623548

    以上AI Agent应用使用glm-4-flash即可实现,当然也可以尝试其他模型,模型越强,成功概率越高。

    实现文件到文件的翻译

    输入:

    image-20240925114853823

    文件1.txt的内容如下:

    image-20240925115006964

    是一段关于WPF的中文描述,现在我想让LLM帮我翻译成英文之后再保存到另一个文件。

    同样还是使用免费的glm-4-flash

    执行过程

    第一步,LLM判断应该调用的函数与参数如下:

    image-20240925115631597

    第二步,LLM帮我们调用这个函数,并返回结果:

    image-20240925120033177

    第三步,LLM判断任务已经完成,调用结束函数:

    image-20240925115856804

    第四步,返回最终的回应:

    image-20240925115922792

    查看结果

    image-20240925120115600

    image-20240925120135716

    实现要点

    大家可能会注意到实现的要点其实就是要让LLM自动调用函数,也就是实现自动函数调用的功能。

    之后要做的就是根据你想让LLM自动做的事去写插件,然后导入这个插件罢了。

    插件中函数最好不要太多,太多模型能力弱的就会乱调用。根据你的需求,实现不同人物导入不同的插件比较好。

    插件可以这样写,以上面的翻译插件为例:

    #pragma warning disable SKEXP0050
        internal class TranslationFunctions
        {
            private readonly Kernel _kernel;
            public TranslationFunctions()
            {
                var handler = new OpenAIHttpClientHandler();
                var builder = Kernel.CreateBuilder()
                .AddOpenAIChatCompletion(
                   modelId: ChatAIOption.ChatModel,
                   apiKey: ChatAIOption.Key,
                   httpClient: new HttpClient(handler));
                _kernel = builder.Build();
            }
            [KernelFunction, Description("选择用户想要的语言翻译文本")]
            public async Task<string> TranslateText(
                [Description("要翻译的文本")] string text,
                [Description("要翻译成的语言,从'中文'、'英文'中选一个")] string language
     )
            {
                string skPrompt = """
                                {{$input}}
    
                                将上面的文本翻译成{{$language}},无需任何其他内容
                                """;
                var result = await _kernel.InvokePromptAsync(skPrompt, new() { ["input"] = text, ["language"] = language });
                var str = result.ToString();
                return str;
            }
    
            [KernelFunction, Description("实现文件到文件的翻译")]
            public async Task<string> TranslateTextFileToFile(
               [Description("要翻译的文件路径")] string path1,
               [Description("保存翻译结果的文件路径")] string path2,
               [Description("要翻译成的语言,从'中文'、'英文'中选一个")] string language
    )
            {
                string fileContent = File.ReadAllText(path1);
                var lines = TextChunker.SplitPlainTextLines(fileContent,100);
                var paragraphs = TextChunker.SplitPlainTextParagraphs(lines, 1000);
                string result = "";
                string skPrompt = """
                                {{$input}}
    
                                将上面的文本翻译成{{$language}},无需任何其他内容
                                """;
                foreach (var paragraph in paragraphs)
                {
                    var result1 = await _kernel.InvokePromptAsync(skPrompt, new() { ["input"] = paragraph, ["language"] = language });
                    result += result1.ToString() + "\r\n";
                }        
               
                var str = result.ToString();
    
                // 使用 StreamWriter 将文本写入文件
                using (StreamWriter writer = new StreamWriter(path2, true))
                {
                    writer.WriteLine(str);
                }
    
                string message = $"已成功实现文件{path1}到文件{path2}的翻译";
                return message;
            }
    
            [KernelFunction, Description("将文本保存到文件")]
            public string SaveTextToFile(
               [Description("要保存的文本")] string text,
               [Description("要保存到的文件路径")] string filePath
    )
            {
                // 使用 StreamWriter 将文本写入文件
                using (StreamWriter writer = new StreamWriter(filePath, true))
                {
                    writer.WriteLine(text);
                }
                return "已成功写入文件";
            }
    
            [KernelFunction, Description("从文件中读取文本")]
            public string GetTextFromFile(
               [Description("要读取的文件路径")] string filePath
    )
            {
                string fileContent = File.ReadAllText(filePath);
                return fileContent;
            }
    
        }
    

    就是加上了一些描述用于帮助LLM理解函数的用途罢了,相信对程序员朋友来说不是什么问题,现在就可以动手构建自己的AI Agent应用了。

    希望这次的分享对使用LLM构建AI Agent应用感兴趣的朋友有所帮助。

    对这个应用感兴趣的朋友,拉一下代码,将appsettings.example.json改为appsettings.json,填入你的API Key与模型名或者使用Ollma填入地址,填入模型名即可快速体验。

    GitHub地址:https://github.com/Ming-jiayou/SimpleAIAgent