У нас сейчас есть задачка — при открытии стран надо модифицировать несколько проектов: добавить свитч-кейсы, прописать новые значения в нужных местах и сделать ПРы.
Идея – эту задачку выпнуть как-то на LLM. Звучит просто, но как представляешь себе реализацию — сразу ощущение надвигающейся геморройной жести с ифчиками и парсингом ответов от LLM.
А хочется, чтобы LLM сам решал, что делать: прочитать файл, создать ветку, закоммитить изменения, открыть PR. Но в голове сразу картинка: парсишь ответ от LLM, руками вызываешь нужную библиотеку, обрабатываешь результат, снова что-то парсишь. Руки опускались ещё на этапе проектирования.
А потом я наткнулся на Semantic Kernel. Про который много слышал, но не понимал что это.
Так вот! Фактически – это мини-агент который можно дергать через бэк. Типа мини-курсор или мини-копайлот.
Идея простая:
1️⃣ Ты описываешь инструменты — обычные C# методы, которые дергают апишки (к примеру гитхабовские) с атрибутом [KernelFunction] и Description.
2️⃣ SK подпихивает эти методы LLMке. Через рефлексию и вот это все.
3️⃣ Дальше запускается маленький агентный цикл: SK делает вызов, возвращает результат обратно в контекст — и так по кругу пока задача не решена.
И все это за вас! Написать агентный цикл в целом тот еще гемор, а тут все готово.
Вот так регаем инструмент:
[KernelFunction, Description("Создаёт pull request в репозитории")]
public async Task<string> CreatePullRequest(
[Description("Владелец репозитория")] string owner,
[Description("Название репозитория")] string repo,
[Description("Заголовок pull request")] string title,
[Description("Описание pull request")] string body,
[Description("Ветка с изменениями")] string headBranch,
[Description("Целевая ветка")] string baseBranch = "main")
{
var pr = await _client.PullRequest.Create(owner, repo,
new NewPullRequest(title, headBranch, baseBranch) { Body = body });
return $"PR создан: {pr.HtmlUrl}";
}
Вот так вызываем промпт:
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", openAiKey)
.Build();
kernel.Plugins.AddFromObject(new GitHubPlugin(githubToken), "GitHub");
var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
Дальше говоришь агенту: «отредактируй README.md в owner/repo, добавь раздел Installation, создай PR» — и он сам читает файл, создаёт ветку, коммитит изменения и открывает PR. Без единого ифчика с твоей стороны.
Вот тут можете посмотреть как это все работает: https://github.com/Undermove/csharpshortpostsexamples/tree/main/SemanticKernelExample.
🅰️ Итого: Если у вас есть ощущение, что вы хотите на бэке иметь под некоторые задачи мини-агента, который бы взаимодействовал с апишками, то попробуйте Semantic Kernel в качестве обертки.