{"id":623,"date":"2026-03-02T21:29:25","date_gmt":"2026-03-03T00:29:25","guid":{"rendered":"http:\/\/www.wagnersalvi.com.br\/?p=623"},"modified":"2026-03-09T21:30:59","modified_gmt":"2026-03-10T00:30:59","slug":"o-que-e-o-semantic-kernel","status":"publish","type":"post","link":"http:\/\/www.wagnersalvi.com.br\/?p=623","title":{"rendered":"O que \u00e9 o Semantic Kernel?"},"content":{"rendered":"\n<p>Imagine o Semantic Kernel como um <strong>&#8220;Maestro&#8221;<\/strong>. Ele n\u00e3o \u00e9 o modelo de IA em si (como o Gemini ou o GPT), mas sim a estrutura que permite que voc\u00ea conecte o seu c\u00f3digo C# a esses modelos.<\/p>\n\n\n\n<p>A grande vantagem \u00e9 a <strong>abstra\u00e7\u00e3o<\/strong>.  Se amanh\u00e3 voc\u00ea quiser trocar para o OpenAI, voc\u00ea mudaria poucas linhas de configura\u00e7\u00e3o, e o resto do seu &#8220;c\u00e9rebro&#8221; (plugins e l\u00f3gica) continuaria funcionando. Isso \u00e9 o que chamamos de suporte a <strong>&#8220;n&#8221; modelos<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Por que usar o Semantic Kernel?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Orquestra\u00e7\u00e3o de Plugins:<\/strong> Ele permite que a IA &#8220;saia da caixa&#8221; e interaja com o mundo real (como ler sua agenda ou enviar um e-mail).<\/li>\n\n\n\n<li><strong>Independ\u00eancia de Modelo:<\/strong> Voc\u00ea n\u00e3o fica &#8220;preso&#8221; a um \u00fanico fornecedor. Pode usar Gemini, OpenAI, Mistral ou modelos locais (Llama).<\/li>\n\n\n\n<li><strong>Nativo para Desenvolvedores:<\/strong> Ele traz conceitos de engenharia de software (como inje\u00e7\u00e3o de depend\u00eancia e interfaces) para o mundo da IA.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo Pr\u00e1tico em C# e Gemini (google)<\/h3>\n\n\n\n<p>Abaixo temos um c\u00f3digo em c# completo que iremos explicar passo a passo.  A chave deve ser criada no Google AI Studio que existe op\u00e7\u00e3o free com limita\u00e7\u00f5es de acessos por minuto e por isso faremos os testes usando ele para que todos possam praticar<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System.ComponentModel;\nusing Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.Connectors.Google;\n\n\/\/ =========================================================================\n\/\/ 1. CONFIGURA\u00c7\u00c3O DO KERNEL\n\/\/ =========================================================================\n\nvar builder = Kernel.CreateBuilder();\n\n\nbuilder.AddGoogleAIGeminiChatCompletion(\n\tmodelId: \"gemini-flash-latest\",\n\tapiKey: \"&lt;Sua Chave da API>\",\n\tapiVersion: GoogleAIVersion.V1_Beta \n);\n\n\/\/ Adicionando nosso plugin de agenda\nbuilder.Plugins.AddFromType&lt;AgendaPlugin>();\n\nvar kernel = builder.Build();\n\n\/\/ Configurando para a IA chamar as fun\u00e7\u00f5es automaticamente\nvar settings = new PromptExecutionSettings\n{\n\tFunctionChoiceBehavior = FunctionChoiceBehavior.Auto()\n};\n\n\/\/ =========================================================================\n\/\/ 2. LOOP DE EXECUCAO\n\/\/ =========================================================================\n\nConsole.WriteLine(\"Assistente de Agenda Pronto!\");\nConsole.WriteLine(\"(Digite 'sair' para encerrar)\\n\");\n\nwhile (true)\n{\n\tConsole.Write(\"Voc\u00ea: \");\n\tstring? input = Console.ReadLine();\n\n\tif (string.IsNullOrWhiteSpace(input) || input.ToLower() == \"sair\") break;\n\n\ttry\n\t{\n\t\t\/\/ O Kernel gerencia a conversa e decide se precisa chamar o C#\n\t\tvar resposta = await kernel.InvokePromptAsync(input, new(settings));\n\t\tConsole.WriteLine($\"\\nGemini: {resposta}\\n\");\n\t}\n\tcatch (Exception ex)\n\t{\n\t\tConsole.WriteLine($\"\\nErro na execu\u00e7\u00e3o: {ex.Message}\");\n\t}\n}\n\n\/\/ =========================================================================\n\/\/ 3. DEFINI\u00c7\u00c3O DOS PLUGINS\n\/\/ =========================================================================\n\npublic class AgendaPlugin\n{\n\t\/\/ Simulando dados de uma agenda\n\tprivate readonly List&lt;string> _ocupados = [\"14:00\", \"14:30\", \"16:00\"];\n\n\t[KernelFunction, Description(\"Verifica se um hor\u00e1rio (ex: 14:00) est\u00e1 livre ou ocupado.\")]\n\tpublic string VerificarDisponibilidade(string horario)\n\t{\n\t\tConsole.WriteLine($\"   [LOG C#]: Verificando {horario}...\");\n\t\treturn _ocupados.Contains(horario) ? \"Ocupado\" : \"Livre\";\n\t}\n\n\t[KernelFunction, Description(\"Lista todos os hor\u00e1rios que j\u00e1 t\u00eam compromisso hoje.\")]\n\tpublic string ListarAgenda()\n\t{\n\t\tConsole.WriteLine(\"   [LOG C#]: Consultando lista completa...\");\n\t\treturn \"Hor\u00e1rios ocupados: \" + string.Join(\", \", _ocupados);\n\t}\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">1. O Builder: A Funda\u00e7\u00e3o do seu Agente<\/h3>\n\n\n\n<p>No <strong>Semantic Kernel<\/strong>, tudo come\u00e7a com o <code>Kernel.CreateBuilder()<\/code>. Pense nele como uma linha de montagem onde voc\u00ea escolhe quais &#8220;habilidades&#8221; e &#8220;conex\u00f5es&#8221; seu assistente ter\u00e1 antes de ele come\u00e7ar a funcionar.<\/p>\n\n\n\n<p>O trecho de c\u00f3digo que resolve o nosso problema \u00e9 este:<\/p>\n\n\n\n<p>C#<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var builder = Kernel.CreateBuilder();\n\nbuilder.AddGoogleAIGeminiChatCompletion(\n    modelId: \"gemini-flash-latest\",\n    apiKey: \"SUA_CHAVE_AQUI\",\n    apiVersion: GoogleAIVersion.V1_Beta \n);\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Por que esse trecho \u00e9 vital?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Identidade do Modelo (<code>modelId<\/code>)<\/strong>: Diferente de outras APIs, o Google AI Studio pode ter nomes espec\u00edficos para os modelos (como o <code>gemini-flash-latest<\/code> que usamos). O Semantic Kernel usa isso para saber exatamente qual &#8220;c\u00e9rebro&#8221; invocar.<\/li>\n\n\n\n<li><strong>Inje\u00e7\u00e3o de Depend\u00eancia<\/strong>: O <code>builder<\/code> permite que voc\u00ea adicione plugins (como a nossa agenda) de forma modular. Isso significa que a l\u00f3gica de neg\u00f3cio (C#) e a l\u00f3gica de IA (Gemini) ficam organizadas e separadas.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. O Poder dos Plugins: Transformando C# em Habilidades<\/h3>\n\n\n\n<p>No post, explicaremos que um Plugin no Semantic Kernel \u00e9 basicamente uma classe C# comum, mas com &#8220;superpoderes&#8221; conferidos por atributos.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">O que faz o c\u00f3digo funcionar?<\/h4>\n\n\n\n<p>O trecho que define nosso plugin usa o atributo <code>[KernelFunction]<\/code>. Veja por que ele \u00e9 especial:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>[KernelFunction]<\/code><\/strong>: Este atributo sinaliza ao Kernel que este m\u00e9todo espec\u00edfico est\u00e1 dispon\u00edvel para a IA. Sem isso, o Gemini nunca saberia que o m\u00e9todo existe.<\/li>\n\n\n\n<li><strong><code>[Description]<\/code><\/strong>: Isso \u00e9 <strong>fundamental<\/strong>. A IA n\u00e3o l\u00ea o seu c\u00f3digo C#, ela l\u00ea as descri\u00e7\u00f5es que voc\u00ea escreve. \u00c9 atrav\u00e9s dessas frases que o Gemini entende: <em>&#8220;Ah, se o usu\u00e1rio perguntar sobre hor\u00e1rios, eu devo chamar a fun\u00e7\u00e3o VerificarDisponibilidade&#8221;<\/em>.<\/li>\n\n\n\n<li><strong>Tipagem Forte<\/strong>: O Semantic Kernel traduz automaticamente os tipos do C# (como <code>string<\/code> ou <code>int<\/code>) para que a IA saiba o que enviar como par\u00e2metro.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">A &#8220;M\u00e1gica&#8221; da Escolha Autom\u00e1tica<\/h4>\n\n\n\n<p>No seu c\u00f3digo, usamos esta configura\u00e7\u00e3o: <code>FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()<\/code><\/p>\n\n\n\n<p>Isso diz ao Kernel: <em>&#8220;Gemini, analise o que o usu\u00e1rio pediu. Se voc\u00ea achar que uma das minhas fun\u00e7\u00f5es C# pode ajudar a responder, execute-a automaticamente e use o resultado para formular sua resposta final&#8221;<\/em>.<\/p>\n\n\n\n<p>Cheg\u00e1mos \u00e0 parte onde tudo ganha vida: o <strong>Loop de Execu\u00e7\u00e3o<\/strong>! <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. O Loop de Execu\u00e7\u00e3o: Onde a Conversa Acontece<\/h3>\n\n\n\n<p>Depois de configurarmos o <strong>Kernel<\/strong> e carregarmos os <strong>Plugins<\/strong>, precisamos de criar um espa\u00e7o para o utilizador falar com a IA. \u00c9 aqui que entra o ciclo <code>while<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">O que este trecho faz?<\/h4>\n\n\n\n<p>C#<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">while (true)\n{\n    var resposta = await kernel.InvokePromptAsync(input, new(settings));\n    Console.WriteLine($\"\\nGemini: {resposta}\\n\");\n}\n<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Intera\u00e7\u00e3o Cont\u00ednua<\/strong> \ud83d\udd01: O <code>while (true)<\/code> garante que o programa n\u00e3o feche ap\u00f3s a primeira resposta. Ele mant\u00e9m o assistente &#8220;acordado&#8221; at\u00e9 que o utilizador decida sair.<\/li>\n\n\n\n<li><strong>Processamento Inteligente (<code>InvokePromptAsync<\/code>)<\/strong> : Este \u00e9 o comando principal. Ele envia o texto do utilizador para o Gemini. Gra\u00e7as \u00e0s <code>settings<\/code> que configur\u00e1mos antes, o Kernel n\u00e3o apenas gera texto, mas tamb\u00e9m verifica se precisa de &#8220;chamar&#8221; alguma fun\u00e7\u00e3o do C# antes de responder.<\/li>\n\n\n\n<li><strong>Tratamento de Erros<\/strong> : O bloco <code>try-catch<\/code> \u00e9 essencial. Se a internet falhar ou se a API atingir um limite, o programa n\u00e3o vai simplesmente &#8220;parar de forma abruptA&#8221;; ele avisar\u00e1 o utilizador sobre o problema.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Por que o Semantic Kernel \u00e9 o Futuro do Desenvolvimento com IA?<\/h3>\n\n\n\n<p>O que vimos hoje n\u00e3o foi apenas uma forma de conectar o C# ao Gemini. O <strong>Semantic Kernel<\/strong> (SK) introduz uma camada de abstra\u00e7\u00e3o que resolve problemas cr\u00edticos de engenharia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Agnosticismo de Modelo<\/strong>: O c\u00f3digo que escrevemos hoje para o Gemini poderia ser adaptado para o GPT-4 ou um modelo local (Llama 3) com altera\u00e7\u00f5es m\u00ednimas. Isso protege o seu projeto contra mudan\u00e7as de mercado ou de pre\u00e7os. \ud83d\udd04<\/li>\n\n\n\n<li><strong>Seguran\u00e7a e Governan\u00e7a<\/strong>: Ao usar <strong>Plugins<\/strong>, voc\u00ea controla exatamente o que a IA pode ou n\u00e3o acessar. O Gemini n\u00e3o &#8220;inventa&#8221; dados da sua agenda; ele solicita ao seu c\u00f3digo C#, que atua como um guardi\u00e3o dos dados. \ud83d\udee1\ufe0f<\/li>\n\n\n\n<li><strong>Escalabilidade<\/strong>: Diferente de enviar prompts gigantescos, o SK permite que voc\u00ea organize habilidades em bibliotecas reutiliz\u00e1veis, facilitando a manuten\u00e7\u00e3o de projetos grandes e complexos. \ud83c\udfd7\ufe0f<\/li>\n<\/ul>\n\n\n\n<p>Em resumo, o Semantic Kernel transforma a IA generativa em uma <strong>ferramenta de software previs\u00edvel e integrada<\/strong>, permitindo que n\u00f3s, desenvolvedores, foquemos no que realmente importa: resolver problemas de neg\u00f3cio com intelig\u00eancia.<\/p>\n<p>Views: 4<\/p>","protected":false},"excerpt":{"rendered":"<p>Imagine o Semantic Kernel como um &#8220;Maestro&#8221;. Ele n\u00e3o \u00e9 o modelo de IA em si (como o Gemini ou [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":625,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[30,73,49],"tags":[62,236,70,274],"class_list":["post-623","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimento","category-inteligencia-artificial","category-programacao","tag-c","tag-gemini","tag-inteligencia-artificial","tag-semantic-kernel"],"_links":{"self":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/623","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=623"}],"version-history":[{"count":5,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/623\/revisions"}],"predecessor-version":[{"id":630,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/623\/revisions\/630"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/media\/625"}],"wp:attachment":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=623"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}