Как заставить GPT писать рабочий C# код для ZennoPoster: секреты системных промптов

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 882
Благодарностей
1 263
Баллы
113
Скажу сразу, я не программист, к программированию имею такое же отношению как к строительству мостов – красиво, но непонятно.

❓ Если у тебя возник вопрос «В чем проблема написать снипет для ЗП», значит ты уже постиг дзен и тебе эта тема не нужна, но на форуме масса примеров, когда даже не новичок задается вопросом - «Как мне сделать что бы ...? ГПТ дает нерабочий код». Дьявол как обычно кроется в деталях, а точнее в систем промт. Если сходу вбить в чат свой вопрос, каким бы подробным он не был, все равно ты получишь код, который без доработки напильником с 90% вероятностью работать в кубике ZP не будет.

Я в свое время тоже намучался, давал уточнения и пояснения, что делать, а чего не нужно писать, но все равно, для получения рабочего кода, который будет работать в кубике scharp приходилось попотеть, с первого же раза код, который бы работал не выходил почти никогда. Для ГПТ чата мы все извращенцы со своими тараканами и ненормальными хотелками, которые в правила кодописания не укладываются.

После осознания, что без систем промта не обойтись, я начал его составлять. Задавал правила написания кода, стили, примеры, в том формате, что бы на выходе, в 99% случаях получать валидный результат. Подключал к написанию саму нейросеть, которая вносила своё понимание как нужно писать код для зенки. По прошествии полугода получил то, чем готов поделится с сообществом.

‍ В качестве примера рассмотрим простой вариант, когда нужно обработать JSON и получить необходимые значения в переменные.

напиши код сишарп.
Есть джсон в переменной json:

{"name":"ExampleName","code":"SGVsbG8gd29ybGQh"}
значение name берем в переменную name
з
начение соде - расшифровываем из бас64 и кладем в переменную code

Можно задание давать в произвольной форме, без сантиментов, но желательно, что бы логические шаги были выстроены так, как Буд-то вы пишете ТЗ для профессионала, как его понимаете вы.

https://chat.qwen.ai/
❌ Что выдает нам чат без использования систем промт
C#:
using System;
using System.Text;
using System.Text.Json;

class Program
{
    static void Main()
    {
        // Пример JSON строки
        string jsonString = "{\"name\":\"ExampleName\",\"code\":\"SGVsbG8gd29ybGQh\"}";

        // Десериализация JSON
        JsonDocument jsonDoc = JsonDocument.Parse(jsonString);
        JsonElement root = jsonDoc.RootElement;

        // Извлечение значения name
        string name = root.GetProperty("name").GetString();
        Console.WriteLine($"Name: {name}");

        // Извлечение и декодирование значения code из Base64
        string base64Code = root.GetProperty("code").GetString();
        byte[] data = Convert.FromBase64String(base64Code);
        string code = Encoding.UTF8.GetString(data);
        Console.WriteLine($"Decoded Code: {code}");
    }
}
Как видно, тут присутствуют все признаки того, что код не будет работать в кубике, это и using, и static void Main(), и конечно же Console.WriteLine, куде же без него :-)

✅ А теперь закинем в новый чат наш систем промт и зададим тот же самый вопрос
C#:
// Допустим, что JSON находится в переменной project.Variables["json"].Value
string json = project.Variables["json"].Value;

// Десериализация JSON
var obj = Global.ZennoLab.Json.JsonConvert.DeserializeObject<dynamic>(json);

// Получение значения name
string name = obj.name;

// Расшифровка значения code из Base64
string codeBase64 = obj.code;
string code = Encoding.UTF8.GetString(Convert.FromBase64String(codeBase64));

// Сохранение значений в переменные проекта
project.Variables["name"].Value = name;
project.Variables["code"].Value = code;
Как видим, ничего лишнего, только рабочий код.

https://claude.ai/
❌ без систем промт
C#:
using System;
using System.Text;
using Newtonsoft.Json;

class Program
{
    static void Main()
    {
        // JSON строка
        string json = "{\"name\":\"ExampleName\",\"code\":\"SGVsbG8gd29ybGQh\"}";

        // Десериализация JSON
        dynamic jsonObject = JsonConvert.DeserializeObject(json);

        // Получение значения name
        string name = jsonObject.name;

        // Получение значения code и декодирование из Base64
        string base64Code = jsonObject.code;
        byte[] codeBytes = Convert.FromBase64String(base64Code);
        string code = Encoding.UTF8.GetString(codeBytes);

        // Вывод результатов
        Console.WriteLine($"Имя: {name}");
        Console.WriteLine($"Декодированный код: {code}");
    }
}
✅ с использованием системного промта
C#:
// Предполагаем, что JSON строка уже хранится в переменной проекта
string json = project.Variables["json"].Value;

// Парсим JSON
project.Json.FromString(json);

// Получаем значение "name" и сохраняем в переменную "name"
if (!project.Variables.Keys.Contains("name")){
    object obj = project.Variables;
    obj.GetType().GetMethod("QuickCreateVariable").Invoke(obj, new Object[]{"name"});
}
project.Variables["name"].Value = project.Json.name;

// Получаем значение "code", декодируем из Base64 и сохраняем в переменную "code"
string base64Code = project.Json.code;
string decodedCode = Encoding.UTF8.GetString(Convert.FromBase64String(base64Code));

if (!project.Variables.Keys.Contains("code")){
    object obj = project.Variables;
    obj.GetType().GetMethod("QuickCreateVariable").Invoke(obj, new Object[]{"code"});
}
project.Variables["code"].Value = decodedCode;

// Логирование для проверки (опционально)
project.SendInfoToLog($"Имя: {project.Variables["name"].Value}", false);
project.SendInfoToLog($"Раскодированный код: {project.Variables["code"].Value}", false);
https://chat.deepseek.com и https://chatgpt.com дают примерно аналогичные результаты

Как видим, ГПТ чаты при использования системного промта справляются с задачей гораздо лучше чем без него. Если же дать гораздо сложную задачу, когда нужно применить криптографические умения, вычисления или сложные преобразования, тот без системного промта вовсе не обойтись. Он вам сэкономит не только время, но и нервы и деньги.
Ну а если выдает простыни кода, просто напиши ему «максимально компактифицируй код» и в ответ получите лаконичный код, без воды.

С данным систем-промтом не нужно создавать сложный запрос с рекомендованной структурой, в простых случаях будет достаточно основных пунктов:
Вводные данные:
Указать вводные данные (переменные, формат, методы создания и т.д.)
Задача: мне нужен код который ... (написать примерную последовательность как понимаешь ее ты)
Результат: результат положи в переменную var

Данный промт не окончательный, не претендует на идеал, будет правится, но последняя версия пока будет лежать тут https://github.com/boyhood-fallers0v/Zennoposter-Csharp-SystemPrompt/blob/main/zp_system_prompt.md
Не стесняйся, предлагай дополнения – буду только рад вашим правкам.
Так же, накидайте сюда вопросов к ГПТ, на которые он дает нерабочий код хотя бы в двух чатах. Буду править промт.

НЮАНСЫ
Если код большой и сложный, и появляются ошибки, добавь к запросу:
- Добавь логирование каждого шага
Если полученный результат не тот который ожидал, просто выдели весь лог выполнения кубика и отправь его в чат с пояснениями или без.

БОНУС
Если попросить гпт сделать такой код:

Есть файл C:\profile\profile_name.zpprofile // Замени на свой
распакуй его во временную папку
Прочитай файл browserprofiledata.zpdata
В нем JSON

сделай ему тустринг

то на выходе во вкладке JSON получим все данные нашего браузера.
Не забудьте добавить в GAC необходимые библиотеки.
Так же, его можно сериализовать и снова запаковать но со своими данными, которые изменить средствами ЗП невозможно.

Решенные кейсы пользователей форума
- https://zenno.club/discussion/threads/semrush-svg-parsing.127461/#post-844554
- https://zenno.club/discussion/threads/sgenerirovat-vse-vozmozhnye-stroki-v-7-simvolov-iz-ciferno-bukvennogo-rjada.105234/post-838286
- https://zenno.club/discussion/threads/kak-otredaktirovat-takie-dannye-v-tablice.125038/post-828865

Используя системный промт можно получать рабочий и самодостаточный код, который в ЗП можно реализовать только с использованием внешних библиотек. Я таким образом сделал кубик, который получает список писем авторизуясь по Oauth2 без использования внешних библиотек.
 

Вложения

Последнее редактирование:

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 516
Благодарностей
592
Баллы
113
Рабочий промт, я тестировал уже несколько раз. Мне зашло, спасиба)
 
  • Спасибо
Реакции: ZennoLab Team и zarufakis
Регистрация
26.05.2020
Сообщения
539
Благодарностей
183
Баллы
43
А я занедорого урвал годовую подписку перплексити и настроил свой space под это дело - тоже неплохо работает. Автору спасибо - добавил в контекст линк на гитхабку :-)

134369


Недавно было сложная задача, и все нейронки тупили безбожно, гоняли по кругу с одинаковыми глюками.
В итоге только бесплатный Gemini справился с задачей в 2 шага. Кажется, эта топ-нейронка для кодинга. Claude не юзал, кстати, для работы с зенно...
 

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 882
Благодарностей
1 263
Баллы
113
Claude не юзал, кстати, для работы с зенно...
Только им и пользуюсь, по тестам сонет показывает прекрасные результаты в кодинге, но бывает и она глючит. Больше всего раздражают return; в коде, а так, иной раз с первого раза пишет что нужно, главное правильно дать задачу.
 
Регистрация
26.05.2020
Сообщения
539
Благодарностей
183
Баллы
43
иной раз с первого раза пишет что нужно, главное правильно дать задачу
ключевое именно "правильно дать задачу". Заметил, что с моим текущим контекстом при этой вводной генерит верный код с 1 раза, изредка с уточенениями. Просто нам лень ее правильно ставить )))
Но я прикладываю например скрин с devtools или таблицей, чтоб не описывать данные, и указываю исходные переменные и выходные. А, ну и саму задачу между ними )))
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)