Не верьте CharGPT и используйте KotUniL

Опять двойка. Федор Решетников. Источник: ВикипедияОпять двойка. Федор Решетников. Источник: Википедия

В последние недели медиа и социальные сети захлеснул поток сообщений о диалогах с ChatGPT. Только на Хабре поиск по этому термину показывает сегодня полтора десятка статей. 

Попробовал пообщаться с ChatGPT и я. Результат общения вынесен в заголовок. 

Хотите узнать, почему ChatGPT верить нельзя и почему лучше использовать KotUniL — читайте дальше.

Сначала я пообщался с ChatGPT (далее для простоты я буду иногда обозначать его ИИ) на английском, а потом на русском. 

Первым делом я задал ИИ простенькую школьную задачку. 

Здесь задачка и решение в оригинале

My question:

In Eva’s case, a glass broke in her aquarium and water flowed on floor. In aquarium before breakage was 32 liters of water. Eva’s room is 4 m. wide and 4.3 long. How high in mm. is water now in Eva’s room with assumption that it stayed there and did not flow away?

ChatGPT’s answer:

To determine the height of the water in Eva’s room, you need to know the volume of water that flowed out of the aquarium and the volume of the room.

The volume of the water that flowed out of the aquarium is simply the volume of the aquarium before the glass broke, which is 32 liters.

To find the volume of the room, you need to know the dimensions of the room in meters. You have provided the width and length of the room, but not the height. Without the height of the room, it is not possible to determine the volume of the room and therefore the height of the water in the room.

If you know the height of the room, you can calculate the volume of the room by multiplying the width, length, and height of the room. For example, if the height of the room is 3 meters, the volume of the room would be 4×4.3×3 = 52.8 cubic meters.

To determine the height of the water in the room, you would then divide the volume of the water that flowed out of the aquarium (32 liters) by the volume of the room (52.8 cubic meters) and multiply the result by 1000 to convert the result from meters to millimeters.

For example, if the height of the room is 3 meters, the height of the water in the room would be (32 / 52.8) x 1000 = 60.4 millimeters.

I hope this helps! Let me know if you have any other questions.

Я же приведу автоматический и слегка подправленный перевод на русский.

Задача:

В аквариуме Евы в разбилось стекло, и вода вытекла на пол. В аквариуме до этого было 32 литра воды. Комната Евы имеет ширину 4 м. и длину 4,3 м. На какой высоте в мм. находится сейчас вода в комнате Евы при условии, что она осталась там и не вытекла?

Решение:

Чтобы определить высоту воды в комнате Евы, необходимо знать объем воды, вытекшей из аквариума, и объем комнаты.
Объем воды, вытекшей из аквариума, — это просто объем аквариума до того, как стекло разбилось, то есть 32 литра.
Чтобы найти объем комнаты, необходимо знать ее размеры в метрах. Вы указали ширину и длину комнаты, но не указали высоту. Без высоты помещения невозможно определить объем помещения и, следовательно, высоту воды в нем.
Если вам известна высота помещения, вы можете рассчитать объем помещения, перемножив ширину, длину и высоту помещения. Например, если высота комнаты составляет 3 метра, объем комнаты будет равен 4×4,3×3 = 52,8 кубических метров.
Чтобы определить высоту воды в комнате, нужно разделить объем воды, вытекшей из аквариума (32 литра), на объем комнаты (52,8 кубических метра) и умножить результат на 1000, чтобы перевести результат из метров в миллиметры.
Например, если высота комнаты составляет 3 метра, то высота воды в комнате будет (32 / 52,8) x 1000 = 60,4 миллиметра.
Надеюсь, это поможет! Дайте мне знать, если у вас есть другие вопросы.

Я предлагаю вам самим найти ошибку и согласиться или нет с вынесенным в заголовок тезисом, что пока доверять  ChatGPT решение даже простеньких задач нельзя.
Далее я попросил ИИ написать для этого решения программу на Kotlin.

Не моргнув глазом, ИИ согласился. Вот результат:

fun main() {
    // Set the volume of the aquarium before the glass broke
    val aquariumVolume = 32.0

    // Set the dimensions of the room
    val roomWidth = 4.0
    val roomLength = 4.3
    val roomHeight = 3.0 // Note: you need to provide the height of the room

    // Calculate the volume of the room
    val roomVolume = roomWidth * roomLength * roomHeight

    // Calculate the height of the water in the room
    val waterHeight = (aquariumVolume / roomVolume) * 1000

    // Print the result
    println("The height of the water in the room is $waterHeight millimeters.")
}


Причём,   текст программы ИИ показал в отдельном боксе с чёрным бэкграундом и подобающими шрифтами и цветами. 

Заметим, что сгенерированная  программа просто повторяет неверное решение.

Уважение вызывает «знание» ИИ синтаксиса Kotlin. 

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

Затем я решил проверить, знает ли ИИ про синусы.

Оказалось, знает.

The sine of 0 is equal to 0. The sine function is a mathematical function that takes an angle as an input and returns the ratio of the side of the right triangle opposite the angle to the hypotenuse of the triangle. In other words, given an angle in a right triangle, the sine function returns the value of the ratio of the length of the side opposite the angle to the length of the hypotenuse. For the special case of an angle of 0 degrees, the side opposite the angle is of length 0, so the sine of 0 is equal to 0.

Поняв, что орешек мне попался крепкий, я попросил ИИ написать программу управления космическим полётом и настроился ответить на десять тысяч вопросов, уточняющих требования к системе. А после этого я ожидал получить программу с двадцатью миллионами строк.

Но не того ни другого не произошло. 

ИИ браво выдал мне небольшую программку и объяснение к ней:

Could you please write a program in Java for control space flight?

Sure! Here is a Java program that can be used to control a space flight:

import java.util.Scanner;

public class SpaceFlightControl {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    // initialize variables for the space flight
    double fuel = 100.0;
    double altitude = 0.0;
    double velocity = 0.0;
    double acceleration = 0.0;
    double thrust = 0.0;

    // control loop for the space flight
    while (fuel > 0) {
      // display the current status of the space flight
      System.out.println("Fuel: " + fuel);
      System.out.println("Altitude: " + altitude);
      System.out.println("Velocity: " + velocity);
      System.out.println("Acceleration: " + acceleration);
      System.out.println("Thrust: " + thrust);

      // prompt the user for the desired thrust
      System.out.print("Enter desired thrust (0-100): ");
      thrust = scanner.nextDouble();

      // update the acceleration and velocity based on the thrust
      acceleration = thrust / 10.0;
      velocity += acceleration;

      // update the altitude based on the velocity
      altitude += velocity;

      // decrease the fuel based on the thrust
      fuel -= thrust / 10.0;
    }

    // display a message when the fuel runs out
    System.out.println("Fuel exhausted. Space flight ended.");
  }
}

This program simulates a space flight by allowing the user to input a thrust value (from 0 to 100) at each iteration of the control loop. The program then calculates the acceleration, velocity, and altitude based on the thrust, and updates the fuel accordingly. The control loop continues until the fuel runs out, at which point the program displays a message indicating that the space flight has ended.

I hope this helps! Let me know if you have any questions.

Заканчивая английскую часть нашего диалога, я спросил ИИ, в чём смысл жизни.

Ответ не заставил себя ждать.

The meaning of life, the universe, and everything is a question that has puzzled philosophers, theologians, and scientists for centuries. It is a question that is often asked in a humorous or rhetorical way, as a reference to the science fiction novel «The Hitchhiker’s Guide to the Galaxy» by Douglas Adams. In the novel, an enormous supercomputer named Deep Thought is asked to find the answer to this question, and after much contemplation, it responds with the answer »42.» The characters in the novel are disappointed by this answer, as they had hoped for something more profound.

However, in reality, the meaning of life, the universe, and everything is a deeply personal and subjective question that may have different answers for different people. Some people believe that the meaning of life is to find happiness and fulfillment, while others believe that it is to help others or to make a positive impact on the world. Some people believe that the universe has a specific purpose or meaning, while others believe that it is simply a random collection of matter and energy. Ultimately, the answer to this question may be something that each person must determine for themselves based on their own beliefs, values, and experiences.

Далее я перешёл на русский и для начала попросил рассказать мне сказку. ИИ порадовал новой, новаторской интерпретаций известной сказки про трёх поросят. Я эту новацию оценил столь высоко, что даже поместил ее на страницы своей открытой книги «Мемуары кочевого программиста…». Если интересно, почитайте там.

А я попытаюсь ответить на возможно давно мучающий читателей вопрос, что такое KotUniL  и при чём он здесь.

Во первых, первую задачку я взял из документации по KotUniL. 

А во вторых, по заявлениям создателей ChatGPT, они обучали эту систему с помощью профессиональных тренеров. Тем самым можно, с известными упрощениями, сказать, что ChatGPT отображает «средний» уровень тренеров-людей, в вопросе решения задач по физике.

Логика решения неверна. Но опустим это. Вчитаемся еще раз в последние строки решения. Кубические дециметры делятся на кубометры. Получается безразмерная единица, которая умножается на 1000 — другую безразмерную единицу. И утверждается, что в результате этого перемножения получатся миллиметры!

ИИ запутался с размерностями и потом материализовал эту путаницу в программу на Kotlin.

Увы, путаница с размерностями весьма типична при создании научных, технических, экономических и иных программ и систем. Из-за программных ошибок такого рода разбивались космические аппараты, тонули корабли и гибли люди. 

Чтобы избежать этого, следует использовать одну из библиотек по работе с физическими и иными единицами.

Недавно я опубликовал на Хабре небольшую серию статей на эту тему. А эта оказалась неожиданным дополнением к ним.

А вообще-то я считаю, что библиотеки по работе с физическими единицами должны поставляться «из коробки» вместе с языком. В случае Kotlin, библиотека типа KotUniL должна поставляться в ряду сопровождающих язык библиотек типа Ktor или Dokka.

Такое предложение я сделал разработчикам языка. Если Вы того же мнения, прошу вас проголосовать за него. 

Я думаю, если разработчики его примут, мир станет чуть-чуть надёжнее. А пока они решают — желающие могут пользоваться KotUniL. 

© Habrahabr.ru