本文将和大家介绍 LLM 的魔法,通过自然语言编程的方式开发 SemanticFunction 函数

大家都知道,编程里面的函数可以是一个完成某个功能的逻辑片段,绝大部分的函数都需要使用人类不友好的编程语言进行开发。以往只有熟练掌控和计算机沟通的编程语言的程序员才能开发出一个个功能函数,而现在有了 LLM 的魔法帮助下,人们也可以用自然语言编写出完成某项功能逻辑函数,更有趣的是使用自然语言编程写出的函数在特定领域下可以实现出更加智能容错更高的函数。如 宵伯特 所说:LLM的强大之处在于可以架起自然语言与机器语言之间的桥梁。通过合适的提示词,我们可以让LLM把自然语言中的关健信息提取出来,哪怕是文本背后的一些隐含信息也可以进行处理

接下来我将和大家介绍在配合 AzureAI 的 GPT 大语言模型下的 SemanticFunction 自然语言函数的开发和对接方法

本文属于 SemanticKernel 入门系列博客,更多博客内容请参阅我的 博客导航博客园的合集

本文开始之前,需要大家有一个 AzureAI 或 OpenAI 的账号,包括 Endpoint 和 ApiKey 等对接必备信息。否则你将不能跟随本文的演示代码进入 LLM 的世界

申请 AzureAI 地址:https://aka.ms/oai/access

如等不急申请且咱认识的情况下,可以向我要一个号给你测试

配置

在 KernelBuilder 里面可以通过 WithAzureChatCompletionService 或 WithAzureTextCompletionService 方法进行配置和 AzureAI 的对接。我这里申请的是 GPT 3.5 16K 的,只支持 ChatCompletion 方式,因此就选 WithAzureChatCompletionService 进行配置

需要传入的是部署的模型和 Endpoint 和 ApiKey 这两个必要的信息,如以下代码进行配置

using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel; var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole();
builder.SetMinimumLevel(LogLevel.Debug);
});
var logger = loggerFactory.CreateLogger("SemanticKernel"); // 这里的演示代码需要用到 AzureAI 的支持,需要提前申请好,申请地址:https://aka.ms/oai/access var endpoint = "https://lindexi.openai.azure.com/"; // 请换成你的地址
var apiKey = args[0]; // 请换成你的密钥 IKernel kernel = new KernelBuilder()
.WithLogger(logger)
.WithAzureChatCompletionService("GPT35", endpoint, apiKey)
// 当然,这里也可以支持 OpenAI 的服务。或者是其他第三方的服务
//.WithOpenAIChatCompletionService()
.Build();

以上代码还在配置的时候注入控制台日志,方便出错时了解错误原因

关于 AzureAI 的模型部署,可以在网上搜到非常多大佬的博客,我这里就不进行展开。相信大家看 Azure 界面也就知道如何配置了

如果拿到的是 OpenAI 的服务,则可以选用 WithOpenAIChatCompletionService 或 WithOpenAITextCompletionService 进行配置

定义自然语言函数

接下来的编程可就是用自然语言开始编写了。本文的例子是做一个帮忙找借口的函数,这个函数的作用就是你输入做了什么事情,然后 GPT 帮你找一个夸张的借口。这个例子是原本 SemanticKernel 官方的例子,我只是将其修改为中文

先使用自然语言定义出函数,这里采用 $input 作为变量的占位符号,这是 上一篇博客 自定义变量和技能 里所提到的方法

const string FunctionDefinition = @"
为给定的事件想出一个创造性的理由或借口。
要有创意,要有趣。让你的想象力尽情驰骋。 事情:我要迟到了。
借口:我被长颈鹿帮绑架了。 事情:我有一年没去健身房了
借口:我一直忙着训练我的宠物龙。 事情: { {$input} }
借口:";

以上的函数就是先给 GPT 两个例子,然后第三个就是让 GPT 进行自由发挥

完成了自然语言函数编写之后,接下来就可以和 SemanticKernel 框架进行对接了

更多关于 Prompt 提示词相关,请参阅 简介 - Learning Prompt

对接框架

对接框架最简单的方法就是通过 CreateSemanticFunction 方法创建出 SemanticFunction 函数,如以下代码

ISKFunction excuseFunction = kernel.CreateSemanticFunction(FunctionDefinition, maxTokens: 200,
// 温度高一些,这样 GPT 才会乱说
temperature: 1);

这时候为了让 GPT 能够回答更加有趣,这里提升了温度

完成函数的制作之后,接下来咱来看看怎么调用吧

调用函数

由于 CreateSemanticFunction 方法返回的是一个 ISKFunction 接口,也就是和前面博客提到的技能的函数在使用上没有多少的不同,从这里也可以看出 SemanticKernel 故意模糊了传统的编程函数和自然语言函数,从而让大家在调用的时候不需要关注某个函数是如何创建的

var result = await excuseFunction.InvokeAsync("我错过了篮球赛");
Console.WriteLine(result);

我跑了一次,输出了以下代码

我被邀请参加了一个秘密的超级英雄训练营,我必须去拯救世界!

看起来 GPT 的这个函数算是定义成功了,但就是回答有些奇怪,还需要继续炼丹,修改自然语言

也许后面会有许多面向 LLM 的开发者,这些开发者不再编写传统的编程语言的代码,而是编写自然语言,让 LLM 实现魔法的功能

代码

本文的代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 27492e28eee195378642ec34e3cc8d9d9e1417a9

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 27492e28eee195378642ec34e3cc8d9d9e1417a9

获取代码之后,进入 SemanticKernelSamples\Example05_InlineFunctionDefinition 文件夹

参考文档

Semantic Kernel 入门系列:LLM的魔法 - 宵伯特 - 博客园

SemanticFunction 自然语言函数的更多相关文章

  1. 深入解析Windows操作系统笔记——CH2系统结构

    2.系统结构 本章主要介绍系统的总体结构,关键部件之间的交互,以及运行在什么环境. 2.系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.3.1 可移植性 2.3.2 对称 ...

  2. 我的FP感悟

    FP概要: 我主要总结了以下5点: 函数是一等公民: 函数的参数是函数,返回值是函数,类型还是函数... 舍弃语句,拥抱表达式: 表达式就一定有返回值. 无副作用: 不修改外部系统的状态. immut ...

  3. UI 自动化框架设想

    测试框架选型: 首先,通过利用TestNG结合csv的使用,将测试用例数据转化为测试代码中的数据,减少了测试人员录入数据和准备数据的工具: 再次,通过对appium的封装,按照面向对象的思想将测试中用 ...

  4. python自然语言处理函数库nltk从入门到精通

    1. 关于Python安装的补充 若在ubuntu系统中同时安装了Python2和python3,则输入python或python2命令打开python2.x版本的控制台:输入python3命令打开p ...

  5. 【NLP】基于自然语言处理角度谈谈CRF(二)

    基于自然语言处理角度谈谈CRF 作者:白宁超 2016年8月2日21:25:35 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务 ...

  6. PHP的日期和时间处理函数

    1. 将日期和时间转变为时间戳 1.1 time() 原型:time(void) 作用:返回当前时间的 UNIX时间戳. 参数:void,可选(即无参数) 1.2 mktime() 原型:int mk ...

  7. tn文本分析语言(四) 实现自然语言计算器

    tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. github地址:https://github.com/ferventdes ...

  8. 自然语言26_perplexity信息

    http://www.ithao123.cn/content-296918.html 首页 > 技术 > 编程 > Python > Python 文本挖掘:简单的自然语言统计 ...

  9. Python_Day4_函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 定义: 函数是指将一组语句的集合通过一个名字( ...

  10. Python基础-函数篇

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数  函数与函数式编程 1.面向对象: 华山派-- ...

随机推荐

  1. 三维模型OBJ格式轻量化压缩在移动智能终端应用方面的重要性分析

    三维模型OBJ格式轻量化压缩在移动智能终端应用方面的重要性分析 三维模型的OBJ格式轻量化压缩在移动智能终端应用方面具有重要性.以下是对三维模型OBJ格式轻量化压缩在移动智能终端应用方面重要性的分析: ...

  2. 记录--iview 使用爬坑

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间公司需要开发一个后台管理系统,时间比较急迫,一两天时间.想一想自己一点一点的搭建起来可能性不太大,就想着有没有现成的可以改一改,就 ...

  3. 关于使用SSM+JSP开发时setter、getter隐式调用问题的小结

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17977495 出自[进步*于辰的博客] 之前使用SSM ...

  4. mysql mysqldump 命令导出

    1.导出指定表的数据 mysqldump -t database -u user -p  --table_name1 table_name2 table_name3 >C:\db_script. ...

  5. BlockQNN:NASNet同期,商汤提出block-wise版的MetaQNN | CVPR 2018

    作为NASNet的同期论文,BlockQNN同样地将目光从整体网络转换到了block-wise,整体思路大概是MetaQNN的block版,增加了一些细节地小修改.配合Early Stop Strat ...

  6. #杜教筛,欧拉函数#51nod 1227 平均最小公倍数

    题目 设 \(\large A(n)=\frac{1}{n}\sum_{i=1}^n lcm(i,n)\), 求 \(\sum_{i=l}^rA(i)\),\(n\leq 10^9\) 分析 题意可以 ...

  7. #最大公约数,容斥#洛谷 3166 [CQOI2014]数三角形

    题目 分析 总方案就是\(C(n*m,3)\),考虑减掉不合法的方案, 横向\(n*C(m,3)\),纵向\(m*C(n,3)\)再减去斜着的, 对于\((x_1,y_1)(x_2,y_2),x_1& ...

  8. 使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令

    背景 最近面对一个庞大的项目,但是只需要修改某个模块,每次都手搓命令太麻烦了,于是就想着能不能写个脚本来辅助处理这些事情. 解决方案 定制化一键 ESLint,执行文件下载地址: https://gi ...

  9. Java 编程指南:入门,语法与学习方法

    Java 是什么? Java 是一种流行的编程语言,诞生于 1995 年.由 Oracle 公司拥有,运行在超过 30 亿台设备上.Java 可以用于: 移动应用程序(尤其是 Android 应用) ...

  10. Qt Create开发,修改 .Pro 文件改变 exe 的名称

    // .pro // 修改 TARGET 就可以改变生成的exe的名称 TARGET = Test // 要是生成的exe名称中需要带有空格,需要用到$$quote TARGET = $$quote( ...