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

本文介绍了如何在C#中使用.NET8.0和AzureOpenAI构建语义函数,通过定义提示词模板和执行设置,实现将用户输入的JSON转换为特定语言的数据模型。作者探讨了内嵌式方法的使用和复用性改进的可能性。

前言

接上篇,本文讲解语义函数(Semantic Function)。语义函数不像本机函数那样需要我们使用编程语言编写代码实现特定的功能,它是自然语言编程,通过定制提示词模板,让LLM做它本来就可以做的事情。有了Semantic Kernel,在这个定制化的提示词模板中,可以动态的传入一些参数。

本篇以C#编写的控制台程序为例,使用.Net8.0。

LLM服务使用的是Azure OpenAI

内嵌语义函数

语义函数也有多种写法,比较简单的就是直接写在特定的程序里。假如现在要做一个网页应用,将用户输入的JSON文档,转化为特定语言的数据模型。

1、创建项目,并安装依赖包
# 创建控制台应用
dotnet new console -o dotnet-sk-semantic-function
# cd到`dotnet-sk-semantic-function`目录
dotnet add package Microsoft.KernelMemory.Core
dotnet add package Microsoft.SemanticKernel
2、创建kernel对象
var builder = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion(Env.Var("AOAI_MODEL_ID"), Env.Var("AOAI_ENDPOINT"), Env.Var("AOAI_API_KEY"));

var kernel = builder.Build();
3、定义提示词模板

这里的提示词模板,可以用你知道的各种提示词技巧来写。如果想在提示词里传入参数,可以使用{{$参数}}来定义。

var skPrompt = """
               担任高级{{$language}}开发人员。将此 JSON 文档转换为 {{$language}} 数据模型。

               --- 开始 ---
               {{$input}}
               --- 结束 ---
               """;
4、初始化 OpenAI 提示词的执行请求设置

可以指定温度、生成的最大令牌数等等,更多可配置项,查看类的定义。

var openAiPromptExecutionSettings = new OpenAIPromptExecutionSettings
{
    MaxTokens = 8000,
    Temperature = 1
};
5、创建函数对象

通过kernel创建函数对象。convertJson2Model是函数的名称,最后是函数的描述。

var function = kernel.CreateFunctionFromPrompt(skPrompt, openAiPromptExecutionSettings, "convertJson2Model", "将JSON文档转换为数据模型");
6、调用函数

示例中的inputlanguage是提示词模板中定义的参数,组合提示词后会一并传入到LLM中,得到回应。

//用户输入示例内容
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"]
            }

            """;
//转换为C#数据模型
await kernel.InvokeAsync(function, new KernelArguments() { ["input"] = input, ["language"] = "c#" })
    .ContinueWith((convertResult) => { Console.WriteLine(convertResult.Result); });

生成结果的截图如下:
image-20240421170921308

总结

本篇使用了内嵌的方式编写了语义函数,语义函数的创建步骤可以概况为下面四个步骤:
1、定义提示词模板

2、初始化执行请求设置

3、创建函数对象

4、调用函数

进一步思考

这样编写的代码,复用性不好,只能在特定的应用中使用,如何创建复用性更好的语义函数呢?

### 集成Semantic Kernel与DeepSeek模型的方法 #### Semantic Kernel简介 Semantic Kernel是一种用于增强应用程序语义理解能力的框架,它允许开发者通过自然语言处理技术来构建更智能的应用程序[^1]。该框架支持多种大语言模型(LLM),提供了一种统一的方式来调用这些模型。 #### DeepSeek模型概述 DeepSeek是一系列高性能的大规模预训练语言模型,旨在解决各种复杂的自然语言处理任务。其设计目标是提高生成质量、推理能力和上下文理解力[^2]。 #### 集成方法 为了将Semantic Kernel与DeepSeek模型集成在一起,可以按照以下方式操作: 1. **安装必要的库** 开始之前,需确保已安装Semantic Kernel和DeepSeek的相关Python。 ```bash pip install semantic-kernel deepseek ``` 2. **初始化Semantic Kernel** 创建一个Semantic Kernel实例,配置所需的参数。 ```python import semantic_kernel as sk kernel = sk.Kernel() api_key, org_id = "YOUR_DEEPSEEK_API_KEY", "YOUR_ORGANIZATION_ID" kernel.add_text_completion_service("deepseek-service", DeepSeek(api_key, org_id)) ``` 3. **定义技能函数** 使用Semantic Kernel创建自定义技能函数,以便更好地利用DeepSeek的能力。 ```python prompt_template = "Answer the following question using contextual information: {{input}}" skill_function = kernel.create_semantic_function(prompt_template=prompt_template) result = await skill_function.invoke_async(input="What is the capital of France?") print(result) ``` 4. **优化性能** 结合上下文知识改进模型表现,例如引入注意力机制或噪声数据处理策略。 5. **测试与部署** 完成开发后,在实际场景下验证系统的稳定性和效率,随后将其部署到生产环境中。 ```python def test_integration(): from deepseek import generate_text sample_input = "Explain how machine learning works." output = generate_text(sample_input) assert isinstance(output, str), "Output should be a string type!" test_integration() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LeiCodeX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值