万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程

📅 2026/7/2 6:02:34
万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程
很多人想学习 AI但是不知道怎么入门。笔者开始也是先是学习了 Python然后是 Tensorflow 还准备看一堆深度学习的书。但是逐渐发现这些知识太深奥了无法在短时间内学会。此外还有另一个问题学这些对自己有什么帮助虽然学习这些技术是很 NB但是对自己作用有多大自己到底需要学什么这这段时间接触了一些需求先后搭建了一些聊天工具和 Fastgpt 知识库平台经过一段时间的使用和研究之后开始确定了学习目标是能够做出这些应用。而做出这些应用是不需要深入学习 AI 相关底层知识的。所以AI 的知识宇宙非常庞大那些底层的细节我们可能无法探索但是并不重要我们只需要能够做出有用的产品即可。基于此本文的学习重点在于 Semantic Kernel 和 Kernel Memory 两个框架我们学会这两个框架之后可以编写聊天工具、知识库工具。配置环境要学习本文的教程也很简单只需要有一个 Open AI、Azure Open AI 即可甚至可以使用国内百度文心。下面我们来了解如何配置相关环境。部署 one-api部署 one-api 不是必须的如果有 Open AI 或 Azure Open AI 账号可以直接跳过。如果因为账号或网络原因不能直接使用这些 AI 接口可以使用国产的 AI 模型然后使用 one-api 转换成 Open AI 格式接口即可。one-api 的作用是支持各种大厂的 AI 接口比如 Open AI、百度文心等然后在 one-api 上创建一层新的、与 Open AI 一致的。这样一来开发应用时无需关注对接的厂商不需要逐个对接各种 AI 模型大大简化了开发流程。one-api 开源仓库地址GitHub - songquanpeng/one-api: LLM API 管理 分发系统支持 OpenAI、Azure、Anthropic Claude、Google Gemini、DeepSeek、字节豆包、ChatGLM、文心一言、讯飞星火、通义千问、360 智脑、腾讯混元等主流模型统一 API 适配可用于 key 管理与二次分发。单可执行文件提供 Docker 镜像一键部署开箱即用。LLM API management key redistribution system, unifying multiple providers under a single API. Single binary, Docker-ready, with an English UI. · GitHub界面预览下载官方仓库git clone https://github.com/songquanpeng/one-api.git文件目录如下. ├── bin ├── common ├── controller ├── data ├── docker-compose.yml ├── Dockerfile ├── go.mod ├── go.sum ├── i18n ├── LICENSE ├── logs ├── main.go ├── middleware ├── model ├── one-api.service ├── pull_request_template.md ├── README.en.md ├── README.ja.md ├── README.md ├── relay ├── router ├── VERSION └── webone-api 需要依赖 redis、mysql 在 docker-compose.yml 配置文件中有详细的配置同时 one-api 默认管理员账号密码为 root、123456也可以在此修改。执行docker-compose up -d开始部署 one-api然后访问 3000 端口进入管理系统。进入系统后首先创建渠道渠道表示用于接入大厂的 AI 接口。为什么有模型重定向和自定义模型呢。比如笔者的 Azure Open AI 是不能直接选择使用模型的而是使用模型创建一个部署然后通过指定的部署使用模型因此在 api 中不能直接指定使用 gpt-4-32k 这个模型而是通过部署名称使用在模型列表中选择可以使用的模型而在模型重定向中设置部署的名称。然后在令牌中创建一个与 open ai 官方一致的 key 类型外部可以通过使用这个 key从 one-api 的 api 接口中使用相关的 AI 模型。one-api 的设计相对于一个代理平台我们可以通过后台接入自己账号的 AI 模型然后创建二次代理的 key 给其他人使用可以在里面配置每个账号、key 的额度。创建令牌之后复制和保存即可。使用 one-api 接口时只需要使用http://192.0.0.1:3000/v1格式作为访问地址即可后面需不需要加/v1视情况而定一般需要携带。配置项目环境创建一个 BaseCore 项目在这个项目中复用重复的代码编写各种示例时可以复用相同的代码引入 Microsoft.SemanticKernel 包。因为开发时需要使用到密钥等相关信息因此不太好直接放到代码里面这时可以使用环境变量或者 json 文件存储相关私密数据。以管理员身份启动 powershell 或 cmd添加环境变量后立即生效不过需要重启 vs。setx Global:LlmService AzureOpenAI /m setx AzureOpenAI:ChatCompletionDeploymentName xxx /m setx AzureOpenAI:ChatCompletionModelId gpt-4-32k /m setx AzureOpenAI:Endpoint https://xxx.openai.azure.com /m setx AzureOpenAI:ApiKey xxx /m或者在 appsettings.json 配置。{ Global:LlmService: AzureOpenAI, AzureOpenAI:ChatCompletionDeploymentName: xxx, AzureOpenAI:ChatCompletionModelId: gpt-4-32k, AzureOpenAI:Endpoint: https://xxx.openai.azure.com, AzureOpenAI:ApiKey: xxx }然后在 Env 文件中加载环境变量或 json 文件读取其中的配置。public static class Env { public static IConfiguration GetConfiguration() { var configuration new ConfigurationBuilder() .AddJsonFile(appsettings.json) .AddEnvironmentVariables() .Build(); return configuration; } }模型划分和应用场景在学习开发之前我们需要了解一下基础知识以便可以理解编码过程中关于模型的一些术语当然在后续编码过程中笔者也会继续介绍相应的知识。以 Azure Open AI 的接口为例以以下相关的函数虽然这些接口都是连接到 Azure Open AI 的但是使用的是不同类型的模型对应的使用场景也不一样相关接口的说明如下// 文本生成 AddAzureOpenAITextGeneration() // 文本解析为向量 AddAzureOpenAITextEmbeddingGeneration() // 大语言模型聊天 AddAzureOpenAIChatCompletion() // 文本生成图片 AddAzureOpenAITextToImage() // 文本合成语音 AddAzureOpenAITextToAudio() // 语音生成文本 AddAzureOpenAIAudioToText()因为 Azure Open AI 的接口名称跟 Open AI 的接口名称只在于差别一个 ”Azure“ 因此本文读者基本只提 Azure 的接口形式。这些接口使用的模型类型也不一样其中 GPT-4 和 GPT3.5 都可以用于文本生成和大模型聊天其它的模型在功能上有所区别。模型作用说明GPT-4文本生成、大模型聊天一组在 GPT-3.5 的基础上进行了改进的模型可以理解并生成自然语言和代码。GPT-3.5文本生成、大模型聊天一组在 GPT-3 的基础上进行了改进的模型可以理解并生成自然语言和代码。Embeddings文本解析为向量一组模型可将文本转换为数字矢量形式以提高文本相似性。DALL-E文本生成图片一系列可从自然语言生成原始图像的模型预览版。Whisper语音生成文本可将语音转录和翻译为文本。Text to speech文本合成语音可将文本合成为语音。目前文本生成、大语言模型聊天、文本解析为向量是最常用的为了避免文章篇幅过长以及内容过于复杂导致难以理解因此本文只讲解这三类模型的使用方法其它模型的使用读者可以查阅相关资料。聊天聊天模型主要有 gpt-4 和 gpt-3.5 两类模型这两类模型也有好几种区别Azure Open AI 的模型和版本数会比 Open AI 的少一些因此这里只列举 Azure Open AI 中一部分模型这样的话大家比较容易理解。只说 gpt-4gpt-3.5 这里就不提了。详细的模型列表和说明读者可以参考对应的官方资料。使用 Azure Open AI 官方模型说明地址https://learn.microsoft.com/zh-cn/azure/ai-services/openai/concepts/modelsOpen AI 官方模型说明地址https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turboGPT-4 的一些模型和版本号如下模型 ID最大请求令牌训练数据上限gpt-4(0314)8,1922021 年 9 月gpt-4-32k(0314)32,7682021 年 9 月gpt-4(0613)8,1922021 年 9 月gpt-4-32k(0613)32,7682021 年 9 月gpt-4-turbo-preview输入128,000输出4,0962023 年 4 月gpt-4-turbo-preview输入128,000输出4,0962023 年 4 月gpt-4-vision-turbo-preview输入128,000输出4,0962023 年 4 月简单来说 gpt-4、gpt-4-32k 区别在于支持 tokens 的最大长度32k 即 32000 个 tokenstokens 越大表示支持的上下文可以越多、支持处理的文本长度越大。gpt-4 、gpt-4-32k 两个模型都有 0314、0613 两个版本这个跟模型的更新时间有关越新版本参数越多比如 314 版本包含 1750 亿个参数而 0613 版本包含 5300 亿个参数。参数数量来源于互联网笔者不确定两个版本的详细区别。总之模型版本越新越好。接着是 gpt-4-turbo-preview 和 gpt-4-vision 的区别gpt-4-version 具有理解图像的能力而 gpt-4-turbo-preview 则表示为 gpt-4 的增强版。这两个的 tokens 都贵一些。由于配置模型构建服务的代码很容易重复编写配置代码比较繁杂因此在 Env.cs 文件中添加以下内容用于简化配置和复用代码。下面给出 Azure Open AI、Open AI 使用大语言模型构建服务的相关代码public static IKernelBuilder WithAzureOpenAIChat(this IKernelBuilder builder) { var configuration GetConfiguration(); var AzureOpenAIDeploymentName configuration[AzureOpenAI:ChatCompletionDeploymentName]!; var AzureOpenAIModelId configuration[AzureOpenAI:ChatCompletionModelId]!; var AzureOpenAIEndpoint configuration[AzureOpenAI:Endpoint]!; var AzureOpenAIApiKey configuration[AzureOpenAI:ApiKey]!; builder.Services.AddLogging(c { c.AddDebug() .SetMinimumLevel(LogLevel.Information) .AddSimpleConsole(options { options.IncludeScopes true; options.SingleLine true; options.TimestampFormat yyyy-MM-dd HH:mm:ss ; }); }); // 使用 Chat 即大语言模型聊天 builder.Services.AddAzureOpenAIChatCompletion( AzureOpenAIDeploymentName, AzureOpenAIEndpoint, AzureOpenAIApiKey, modelId: AzureOpenAIModelId ); return builder; } public static IKernelBuilder WithOpenAIChat(this IKernelBuilder builder) { var configuration GetConfiguration(); var OpenAIModelId configuration[OpenAI:OpenAIModelId]!; var OpenAIApiKey configuration[OpenAI:OpenAIApiKey]!; var OpenAIOrgId configuration[OpenAI:OpenAIOrgId]!; builder.Services.AddLogging(c { c.AddDebug() .SetMinimumLevel(LogLevel.Information) .AddSimpleConsole(options { options.IncludeScopes true; options.SingleLine true; options.TimestampFormat yyyy-MM-dd HH:mm:ss ; }); }); // 使用 Chat 即大语言模型聊天 builder.Services.AddOpenAIChatCompletion( OpenAIModelId, OpenAIApiKey, OpenAIOrgId ); return builder; }Azure Open AI 比 Open AI 多一个 ChatCompletionDeploymentName 是指部署名称。接下来我们开始第一个示例直接向 AI 提问并打印 AI 回复using Microsoft.SemanticKernel; var builder Kernel.CreateBuilder(); builder builder.WithAzureOpenAIChat(); var kernel builder.Build(); Console.WriteLine(请输入你的问题); // 用户问题 var request Console.ReadLine(); FunctionResult result await kernel.InvokePromptAsync(request); Console.WriteLine(result.GetValuestring());启动程序后在终端输入Mysql如何查看表数量这段代码非常简单输入问题然后使用kernel.InvokePromptAsync(request);提问拿到结果后使用result.GetValuestring()提取结果为字符串然后打印出来。这里有两个点可能读者有疑问。第一个是kernel.InvokePromptAsync(request);。Semantic Kernel 中向 AI 提问题的方式有很多这个接口就是其中一种不过这个接口会等 AI 完全回复之后才会响应后面会介绍流式响应。另外在 AI 对话中用户的提问、上下文对话这些不严谨的说法来看都可以叫 prompt也就是提示。为了优化 AI 对话有一个专门的技术就叫提示工程。关于这些这里就不赘述了后面会有更多说明。第二个是result.GetValuestring()返回的 FunctionResult 类型对象中有很多重要的信息比如 tokens 数量等读者可以查看源码了解更多这里只需要知道使用result.GetValuestring()可以拿到 AI 的回复内容即可。大家在学习工程中可以降低日志等级以便查看详细的日志有助于深入了解 Semantic Kernel 的工作原理。修改.WithAzureOpenAIChat()或.WithOpenAIChat()中的日志配置。.SetMinimumLevel(LogLevel.Trace)重新启动后会发现打印非常多的日志。可以看到我们输入的问题日志中显示为Rendered prompt: Mysql如何查看表数量。Prompt tokens: 26. Completion tokens: 183. Total tokens: 209.Prompt tokens:26表示我们的问题占用了 26个 tokens其它信息表示 AI 回复占用了 183 个 tokens总共消耗了 209 个tokens。之后控制台还打印了一段 json{ ToolCalls: [], Role: { Label: assistant }, Content: 在 MySQL 中可以使用以下查询来查看特定数据库......, Items: null, ModelId: myai, ... ... Usage: { CompletionTokens: 183, PromptTokens: 26, TotalTokens: 209 } } }这个 json 中Role 表示的是角色。Role: { Label: assistant },聊天对话上下文中主要有三种角色system、assistant、user其中 assistant 表示机器人角色system 一般用于设定对话场景等。我们的问题都是以 prompt 的形式提交给 AI 的。从日志的Prompt tokens: 26. Completion tokens: 183可以看到prompt 表示提问的问题。之所以叫 prompt是有很多原因的。prompt 在大型语言模型(Large Language ModelsLLMs) AI 的通信和行为指导中起着至关重要的作用。它们充当输入或查询用户可以提供这些输入或查询从而从模型中获得特定的响应。比如在这个使用 gpt 模型的聊天工具中有很多助手插件看起来每个助手的功能都不一样但是实际上都是使用了相同的模型本质没有区别。最重要的是在于提示词上的区别在使用会话时给 AI 配置提示词。打开对话还没有开始用呢就扣了我 438 个 tokens这是因为这些背景设定都会出现在提示词里面占用一部分 tokens。我只提问了一句话但是 prompt 却包含了更多东西。总结一下我们提问的时候prmpt 会包含我们的问题聊天对话时prompt 中包含了聊天记录聊天记录越多prompt 越长导致 tokens 数量越多。prompt 除了包含我们的问题、聊天记录还有可以包含一些相关的背景知识等。对话时不同的背景知识可以让 AI 有不一样的回复。比如设计一个抬杆高手对用户问题进行抬杆那么在用户提问的时候需要配置相关的背景知识。Console.WriteLine(请输入你的问题); // 用户问题 var request Console.ReadLine(); string prompt $ 向用户展示抬杠的艺术能顺利与用户进行对话抬出自己的杠对用户的任何观点进行反驳说话用词尖酸刻薄。作为抬杠高手我说话就是尖酸刻薄一上来就是阴阳怪气。 用户问题 {request} ; FunctionResult result await kernel.InvokePromptAsync(prompt); Console.WriteLine(result.GetValuestring());问题和机器人回复请输入你的问题 巧克力真好吃 哎这就错了。巧克力好吃这才是大家普遍接受的观点。你有没有想过巧克力中蕴含的糖分和脂肪是多么的高呢不仅对于身体健康有害还会导致肥胖和蛀牙。何况巧克力太过甜腻会让人的味蕾逐渐麻木无法品尝到其他食物的真正美味。还有一点巧克力的生产过程严重破坏了环境大面积种植会导致森林退化和土壤侵蚀。你还敢说巧克力好吃吗那么是如何实现聊天对话的呢大家使用 chat 聊天工具时AI 会根据以前的问题进行下一步补充我们不需要重复以前的问题。这在于每次聊天时需要将历史记录一起带上去如果聊天记录太多这就导致后面对话中携带过多的聊天内容。