Semantic Kernel开发实践:如何创建并使用语义函数(Semantic Function)(2)

前言

在前一篇里有一个思考:如何创建复用性更好的语义函数?本篇文章,将回答这个问题,是通过结构化处理语义函数(Semantic Function,下文直接称语义函数)的各个部分,来达到复用的效果。

演示案例是C#编写的控制台应用,使用的是.net8.0版本。

LLM服务使用的是Azure OpenAI

结构化语义函数

1、创建Plugins目录,这个目录存放所有的插件,通常会有多个插件,每个插件一个目录,最后一级的目录是特定的函数。

例如下面这个图中,Plugins是所有插件的顶级目录。

ConverterPlugin表示有个"转换插件"。

Json2Model表示在转换插件下有个特定功能的函数,可以把JSON文档转换为特定语言的数据模型。

2、在Json2Model这个函数目录下,创建config.json和skprompt.txt两个文件

其中config.json的示例代码如下:

json 复制代码
{
  "schema": 1,
  "type": "completion",
  "description": "将JSON文档转换为指定语言的数据模型",
  "execution_settings": {
    "default": {
      "max_tokens": 1200,
      "temperature": 0.8
    }
  },
  "input_variables": [
    {
      "name": "input",
      "description": "用户输入的JSON文档",
      "required": true
    }
  ]
}

type: 提示词类型

description: 描述函数的功能

execution_settings: 模型的参数

input_variables: 定义提示词模板的参数

  • name: 参数名称
  • description: 参数描述

skprompt.txt是提示词模板文件,示例内容如下:

sql 复制代码
担任高级{{$language}}开发人员。将此 JSON 文档转换为 {{$language}} 数据模型。
​
--- 开始 ---
{{$input}}
--- 结束 ---

如果要定义参数,可以使用{{$参数}}定义,参数名称对应input_variables下的name。

案例演示

对前一篇示例进行改写。

1、导入插件

ini 复制代码
var skill = kernel.ImportPluginFromPromptDirectory("Plugins/ConverterPlugin");

2、准备用户输入内容

csharp 复制代码
var input = """
            {
              "person": {
                "name": "Alice",
                "age": 28,
                "city": "New York",
                "occupation": "Software Engineer"
              },
              "pets": [
                {
                  "name": "Fluffy",
                  "species": "Cat",
                  "age": 5
                },
                {
                  "name": "Max",
                  "species": "Dog",
                  "age": 3
                }
              ],
              "favorite_foods": ["Sushi", "Pizza", "Chocolate"]
            }
            """;

3、调用函数,获得大模型返回结果

less 复制代码
var result = await kernel.InvokeAsync<string>(skill["Json2Model"],new KernelArguments() { ["input"] = input, ["language"]="java" });
Console.WriteLine(result);

结果示例

总结

本文说明了如何通过对语义函数的配置和提示词模板结构化处理后,可以方便的在不同的应用中使用,以达到复用的目标。

进一步思考

不管是本机函数还是语义函数,都是由程序主动调用的。如果我希望在生产应用中,可以动态的组合函数,交给AI来调用,如何达成这个目标呢?

相关推荐
wangruofeng4 小时前
AI Models 1.1.0 发布,查大模型价格、对比模型和找 API 地址
前端·aigc·ai编程
小虎AI生活8 小时前
Vibe 知识视频火了!不剪辑不烧积分,我用 WorkBuddy 直出两条成片
aigc·ai编程
狼爷8 小时前
别再问 “AI 会不会取代人” 了,这问题太便宜
aigc
大西瓜瓜瓜12 小时前
使用 AutoDL/RTX4090/QWeb7B
aigc·openai
后端小肥肠14 小时前
公众号漫画又挖到长尾赛道:家常菜美食,流量稳定长期有收益
人工智能·aigc·agent
徐开泉18 小时前
OTA链接不算你的引用:酒店AI可见度的域名归属判定与SQL实现(2026)
aigc
oil欧哟19 小时前
Anthropic 工程长文精译:如何构建有效的 AI Agent(工作流与自主边界)|Oil Book
aigc·ai编程
oil欧哟1 天前
AI Agent 子智能体协作实战:怎样用好 Subagent 分工与省 Token|Oil Book
aigc·ai编程
小虎AI生活1 天前
火柴人skill接入workbuddy实操:5 段提示词产出 3 条 MP4(附 6 组可抄文本)
aigc·ai编程
wangruofeng1 天前
写给开发者的〈重构 UI〉实战笔记:从改好一个设置页开始,告别“程序员审美”
前端·aigc