Когда я впервые запустил SK и он сам прочитал файл, создал ветку и открыл PR — у меня был вопрос: а как он вообще понял что надо делать именно в такой последовательности? И точно ли он не промахнётся?
Так вот, под капотом там не магия, а как мы посмотрели выше:
1️⃣ SK сериализует все твои [KernelFunction] методы в JSON-схему — название функции, её Description и описания каждого параметра — и отдаёт всё это LLM вместе с промптом.
2️⃣ LLM смотрит на задачу и список доступных инструментов, выбирает нужный и возвращает не текст, а структурированный вызов функции с параметрами.
3️⃣ SK перехватывает этот вызов, выполняет твой C# метод, результат кладёт обратно в контекст.
4️⃣ LLM смотрит на результат и решает: задача решена или нужно ещё что-то сделать? Если нужно — идёт новый круг.
Написать такой цикл руками — тот ещё гемор, как я уже говорил. SK делает это за вас.
Теперь про надёжность. Можно ли на него положиться? Честный ответ: зависит от того насколько хорошо ты написал Description. LLM выбирает тул не телепатией, а на основе текста описания (хотя рефлексия это тот еще спиритизм!). Написал «создаёт PR в репозитории» — попадёт точно. Написал «делает штуку с гитхабом» — промахнётся. Это примерно как с промптами: мусор на входе, мусор на выходе.
Короче, качество Description — это единственное место где нужно думать все еще 🙁.
Ещё один момент — если хочешь чтобы агент не снес тебе прод, то SK умеет перехватывать вызовы через фильтры! Можно логировать каждый тул-вызов или попросить подтверждение перед тем как агент что-то реально запишет в репозиторий. Но про его фичи я еще чуть подробнее расскажу думаю