大模型学习笔记六:Semantic Kernel

一、Semantic Kernel介绍和发展

  • 定义介绍
    1、Semantic Kernel 是微软研发的一个开源的,面向大模型的开发框架(SDK);
    2、它支持你用不同开发语言(C#/Python/Java)基于 OpenAI API/Azure OpenAI API/Huggingface 开发大模型应用;
    3、它封装了一系列开箱即用的工具,包括:提示词模板、链式调用、规划能力等。
  • SDK(补充说明)
    SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。

1)SK 的语言开发进展

1、C# 版最成熟,已开始 1.0.1:https://github.com/microsoft/semantic-kernel
2、Python 是 beta 版:https://github.com/microsoft/semantic-kernel
3、Java 版 alpha 阶段:https://github.com/microsoft/semantic-kernel/tree/experimental-java
4、TypeScript 版……,已经放弃了:https://github.com/microsoft/semantic-kernel/tree/experimental-typescript
文档写得特别好,但追不上代码更新速度:
5、更多讲解:https://learn.microsoft.com/en-us/semantic-kernel/overview/
6、更偏实操:https://github.com/microsoft/semantic-kernel/blob/main/python/notebooks/00-getting-started.ipynb
7、API Reference (目前只有C#): https://learn.microsoft.com/en-us/dotnet/api/microsoft.semantickernel?view=semantic-kernel-dotnet
8、更多生态:https://github.com/geffzhang/awesome-semantickernel
这里可以了解最新进展:https://learn.microsoft.com/en-us/semantic-kernel/get-started/supported-languages

2)SK的生态位

  • 补充
    微软将此技术栈命名为 Copilot Stack。
    在这里插入图片描述
  • 解释:
    1、Plugin extensibility: 插件扩展
    2、Copilots: AI 助手(副驾驶),例如 GitHub Copilot、Office 365 Copilot、Windows Copilot
    3、AI orchestration: AI 编排,SK 就在这里
    4、Foundation models: 基础大模型,例如 GPT-4
    5、AI infrastructure: AI 基础设施,例如 PyTorch、GPU

3)SK基础架构

在这里插入图片描述

  • 解释
    1、Models and Memory: 类比为大脑
    2、Connectors: 用来连接各种外部服务,类似驱动程序
    3、Plugins: 用来连接内部技能
    4、Triggers and actions: 外部系统的触发器和动作,类比为四肢
  • 说明
    1、Semantic Functions:通过 Prompt 实现的 LLM 能力
    2、Native Functions: 编程语言原生的函数功能
    3、在 SK 中,一组 Function 组成一个技能(Skill/Plugin)。要运行 Skill/Plugin,需要有一个配置和管理的单元,这个组织管理单元就是 Kernel。
    4、Kernel 负责管理底层接口与调用顺序,例如:OpenAI/Azure OpenAI 的授权信息、默认的 LLM 模型选择、对话上下文、技能参数的传递等等

二、环境搭建

  • 准备
    1、安装 Python 3.x:https://www.python.org/downloads/
    2、安装 SK 包:pip install semantic-kernel
    3、在项目目录创建 .env 文件,添加以下内容:
# .env
OPENAI_API_KEY=""
OPENAI_BASE_URL=""
AZURE_OPENAI_DEPLOYMENT_NAME=""
AZURE_OPENAI_ENDPOINT=""
AZURE_OPENAI_API_KEY=""
--OpenAI 和 Azure,配置好一个就行。

!pip install semantic-kernel==0.4.0.dev

1)初始化

  • 环境初始化
import semantic_kernel as sk
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
import os

# 加载 .env 到环境变量
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())

# 创建 semantic kernel
kernel = sk.Kernel()

# 配置 OpenAI 服务。OPENAI_BASE_URL 会被自动加载生效
api_key = os.getenv('OPENAI_API_KEY')
model = OpenAIChatCompletion(
    "gpt-3.5-turbo",
    api_key
)

# 把 LLM 服务加入 kernel
# 可以加多个。第一个加入的会被默认使用,非默认的要被指定使用
kernel.add_text_completion_service("my-demo", model)
  • 接口解释
划重点: 用我们熟悉的操作系统来类比,可以更好地理解 SK。
1、启动操作系统:kernel = sk.Kernel()
2、安装驱动程序:kernel.add_xxx_service()
3、安装应用程序:func = kernel.create_semantic_function()
4、运行应用程序:func()
  • 举例使用prompt说笑话(实验室版本)
# 定义 semantic function (实验室版本)
# 参数由{
   { }}标识

tell_joke_about = kernel.create_semantic_function("给我讲个关于{
   {$input}}的笑话吧")

# 运行 function 看结果
result = await kernel.run_async(
        tell_joke_about,
        input_str="Hello world"
    )
print(result)
  • 举例使用prompt说笑话
import asyncio

async def run_function(*args):
    return await kernel.invoke(*args)

result = asyncio.run(
    run_function(tell_joke_about, input_str="Hello world")
)
  • 新版加载方式
    注意:新版的加载方式将发生变化,详见:https://github.com/microsoft/semantic-kernel/blob/main/python/notebooks/03-prompt-function-inline.ipynb

2)Semantic Functions(不用编写代码,用配置实现回调函数)

  • 介绍
    Semantic Functions 是纯用数据(Prompt + 配置文件)定义的,不需要编写任何代码。所以它与编程语言无关,可以被任何编程语言调用
  • 组成
1、skprompt.txt: 存放 prompt,可以包含参数,还可以调用其它函数
2、config.json: 存放配置,包括函数功能,参数的数据类型,以及调用大模型时的参数
  • 举例:
    根据用户的自然语言指示,生成 Linux 命令
  • skprompt.txt
已知数据库结构为:

CREATE TABLE Courses (
    id INT AUTO_INCREMENT PRIMARY KEY,
    course_date DATE NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,
    course_name VARCHAR(255) NOT NULL,
    instructor VARCHAR(255) NOT NULL
);
请将下述用户输入转为SQL表达式
用户输入:{
   {
   $input}}

直接输出SQL语句,不要评论,不要分析,不要Markdown标识!
  • config.json
{
   
    "schema": 1,
    "type": "completion",
    "description": "将用户的输入转换成 SQL 语句",   #功能描述
    "completion": {
    
        "max_tokens": 256,
        "temperature": 0,
        "top_p": 0,
        "presence_penalty": 0,
        "frequency_penalty": 0
    },
    "input": {
   
        "parameters": [
            {
   
                "name": "input",
                "description": "用户的输入",
                "defaultValue": ""
            }
        ]
    }
}
  • 说明
    type 只有 “completion” 和 “embedding” 两种
  • 注意
    新版格式将发生变化,详见:https://github.com/microsoft/semantic-kernel/blob/main/python/notebooks/02-running-prompts-from-file.ipynb
  • 备注
    上面两个文件都在 demo/MyPlugins/Text2SQL/ 目录下。
    在这里插入图片描述
  • 附加(查询数据库)
from semantic_kernel.skill_definition import sk_function

class DBConnector:
    def __init__(self, db_cursor):
        self.db_cursor = db_cursor
        
    @sk_function(
        description="查询数据库", # function 描述
        name="query_database", # function 名字
    )
    def exec(self, sql_exp: str) -> str:
        self.db_cursor.execute(sql_exp)
        records = cursor.fetchall()
        return str(records)
  • 正式开始调用
# 加载 semantic function。注意目录结构
my_plugins = kernel.import_semantic_skill_from_directory(
    "./demo", "MyPlugins")

# 运行
result = await kernel.run_async(
    my_plugins["Text2SQL"],
    input_str="2024年4月有哪些课",
)
print(result)
  • 回复
SELECT * FROM Courses WHERE course_date BETWEEN '2024-04-01' AND '2024-04-30';
  • 若要维护多轮对话(加入历史)
    需求:例如我们要维护一个多轮对话,通过 request 和 history 两个变量分别存储 当前输入 和 对话历史
prompt = """对话历史如下:
{
   {$history}}
---
User: {
   {$request}}
Assistant:  """
  • 实际代码展示
history = []

while True:
    request = input("User > ").strip()
    if 
  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值