SimpleAIAgent:使用免费的glm-4-flash即可开始构建简单的AI Agent应用FI

news/2024/11/14 8:51:11/文章来源:https://www.cnblogs.com/westworldss/p/18431218

合集 - 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应用实践。

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

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

输入如下内容:

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 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803463.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VLAN原理和配置

VLAN原理和配置 VLAN:虚拟局域网,将一个物理的局域网在逻辑上划分成多个广播域 华为交换机默认4094个VLAN 在交换机上配置VLAN,同一个VLAN内的用户可以进行二层互访,而不同VLAN 间的用户被二层隔离 VLAN帧格式 Tag用于区分不同的VLAN 没有携带Tag的帧DMAC SMAC Type Data F…

ddsadasdasd

目录理论部分 Ceph的诞生主要是为了解决以下问题: 操作部分 第一部分(虚拟机配置) 一、修改主机名 二、修改防火墙、SELinux状态 三、修改hosts文件 四、验证网络环境(请参阅 第一步、第四步) 五、配置 ceph 源 六、开始执行yum安装 七、创建目录 第二部分(部署ceph) 1…

.net 到底行不行!2000 人在线的客服系统真实屏录演示(附技术详解)

时常有朋友问我性能方面的问题,正好有一个真实客户,在线的访客数量达到了 2000 人。在争得客户同意后,我录了一个视频。升讯威在线客服系统可以在极低配置的服务器环境下,轻松应对这种情况,依然可以做到消息毫秒级送达,操作毫秒级响应。业余时间用 .net 写了一个免费的在…

记.Net Framework中wwwroot文件限制用户访问

背景 项目.Net Framework做的,已经线上跑了很多年了,突然发现用户上传的文件都被放到了wwwroot//Content/Upload目录,这些文件都是比较重要的,程序用来读取解析数据的,但是被直接可以公开访问了。 其实要改也很简单,代码改一下,文件挪一下位置就可以了,但是如果这样改就…

项目可能问问题

项目和简历 hr面试问题 自我介绍 面试官你好,我叫王首都,重庆邮电大学 计算机科学与技术专业研二在读,主要从事java后端开发,项目达人探店,它主要,实现了登录验证,缓存查询,优惠券秒杀,接口限流,以及签到打卡等功能。在上学期间获得了人民奖学金,新生奖学金,学业讲…

MongoDB 双活集群在运营商的实践

本文将着重分享某头部运营商订单中心在实现双活架构过程中的最佳实践,提供详细的技术细节和实际案例。通过介绍项目实施过程中的技术细节,提供类似场景需求的方案参考。在现代电信行业中,订单中心作为核心业务系统之一,承担着处理客户订单、管理订单状态、与各个业务系统进…

信创里程碑:TapData 与海量数据达成产品兼容互认证,共同助力基础设施国产化建设

测试结果显示,TapData LDP V3 与 Vastbase G100 V2.2 完全兼容,整体运行稳定高效,性能表现优秀,可为企业级客户提供可靠的中间件与数据库支撑。近日,深圳钛铂数据有限公司(以下简称钛铂数据)自主研发的钛铂实时数据平台(TapData Live Data Platform,TapData LDP)与北…

【日记】感觉自己已经魔怔了(817 字)

正文下午装档案的时候,无意间朝外看了一眼,发现自己视力衰退了好多。感觉两只眼睛都有散光了,看东西有重影。有些担心。兄长血检报告出来了,血红蛋白高,肌酐低。尿酸倒是正常了,但总体还是偏高。我觉得好奇怪,他降尿酸怎么这么难…… 更奇怪的是他说心电图时不紧张,但窦…

DNS正向解析和反向解析的区别

在网络世界中,域名系统(DNS)起着至关重要的作用,它就如同网络世界的导航地图,帮助我们在浩瀚的数字海洋中准确找到目标。而在DNS中,正向解析和反向解析是两个重要的概念,它们有着明显的区别。 首先,正向解析是将域名转换为IP地址的过程。当我们在浏览器中输入一个网址,…

DNS云解析和普通解析一样吗

在当今数字化时代,网络的稳定与高效运行至关重要。域名系统(DNS)作为互联网的基础设施之一,其解析服务的质量直接影响着用户的网络体验。近年来,DNS云解析逐渐兴起,与传统的普通解析相比,它们之间存在着显著的区别。 首先,在可靠性方面,DNS云解析具有明显优势。普通解…

【学习笔记】数学证明方法

持续更新中持续更新中最值定理前提条件: 函数 \(f(x)\) 在区间内是连续的在满足前提的情况下,设区间上界为 \(a\),下界为 \(b\) 那么函数 \(f(x)\) 一定能取到区间 \((a,b)\) 内的所有值介值定理前提条件: 函数 \(f(x)\) 在区间内是连续的当区间 \([a,b]\) 上界为 \(A\),下…

【YashanDB知识库】多表更新报错 YAS-04344 multi-table update is not supported

本文内容来自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7369204.html?templateId=1718516 【问题分类】功能使用 【关键字】YAS-04344,UPDATE,multi-table update,MERGE INTO 【问题描述】 在崖山环境执行类似以下语法进行多表更新报 YAS-04344 multi-…