合集 - C#(80)1.使用C#将几个Excel文件合并去重分类2023-11-152.C#使用SqlSugar操作MySQL数据库实现简单的增删改查2023-11-163.C#中的类和继承2023-11-174.C#中的virtual和override关键字2023-11-175.C#中的属性2023-11-206.C#winform中使用SQLite数据库2023-11-237.C#简化工作之实现网页爬虫获取数据2023-11-278.C#中的委托(一)2023-11-299.C#中的ref关键字2023-11-2910.C#中out关键字2023-11-2911.C#中内置的泛型委托Func与Action2023-12-0412.在winform blazor hybrid中绘图2023-12-1313.使用C#如何监控选定文件夹中文件的变动情况?2023-12-2814.C#设计模式之策略模式01-0215.由浅入深理解C#中的事件01-0416.C#设计模式之观察者模式01-0417.C#设计模式之单例模式01-0818.C#基于ScottPlot进行可视化01-1319.C#使用MiniExcel导入导出数据到Excel/CSV文件02-1020.winform实现最小化至系统托盘02-1921.C#使用Bogus生成测试数据02-2722.SemanticKernel如何基于自有数据聊天03-0523.在winform中如何嵌入第三方软件窗体✨03-0724.在winform中如何实现双向数据绑定?03-1825.自己动手做一个批量doc转换为docx文件的小工具03-2026.WPF中动画教程(DoubleAnimation的基本使用)04-0127.WPF动画教程(PointAnimationUsingPath的使用)04-0328.C#使用PaddleOCR进行图片文字识别✨04-0929.WPF基础:在Canvas上绘制图形04-1630.WPF/C#:让绘制的图形可以被选中并将信息显示在ListBox中04-1931.使用归一化盒过滤器对图像进行平滑处理04-2032.WPF/C#:如何显示具有层级关系的数据04-2233.将彩色图转化为灰度图及其原理介绍04-2334.WPF/C#:ProgressBar的基本使用05-0835.在VB.NET项目中使用C#编写的代码05-2136.WPF/C#:理解与实现WPF中的MVVM模式05-2837.SemanticKernel:添加插件06-0638.Avalonia:一个.NET跨平台UI框架06-1039.WPF/C#:异常处理06-1240.WPF/C#:程序关闭的三种模式06-12:樱花宇宙官网41.wpfui:一个开源免费具有现代化设计趋势的WPF控件库06-1342.WPF/C#:如何将数据分组显示06-1743.WPF/C#:更改界面的样式06-1744.LiveCharts2:简单灵活交互式且功能强大的.NET图表库06-1845.WPF/C#:显示分组数据的两种方式06-1946.WPF/C#:在DataGrid中显示选择框06-2047.WPF/C#:数据绑定到方法06-2148.WPF/C#:BusinessLayerValidation06-2549.WPF/C#:如何实现拖拉元素06-2750.WPF在.NET9中的重大更新:Windows 11 主题07-0151.ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别07-0252.动手学Avalonia:基于SemanticKernel与硅基流动构建AI聊天与翻译工具07-0353.Avalonia应用在基于Linux的国产操作deepin上运行07-0454.如何让其他模型也能在SemanticKernel中调用本地函数07-0555.大语言模型的应用探索—AI Agent初探!07-0856.动手学Avalonia:基于硅基流动构建一个文生图应用(一)07-1057.WPF/C#:在WPF中如何实现依赖注入07-1158.ScreenToGif:一款开源免费且好用的录屏转Gif软件07-1259.WPF/C#:实现导航功能07-1860.关于学习.NET的历程回顾与今后的探索实践方向07-2461.入门Vue+.NET 8 Web Api记录(一)07-2562.SemanticKernel/C#:检索增强生成(RAG)简易实践08-0163.SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景08-0264.SemanticKernel/C#:实现接口,接入本地嵌入模型08-0665.EF Core连接PostgreSQL数据库08-0766.基于SiliconCloud快速体验GraphRag.Net08-0867.AvaloniaChat:一个基于大语言模型用于翻译的简单应用08-1668.最佳实践:在AvaloniaChat中接入SiliconCloud08-1669.AvaloniaChat—从源码构建指南08-1870.SimpleRAG:基于WPF与Semantic Kernel实现的一个简单的RAG应用08-1971.Semantic Kernel/C#:接入智谱AI的两种方式08-2172.AvaloniaChat-v0.0.2:兼容智谱AI 快速使用指南08-2173.使用SiliconCloud快速体验SimpleRAG(手把手教程)08-2274.使用Ollama本地离线体验SimpleRAG(手把手教程)08-2375.Semantic Kernel/C#:一种通用的Function Calling方法,文末附经测试可用的大模型08-2976.在SimpleRAG中使用SiliconCloud快速测试Function Calling08-2977.SimpleTranslationAIAgent:基于C#与LLM的翻译AI Agent08-3178.SimpleTranslationAIAgent借助SiliconCloud API 构建自己的专属翻译助手08-3179.SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索09-2080.SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用09-25收起
SimpleAIAgent是基于C# Semantic Kernel 与 WPF构建的一款AI Agent探索应用。主要用于使用国产大语言模型或开源大语言模型构建AI Agent应用的探索学习,希望能够帮助到感兴趣的朋友。
接下来我想分享一下我的AI Agent应用实践。
翻译文本并将文本存入文件
第一个例子是翻译文本,并将文本存入指定的文件。
输入如下内容:
执行过程
第一步,LLM判断应该调用的函数与参数如下:
第二步,LLM帮我们调用这个函数,并返回结果:
第三步,LLM再次判断需要调用的函数与参数:
第四步,LLM调用这个函数,并返回函数返回值:
第五步,LLM判断任务已经完成,调用结束函数:
第六步,返回最终的回应:
查看结果
会发现桌面多了一个文件,打开如下所示:
以上AI Agent应用使用glm-4-flash即可实现,当然也可以尝试其他模型,模型越强,成功概率越高。
实现文件到文件的翻译
输入:
文件1.txt的内容如下:
是一段关于WPF的中文描述,现在我想让LLM帮我翻译成英文之后再保存到另一个文件。
同样还是使用免费的glm-4-flash
执行过程
第一步,LLM判断应该调用的函数与参数如下:
第二步,LLM帮我们调用这个函数,并返回结果:
第三步,LLM判断任务已经完成,调用结束函数:
第四步,返回最终的回应:
查看结果
实现要点
大家可能会注意到实现的要点其实就是要让LLM自动调用函数,也就是实现自动函数调用的功能。
之后要做的就是根据你想让LLM自动做的事去写插件,然后导入这个插件罢了。
插件中函数最好不要太多,太多模型能力弱的就会乱调用。根据你的需求,实现不同人物导入不同的插件比较好。
插件可以这样写,以上面的翻译插件为例:
#pragma warning disable SKEXP0050internal 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