Я давно являюсь сторонником разработки через тестирование (TDD) из-за ее многочисленных преимуществ в плане производительности и качества. Подробнее о них можно прочитать в статье TDD изменил мою жизнь.
Когда я понял, что GPT-4 способен следовать сложным инструкциям, одной из первых вещей, о которых я подумал, была попытка модульного тестирования подсказок. Для этого мне понадобился более точный контроль над подсказками. SudoLang — это мощный естественный язык, основанный на ограничениях язык псевдокода для GPT-4 и других языковых моделей ИИ.
Поскольку выходные данные языковой модели могут значительно различаться и иногда не иметь детерминированности, модульные тесты играют ключевую роль в обеспечении того, чтобы модель соответствовала всем требованиям к программному обеспечению при создании реализаций.
Riteway была моей предпочтительной средой тестирования, поскольку мы создали ее во время разработки исходного кода DevAnywhere.io, потому что она обеспечивает соблюдение передовых методов написания тестов. С SudoLang Riteway становится еще более мощным, позволяя языковой модели предоставлять интеллектуальную обратную связь о качестве ваших тестов и используя интеллектуальный вывод для создания качественных модульных тестов для недетерминированных выходных данных, генерируемых ИИ.
Ограничения в SudoLang
SudoLang — это язык программирования, основанный на ограничениях, вдохновленный ограничениями в Альбоме Айвана Сазерленда. В SudoLang ограничение — это предопределенное условие или правило, которым должна следовать модель при создании и интерпретации кода. Ограничения помогают повысить точность и актуальность функциональности кода, гарантируя, что он соответствует заданным требованиям. Ограничения в сочетании с всемогущим выводом ИИ автоматически и динамически синхронизируют соответствующие изменения состояния в программах SudoLang.
Большая часть волшебства в Riteway для SudoLang исходит из мощного решения всемогущих ограничений, основанного на искусственном интеллекте.
Riteway для SudoLang: встроенные ограничения, требования и предупреждения
Riteway для SudoLang выходит за рамки традиционного тестирования, включая ограничения, требования и предупреждения в структуру тестирования. Эта расширенная функциональность помогает модели генерировать более точный и надежный код, а также дает вам ценные отзывы о качестве ваших тестов.
Riteway для SudoLang разработан, чтобы помочь разработчикам создавать высококачественные тесты, применяя ограничения, требования и предоставляя предупреждения. Структура подчеркивает пять ключевых вопросов, на которые должен ответить каждый модульный тест, и следует аббревиатуре RITE Way, чтобы гарантировать, что тесты:
- Читаемый: тесты должны быть легко понятными, с использованием ясного языка и форматирования.
- Изолированные (для модульных тестов) или Интегрированные (для интеграционных тестов): тесты не должны зависеть друг от друга и должны быть изолированы от внешних факторов.
- Тщательное. Тесты должны охватывать все возможные пограничные случаи, гарантируя правильную работу кода в различных сценариях.
- Явный: все, что необходимо для понимания теста, должно быть включено в сам тест. Тесты не должны полагаться на внешнее, совместно используемое изменяемое состояние или другие тесты для контекста.
Придерживаясь этих принципов, платформа Riteway помогает разработчикам создавать тесты, которые легко понять, поддерживать и отлаживать. Ограничения и предупреждения, встроенные в платформу, помогают пользователю создавать тесты, которые эффективно отвечают на следующие пять вопросов:
- Что такое тестируемый модуль? (Тест должен находиться в именованном блоке описания)
- Какое ожидаемое поведение? (Аргументы
$given
и$should
должны быть подходящими) - Каков фактический результат? (Тестируемый модуль был протестирован тестом)
- Каков ожидаемый результат? (Аргументы
$expected
и/или$should
должны быть адекватными) - Как мы можем найти ошибку? (Ошибку следует вывести из сообщения об ошибке теста)
Сосредоточив внимание на этих вопросах и аббревиатуре RITE Way, среда тестирования Riteway для SudoLang помогает разработчикам создавать высококачественные тесты, которые легко понять, поддерживать и отлаживать.
Тестовый бегун Riteway
Средство запуска тестов Riteway предназначено для тщательной интерпретации тестируемого кода и создания реалистичных результатов для каждого теста. Он регистрирует результаты каждого теста, предоставляя информацию о том, прошел ли тест или нет. Если тест не пройден, он предлагает рекомендации по выявлению и устранению ошибки.
Примеры тестовых случаев и вывод
Вот пример того, как Riteway для SudoLang можно использовать для создания и запуска тестов:
describe("Tests", { assert({ should: "run tests", actual: true, expected: true }); }); describe("pythagoreanTriple", { interface pythagoreanTriple { // generate a valid pythagorean tripple function pythagoreanTriple(); constraint a^2 + b^2 = c^2; } assert({ should: "generate a valid pythagorean triple", actual: pythagoreanTriple(), }); });
Результат этих тестов будет выглядеть следующим образом:
1. ✅ Should run tests: Actual: true, Expected: true 2. ✅ Should generate a valid pythagorean triple: Actual: [3, 4, 5], Expected: [3, 4, 5] ✅ 2 tests passed, 0 failed.
Обращение с недетерминизмом
Обратите внимание, что в приведенной выше функции pythagoreanTriple
она генерирует случайную pythagoreanTriple недетерминированным образом. В традиционных языках программирования нам пришлось бы делать некоторые умные математические расчеты в наших ожиданиях, потенциально дублируя ошибочную логику из реализации. В SudoLang мы опираемся на механизм вывода со следующим ограничением:
constraint: if expected is undefined, infer it from the should description
Создание JavaScript в SudoLang
Написание и поддержка набора модульных тестов в SudoLang — отличный и простой способ указать четко определенные требования для задач генерации кода ИИ:
- Вставьте структуру Riteway в приглашение AI:
- В том же приглашении объявите функцию SudoLang и добавьте все необходимые ограничения.
- В той же подсказке:
list(requirements we should test for) |> generateRitewayTests() |> log
:
function fibonacci(n) { constraint sequence should begin with 0 find the nth fibonacci number } list(requirements we should test for) |> generateRitewayTests() |> log
Это должно привести к выводу, например:
Вот требования, которые мы должны проверить для функции
fibonacci
:
Последовательность должна начинаться с 0.
Функция должна возвращать правильное число Фибоначчи для данного ввода.
Функция должна обрабатывать пограничные случаи, такие как отрицательные числа и нецелые входные данные.
Исходя из этих требований, мы можем генерировать тесты Riteway:
describe("fibonacci", { assert({ should: "start the sequence with 0", actual: fibonacci(0), expected: 0 }); assert({ should: "return the correct Fibonacci number for the given input", actual: fibonacci(5), expected: 5 }); assert({ should: "return the correct Fibonacci number for another given input", actual: fibonacci(10), expected: 55 }); assert({ should: "handle negative numbers", actual: fibonacci(-5), expected: undefined // or an appropriate error message if an error is thrown }); assert({ should: "handle non-integer inputs", actual: fibonacci(3.5), expected: undefined // or an appropriate error message if an error is thrown }); });
Эти тесты гарантируют, что функция фибоначчи правильно вычисляет числа Фибоначчи, начинает последовательность с
0
и обрабатывает крайние случаи, такие как отрицательные числа и нецелые входные данные.
Обратите внимание, что предлагаемые тесты неверны, но с указанным набором тестов вы можете запросить исправления с помощью revise(test to
:
revise, description of requirement change)
revise( ``` describe("fibonacci", { assert({ should: "start the sequence with 0", actual: fibonacci(0), expected: 0 }); assert({ should: "return the correct Fibonacci number for the given input", actual: fibonacci(5), expected: 5 }); assert({ should: "return the correct Fibonacci number for another given input", actual: fibonacci(10), expected: 55 }); assert({ should: "handle negative numbers", actual: fibonacci(-5), expected: undefined // or an appropriate error message if an error is thrown }); assert({ should: "handle non-integer inputs", actual: fibonacci(3.5), expected: undefined // or an appropriate error message if an error is thrown }); }); ```, { please correct expectations based on the real fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34... expect out-of-domain inputs to throw using try..catch )
Вы можете получить что-то вроде этого:
describe("fibonacci", { assert({ should: "start the sequence with 0", actual: fibonacci(1), expected: 0 }); assert({ should: "return the correct Fibonacci number for the given input", actual: fibonacci(6), expected: 5 }); assert({ should: "return the correct Fibonacci number for another given input", actual: fibonacci(10), expected: 34 }); assert({ should: "throw for negative numbers", actual: { try { fibonacci(-5); } catch (error) { error.message; } } }); assert({ should: "throw for non-integer inputs", actual: { try { fibonacci(3.5); } catch (error) { error.message; } } }); });
- Теперь запустите тесты:
run(tests)
- Благодаря этому предварительному просмотру результатов теста вы можете уточнять ограничения, добавлять или пересматривать тесты и т. д.
- Когда вы будете удовлетворены, транспилируйте тесты
В этом случае мне на самом деле не нравятся условия броска, поэтому я опускаю их в своих транспилированных тестах.
Перенос тестов SudoLang в JavaScript
Вы можете транспилировать тесты с помощью:
ModuleName tests |> transpile(JavaScript Riteway) |> // or (JavaScript Jest) wrapWith(Markdown code block)
Что дает мне:
describe("fibonacci", assert => { assert({ given: "1", should: "start the sequence with 0", actual: fibonacci(1), expected: 0 }); assert({ given: "a valid input", should: "return the correct Fibonacci number for the given input", actual: fibonacci(6), expected: 5 }); assert({ given: "another valid input", should: "return the correct Fibonacci number for another given input", actual: fibonacci(10), expected: 34 }); });
Riteway для SudoLang является экспериментальным
SudoLang действительно хорошо работает для очень простых программ как в GPT-3, так и в GPT-4. Для более сложных программ вам понадобится GPT-4. Сам фреймворк Riteway раздвигает границы сложности, на которые способен GPT-4, поэтому вам не следует полагаться на получение правильных или ожидаемых результатов каждый раз (или даже в половине случаев).
Но тот факт, что даже возможно зайти так далеко, является выдающимся свидетельством того, что ждет впереди. Более десяти лет назад я выступал на конференции по JavaScript и давал интервью, в котором говорил о будущем программирования. Всю свою взрослую жизнь я интересовался искусственным интеллектом и генеративными технологиями. В интервью я говорил о будущем, в котором инженерам-программистам больше не нужно будет писать весь код реализации, и их основная обязанность будет заключаться в том, чтобы поддерживать требования с достаточной функциональной ясностью, чтобы поддерживать генеративные модели в нужном русле.
Начало этого будущего стоит перед нами сегодня.
Подведение итогов
Riteway для SudoLang предлагает мощный и интуитивно понятный способ тестирования кода, сгенерированного ИИ. Сочетая преимущества TDD с гибкостью SudoLang и интеллектуальностью языковой модели, вы можете с большей уверенностью создавать надежное программное обеспечение. Попробуйте Riteway для SudoLang и ощутите разницу на себе.
Riteway для SudoLang теперь доступен в папке примеров SudoLang на GitHub.
Наслаждаться!
Следующие шаги
Я предлагаю индивидуальное наставничество по теме Шепот ИИ, чтобы помочь людям, заинтересованным в расширении своего опыта работы с ИИ для решения сложных проблем.
Что дает мне право это делать? Обработка естественного языка (NLP) — это то, что в первую очередь затянуло меня в программирование — когда я был подростком. В отличие от всех экспертов, которые только начали заниматься этим с момента запуска ChatGPT в прошлом году, я изучал ИИ всю свою взрослую жизнь. Я был одним из первых людей, получивших доступ к GPT-3, и Я ежедневно общаюсь с LLM с лета 2020 года, а до этого с чат-ботами в целом. Я пишу и говорю об ИИ уже много лет.
В профессиональном плане я был техническим руководителем в социальной видеосети, дочерней компании Стэнфордского исследовательского института, которая использовала ИИ для преобразования речи в текст с учетом контекста, и я развернула модели ИИ в масштабе десятков миллионов пользователей.
Вместе мы изучим пользовательские интерфейсы, основанные на искусственном интеллекте, будущее искусственного интеллекта, оставшиеся проблемы, такие как постоянное обучение, способы внедрения невероятных функций искусственного интеллекта в потребительские продукты, которые вы можете поставлять уже сегодня, и многое другое.
Заинтересованы? Дотянись сюда.
Эрик Эллиот — консультант по техническим продуктам и платформам, автор книги Составление программного обеспечения, создатель SudoLang (язык программирования ИИ), соучредитель EricElliottJS.com и DevAnywhere. io, и наставник команды разработчиков. Он участвовал в разработке программного обеспечения для Adobe Systems, Zumba Fitness The Wall Street Journal, ESPN, BBC, и лучшие исполнители, включая Ашера, Фрэнка Оушена, Metallica и многих других.
Он ведет уединенный образ жизни с самой красивой женщиной в мире.