02 2025 档案

摘要:首先说一下我的观察和体会啊,这只是我个人的观察:生成式AI没有之前那么粗暴性的火爆了?而是变得更细化,更精准的推陈出新或版本迭代了?与此同时,常用的一些工具中,AI的影子多了起来。是的,AI并不是以排山倒海一样来的,而是以润物细无声和方式融入我们的应用或工作中的。 其实新旧技术从来不是以切换的方式进 阅读全文
posted @ 2025-02-28 21:54 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:最近,开发了一个基于生成式AI的小工具,这款小工具的作用是:无侵入性地提升用户输入效率。主要使用场景是重复性输入的表单,原始信息内容与将要输入的表单内容对不齐,这时,SmartFill就会分析这些内容,然后自动填写到页面表单上。源内容可以是文本,语音,图片等多媒体信息。 我给他起了个名字叫Smart 阅读全文
posted @ 2025-02-28 21:50 刘靖凯 阅读(5) 评论(0) 推荐(0) 编辑
摘要:之前的篇章都是用SemanticKernel来连接OpenAI的API,当然是需要费用,另外还有使用限制,本篇来说明在SK中使用开源模型LLama3。 首先引入Nuget包,这里使用的是LLamaSharp这个三方包,因为没有显卡,只能跑在CPU上,所以也需要引入对应的Cpu包,最后引入SK的LLa 阅读全文
posted @ 2025-02-28 21:44 刘靖凯 阅读(2) 评论(0) 推荐(0) 编辑
摘要:监控,为服务保驾护航,也为业务量化提供有力支持,当然在SemanticKernel中的监控也不例外,同时还能为真金白银的Token提供量化监控。 下面是项目中使用的Nuget包: <ItemGroup> <PackageReference Include="Microsoft.SemanticKer 阅读全文
posted @ 2025-02-27 21:17 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:Plugins在SK中是一个神奇的功能。我们说大语言模型具有不确定性,我们的代码是确定性的,而Plugins有把这种不确定性转成确定性能功能。 下面的例子是一个通过自然语言实现购买的案例,客户可以通过文字或语音来输入自然语言, <ItemGroup> <PackageReference Includ 阅读全文
posted @ 2025-02-27 20:59 刘靖凯 阅读(2) 评论(0) 推荐(0) 编辑
摘要:LLM下的Agent代表着一个“智能体”角色,或是大领域全才,或是细分领导专才。成为一个代理后的最大好处是可以让Agent作为代表,与其他的Agent进行交互,直到达到想要的结果。 下面是一个高级程序员和架构师两个架构作为代理的案例,高级程序员写完程序后,架构师来Review,针对性地提出修改意见。 阅读全文
posted @ 2025-02-27 20:54 刘靖凯 阅读(2) 评论(0) 推荐(0) 编辑
摘要:体之前说过结构化Prompt,这是一个具体案例的使用,本例是把公众号上中文技术文章翻译成选择的语言。 基本思路是用户输入文章的url,系统用Playwright读取html内容,然后利用SemanticKernel的OpenAIChatCompletionService功能,按照提示词翻译,最后用P 阅读全文
posted @ 2025-02-27 20:51 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:本篇看一下ImageToText,获取图片内的信息,加以利用。全例是用户上传图片,利用AI来判断上传的图片是否正确。 <ItemGroup> <PackageReference Include="Microsoft.SemanticKernel" Version="1.6.2" /> </ItemG 阅读全文
posted @ 2025-02-26 20:30 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:生成图片是LLM多模态中的基本功能,SemanticKernel也把这个基本功能引入进来了,是通过添加TextToImage来实现的,对于GPT,内部对应着DallE模型,下面的例子通过一个简单的方式来实现生成。 首先引入SemanticKernel。 <ItemGroup> <PackageRef 阅读全文
posted @ 2025-02-26 20:26 刘靖凯 阅读(2) 评论(0) 推荐(0) 编辑
摘要:去年写过几过几篇关于SemanticKernel的文章,由于正式发布的版本与之前的版本变化较大,加上前的东京《生成式AI应用开发》活动,想把演示的Demo逐一分享出来,的以再次开启SemanticKernel系统。 下面是一个Chat的例子,用户提问,如果本地有固定数据能对应,直接返回,如果没有,就 阅读全文
posted @ 2025-02-25 21:16 刘靖凯 阅读(4) 评论(0) 推荐(0) 编辑
摘要:前两篇关于Prompt的文章分别从提示词规则建议和具体框架角度说明了一下Prompt的使用技巧,接下来可以说是对框架式提示词的的进一步升级——结构化提示词。 结构化定义: 对信息进行组织,使其遵循特定的模式和规则,从而方便有效理解信息。 结构化提示词语法: 这个结构支持 Markdown 语法,也支 阅读全文
posted @ 2025-02-25 21:11 刘靖凯 阅读(4) 评论(0) 推荐(0) 编辑
摘要:在Prompt入门里,我们分享了OpenAI官方给出的提示词建议,但这些建议基本上是指导性的,方向性的,概念性的,虽然对我们编写提示词有很大帮助,但究竟我们的提示词好还是不好,效率怎么性,很大程度上要看每个人的理解,和提示词输出。 那么有没有一个可操作性的,方法论的,谁都能套格式呢?肯定是有的,下面 阅读全文
posted @ 2025-02-25 20:46 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:还记得ChatGPT刚出来时,体验后的感觉是:知识渊博,无所不通;智慧在线,逻辑清晰,简直可以用“高端,大气,上档次”形容,但也不失“低调,奢华,有内涵”。 使用GPT经历过几个阶段:最开始是娱乐阶段:以聊天,写诗之类为主;之后经历了漫长的搜索引擎阶段:搜索知识点,技术点或输出文案题纲;再到现在的生 阅读全文
posted @ 2025-02-24 20:51 刘靖凯 阅读(0) 评论(0) 推荐(0) 编辑
摘要:Coravel 通过使高级应用程序功能(如任务/作业调度、排队、缓存、邮件(以及更多!))易于访问且易于使用,帮助开发人员快速启动并运行 .NET 应用程序。具有简单、富有表现力和直接的语法。 Coravel引入一个广播事件机制,可以通过简单的事件注册,事件订阅,完成一个广播。下面是一个修改密码的功 阅读全文
posted @ 2025-02-24 20:47 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:Prompt,,提示词,是使用生成式AI的必备前提,好的提示词能让生成式AI给出更精准的结果,不仅能节省时间,还能节省tokens(这可是美金呀),所以在生成式AI出来后,就有Prompt Engineer提示工程师之说。于是,就有很多分享提示的文章,还有很多网站,专门收集各种场合的提示词。 Ope 阅读全文
posted @ 2025-02-24 20:41 刘靖凯 阅读(2) 评论(0) 推荐(0) 编辑
摘要:Coravel 通过使高级应用程序功能(如任务/作业调度、排队、缓存、邮件(以及更多!))易于访问且易于使用,帮助开发人员快速启动并运行 .NET 应用程序。具有简单、富有表现力和直接的语法。 Coravel非常简单,通过Rember来保存缓存数据,同时可以设定缓存的时长,然后通过Get来获取缓存。 阅读全文
posted @ 2025-02-23 20:53 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:Coravel 通过使高级应用程序功能(如任务/作业调度、排队、缓存、邮件(以及更多!))易于访问且易于使用,帮助开发人员快速启动并运行 .NET 应用程序。具有简单、富有表现力和直接的语法。 Coravel还提供了一种简单的Queue机制,通过把任务放入队列,系统会自动在30秒执行一次,每次都会把 阅读全文
posted @ 2025-02-23 20:48 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:Json缩进 增加了Json输出时的缩进控制,代码如下: using System.Text.Json; var options = new JsonSerializerOptions { //启用缩进 WriteIndented = true, //缩进字符 IndentCharacter = ' 阅读全文
posted @ 2025-02-22 21:33 刘靖凯 阅读(2) 评论(0) 推荐(0) 编辑
摘要:Coravel 通过使高级应用程序功能(如任务/作业调度、排队、缓存、邮件(以及更多!))易于访问且易于使用,帮助开发人员快速启动并运行 .NET 应用程序。具有简单、富有表现力和直接的语法。 下面是简单的用法,通过注入Scheduler和在中间件中定义调度的实现,来完成简单的定时使用。 using 阅读全文
posted @ 2025-02-22 21:28 刘靖凯 阅读(4) 评论(0) 推荐(0) 编辑
摘要:Rin 可以捕获对 ASP.NET Core 应用程序的 HTTP 请求,并为捕获的数据提供查看器。它是调试 Web 应用程序(例如,网站、API 应用)的有用工具。 先看如下代码: var builder = WebApplication.CreateBuilder(args); builder. 阅读全文
posted @ 2025-02-22 21:25 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:构造函数,是在初始化对象时,把数据传给对象。那Deconstruct正好相反,是从对象中把想要的数据返回。 下面看一个使用场景,下面是定义一个record的Order,我们可以用元数据的方式,从Order对象中把no,orderTime取出来,这是怎么做到的呢? //Order定义成record r 阅读全文
posted @ 2025-02-22 21:02 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:记得之前在做医保接口时,经常要调一些C++或delphi写的本地dll(这些dll通常是用来读医保卡之类),这里简单介绍一下用C#生成本地可以直接调用dll,具体做法是通过UnmanagedCallersOnlyAttribute来完成。 dll项目文件如下 <Project Sdk="Micros 阅读全文
posted @ 2025-02-21 20:45 刘靖凯 阅读(5) 评论(0) 推荐(0) 编辑
摘要:在AOT项目中,使用反射有一些问题,本程序包利用源生成器,按不同的维度,提前获取对应类型的元数据,从而达到平滑使用Reflection部分功能。 项目: https://github.com/axzxs2001/AOTReflection nuget: https://www.nuget.org/p 阅读全文
posted @ 2025-02-21 20:41 刘靖凯 阅读(7) 评论(0) 推荐(0) 编辑
摘要:Dapper.AOT可以是第一时间响应.NET发布AOT项目的ORM,虽然不像Dapper功能完善,但也基本能满足使用。 还记得我在拦截器Interceptors中最后的提示吗?当源生成器遇上拦截器后,就迸射出爱的火花,Dapper.AOT就是它们爱的结晶。 拦截器 桂素伟,公众号:桂迹.net8: 阅读全文
posted @ 2025-02-21 20:38 刘靖凯 阅读(5) 评论(0) 推荐(0) 编辑
摘要:反射是.NET开发的利器,但对于AOT来说,因为Native编译,所以反射的功能基本在AOT编译的项目中失效。办法总比困难多,这么好的东西不能扔掉,下面是“尽量”可以使用反射的例子,为什么“尽量”,看完下面的案例我们再做说明。 在AOT项目中使用反射基本原理:利用源生成器,在build项目时,提前调 阅读全文
posted @ 2025-02-21 20:34 刘靖凯 阅读(5) 评论(0) 推荐(0) 编辑
摘要:AOT项目在发布时,可以通过项目文件中的OptimizationPreference选项来生成理论上最快的可执行文件(Speed)和更小的可执行文件(Size), 默认情况下,编译器选择混合方法:生成快速代码,大小又适中。通过在<PropertyGroup>中增加如下节点即可: <PropertyG 阅读全文
posted @ 2025-02-20 20:22 刘靖凯 阅读(5) 评论(0) 推荐(0) 编辑
摘要:AOT项目有特殊模版的,目前支持AOT的模版有Mini API和gRPC。对于Mini API的AOT项目,有几个不同点,下面是我简化后针对开发的不同点: 使用 CreateSlimBuilder() API 确保默认情况下仅启用基本功能,从而最大程度地减小应用的部署大小。 配置为仅侦听 HTTP, 阅读全文
posted @ 2025-02-20 20:17 刘靖凯 阅读(4) 评论(0) 推荐(0) 编辑
摘要:什么项目适合AOT呢?那要先看AOT项目的优缺点有哪些,根据这些优缺点,我们就能判断自己的项目适合不适合用AOT模式开发。 下面是官方提供的一个.NET服务原生发布与AOT的比较,我们看到,在Linux下,大小几乎是原来的1/10,启动后工作内存,不到原来的一半,启动时间更是原来的1/4,而带来的R 阅读全文
posted @ 2025-02-19 21:00 刘靖凯 阅读(5) 评论(0) 推荐(0) 编辑
摘要:在C#12中,引入了拦截器,但一直是试验性的功能,所以自己初步看了一下,没有写文章,最近在看AOT时,发现Dapper.AOT已经用上了这个功能,觉得还是整理一下,分享出来吧,如果以后这个功能改变了,或移除了,请无视这篇文章。 下面是微软官方文档的提示: 拦截器是一项试验性功能,在 C# 12 的预 阅读全文
posted @ 2025-02-19 20:56 刘靖凯 阅读(5) 评论(0) 推荐(0) 编辑
摘要:上篇关于《.net8发布后,AOT解决了JWT Authentication》的文章,在Visual Studio中运行是没有问题,但要采用默认的发布配置就会报错。 .NET8发布后,AOT解决了JWT Authentication 桂素伟,公众号:桂迹.NET8发布后,AOT解决了JWT Auth 阅读全文
posted @ 2025-02-18 20:14 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:最近在做一个控制台的Demo时,遇到一个简单验证问题,觉得有意思,就分离出来共勉。 具体场景是当需要在控台上修改一个实体的各个属性时,需要对输入进行验证,如果什么都不输入,直接回车,就返回旧的数据。这里有一个问题,因为所有从Console.ReadLine()读进来的都是string类型,当需要bo 阅读全文
posted @ 2025-02-18 20:11 刘靖凯 阅读(0) 评论(0) 推荐(0) 编辑
摘要:随着.NET8发布,AOT的JWT Authentication也完成了,这样,构建一个基本的AOT API成为了可能,可以把AOT引入到一些简单的API项目中来了。关于AOT的好处,请参照: https://learn.microsoft.com/zh-cn/aspnet/core/fundame 阅读全文
posted @ 2025-02-18 20:08 刘靖凯 阅读(4) 评论(0) 推荐(0) 编辑
摘要:.net8作为一个长期支持版本(LTS)马上就要发布了,.net7会在2024年5月14日终止支持,上一个长期支持版本.net6也会在2024年11月12日终止,所以.net8发布会,会迎来一波升级。 说说为什么升级吧。其实升级对程序员来说,比较烦,用的好好的,升什么升。其实如果你们安全部门不作要求 阅读全文
posted @ 2025-02-17 20:51 刘靖凯 阅读(6) 评论(0) 推荐(0) 编辑
摘要:record是C#9引进来的一个自定义类型,同样class也可以用来定义类型,那么他们有什么区别呢?下面通过一个表格来介绍一下record和class的区别: record class 概念 用来封装数据。 虽然record中也可以定义方法,事件等成员,但通常状况下,record是用来定义实体类,封 阅读全文
posted @ 2025-02-17 20:49 刘靖凯 阅读(6) 评论(0) 推荐(0) 编辑
摘要:相信你一定遇到过这种异常:未将对象引用到实例(System.NullReferenceException:“Object reference not set to an instance of an object.”),是这,这应该是所有C#程序员都熟悉的异常,但即使是老手,也不可能百分百杜绝。 首 阅读全文
posted @ 2025-02-17 20:24 刘靖凯 阅读(10) 评论(0) 推荐(0) 编辑
摘要:extern 是C#中的一个关键字,用于声明在C#代码中引用外部程序集中的函数或方法。通常,extern 用于与非托管代码(如C/C++编写的DLL)进行交互,以便在C#中调用非托管代码中的函数。 MessageBox(IntPtr.Zero, "你好extern!", "信息", 0); [Dll 阅读全文
posted @ 2025-02-16 15:21 刘靖凯 阅读(0) 评论(0) 推荐(0) 编辑
摘要:如果在WinForm中执行一个长时间操作时,窗体就会被锁死,直到操作完成,对于操作者的体验就是死锁状态,那在.NET(.net 5以后)中,怎么实现一个并发,等待,且同步操作信息窗口呢? 第一步:首先定义一个等待窗体,为了有明确的提示,做一个等待的gif图,同步有提示信息。 partial clas 阅读全文
posted @ 2025-02-16 15:14 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:OpenTelemetry可以说是可观测性里的中流砥柱,自然.net也能很好的与期交互。OpenTelemetry支持了很多语言,C#也在其中,下面的列子就是在一个api项目中,添加对OpenTelemetry的NuGet包的引用,来完成应用的metric的。 基本思路是,第一步:在程序中引入Ope 阅读全文
posted @ 2025-02-16 15:11 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:之前,想把一个对象当集合使用,需要给这个类型构建索引器,为了foreach,还需要实现IEnumerable。 public struct Season : IEnumerable { readonly string[] _arr; public Season() { _arr = new stri 阅读全文
posted @ 2025-02-16 14:58 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:record: record可以在定义类型时带参,这个参数会转成默认的属性 public record PersonRecord(string FirstName, string LastName) { public string Name => $"{FirstName} {LastName}"; 阅读全文
posted @ 2025-02-16 14:52 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:相比之前,AOT在.NET8的第5个预览版有了进一步的实现,给我的感觉是在一步步落地,虽然离生产还很远,但还是能看到希望的。 使用AOT的API项目与传统的Web API项目在模版就作了区分,分别是“asp.net core api”和“asp.net core web api”,命令行创建项目的短 阅读全文
posted @ 2025-02-16 14:47 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:照猫画虎,依葫芦画瓢,是ChatGPT的能力之一,在一个项目的开发过程中,也存在着很多类似的工作,特别是一个项目的架构,有其身体的特点,如果让GPT依据语义提示来生成代码,会和原架构存在着一定的差异,这时,“依葫芦画瓢”就好用了。这时就要先构建好一个“葫芦”,然后让ChatGPT依这个“葫芦”帮我们 阅读全文
posted @ 2025-02-16 14:40 刘靖凯 阅读(0) 评论(0) 推荐(0) 编辑
摘要:前ChatGPT让人惊叹的是,它好像有了真人的思维逻辑,能记住上下文,还能很融洽地和你聊天,并且回答问题让你满意。但如果你问他一些自己身边事,或者公司最新产品的事,ChatGPT的回复就天马行空了。怎么才能让他成为自己的问答机器人呢?下面给出了一个简单的事例,一起看一下吧。 后端代码: using 阅读全文
posted @ 2025-02-16 14:36 刘靖凯 阅读(2) 评论(0) 推荐(0) 编辑
摘要:SemanticKernel其中一个功能是实现像https://chat.openai.com那样的问答聊天功能,给过SK封装,就变得简单灵活了,下面是不到百地代码实现的一个简单聊天功能。 32行(后端)+51行(前端)=83行 后端: using Microsoft.SemanticKernel; 阅读全文
posted @ 2025-02-16 14:32 刘靖凯 阅读(6) 评论(0) 推荐(0) 编辑
摘要:OpenAI全身是有原生API的,也有一些开源的库,不过都是简单对原生API的封装,这个系统主要通过SemanticKernel来使用OpenAI。 SemanticKernel简单称SK,是一个轻量级的使用OpenAI和Azure AI的SDK。利用SK可以更轻松,便捷的使用AI的能力,同时,它还 阅读全文
posted @ 2025-02-16 14:28 刘靖凯 阅读(13) 评论(0) 推荐(0) 编辑
摘要:chatGPT出来也半年多了,在Visual Studio上的ChatGPT工具出来一些了,最早的应该是GitHub Copilot了,今天我们分别来说三个在VS2022上使用的ChatGPT工具:GitHub Copilot,GitHub Copilot Chat 和 Visual chatGPT 阅读全文
posted @ 2025-02-16 14:22 刘靖凯 阅读(10) 评论(0) 推荐(0) 编辑
摘要:在下面的文章中,用到反射来设计医保接口,因为国内的医保接口有一个特点,就是接口基本是统一的,接中传的数据是有一定规律的,这样方便对接后业务级的升级扩展,所以在对接医保接口时,就很容易用OOP来设计一个微框架来对应。 用反射开发医保接口 桂素伟,公众号:桂迹 .NET架构小技巧(3)——反射,架构人员 阅读全文
posted @ 2025-02-16 14:17 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:有几天没有更新文章了,一方面因为感觉GPT出来了,写什么都不香了,非得写点关于GPT的才有资格出来和大家见面;另一方面,确实最近一段时间也在全面拥抱GPT:学习,总结,思考。所以今天就想随心所欲地说说GPT使用感受。 其实GPT出来没多长时间,就注册账号,并体验了网页版,更多是觉得有趣,智能,属于看 阅读全文
posted @ 2025-02-15 15:21 刘靖凯 阅读(3) 评论(0) 推荐(0) 编辑
摘要:提示:本篇不适合手机阅读,主要为了提供代码实现。 为了减速少大的Excel文件在内存中驻留,使用流的方式,边查询边组装,边下载文件相对来说是一个好的方式,下面是基于ClickHouse数据源的方式,下载100万条记录的处理方式,本地测试,内存只有100多M的使用,下载完后就会释放。 注:下面的代码仅 阅读全文
posted @ 2025-02-15 15:09 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑
摘要:在VS17.5中,加入了一个.http文件,应该和你想的一样,就是一个存放请求的文件,关键是他能执行请求,很像curl。不过市面上相似的工具有很多,比如Postman就做的很好了,那为什么VS还要引入呢? 我的简单理解,虽然Postman好用,但毕竟和VS中的源码是分离的,即使Postman等工具有 阅读全文
posted @ 2025-02-15 14:53 刘靖凯 阅读(1) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示