Я давно являюсь сторонником разработки через тестирование (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, чтобы гарантировать, что тесты:

  1. Читаемый: тесты должны быть легко понятными, с использованием ясного языка и форматирования.
  2. Изолированные (для модульных тестов) или Интегрированные (для интеграционных тестов): тесты не должны зависеть друг от друга и должны быть изолированы от внешних факторов.
  3. Тщательное. Тесты должны охватывать все возможные пограничные случаи, гарантируя правильную работу кода в различных сценариях.
  4. Явный: все, что необходимо для понимания теста, должно быть включено в сам тест. Тесты не должны полагаться на внешнее, совместно используемое изменяемое состояние или другие тесты для контекста.

Придерживаясь этих принципов, платформа Riteway помогает разработчикам создавать тесты, которые легко понять, поддерживать и отлаживать. Ограничения и предупреждения, встроенные в платформу, помогают пользователю создавать тесты, которые эффективно отвечают на следующие пять вопросов:

  1. Что такое тестируемый модуль? (Тест должен находиться в именованном блоке описания)
  2. Какое ожидаемое поведение? (Аргументы $given и $should должны быть подходящими)
  3. Каков фактический результат? (Тестируемый модуль был протестирован тестом)
  4. Каков ожидаемый результат? (Аргументы $expected и/или $should должны быть адекватными)
  5. Как мы можем найти ошибку? (Ошибку следует вывести из сообщения об ошибке теста)

Сосредоточив внимание на этих вопросах и аббревиатуре 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 и многих других.

Он ведет уединенный образ жизни с самой красивой женщиной в мире.