Дальше чем Hello World! на Python у меня так и не получилось продвинуться... Хочется творить, создавать что-то полезное, но все, более продвинутые коллеги вокруг утверждают, что раньше чем через год активных проб и ошибок ничего путного из-под моей клавиатуры не выйдет.

Эта статья для тех, кто думает, что не сможет и поэтому даже не пробует.

"Если долго сидеть на берегу реки, то можно увидеть как мимо проплывёт труп твоего врага" (Шон Коннери, фильм "Восходящее солнце", 1993).

Вуаля, GPT-4 (ChatGPT или GPT кому как нравится) доступен через bing.com/new (потребуется учетная запись в Microsoft и, возможно, немного подождать, зато, никакого гемора с VPN и переполнением очереди в chat.openai.com/chat).

Задача

Проба пера была на простеньком скрипте для Google Docs (тут), теперь проблема следующая - при написании длинного текста в переводчике, ты не знаешь, насколько результат (переведенный текст) отражает изначально заложенную мысль. Чтобы случайно не ругнуться матом, например, во Вьетнаме, я всегда переводил результат перевода обратно с вьетнамского на русский. Соответственно, если в тексте попадалась ошибка, приходилось переписывать предложение на русском, переводить на вьетнамский и опять делать проверку. Все известные мне переводчики не обладают функцией мгновенного обратного перевода, значит, придётся его сделать.

Далее привожу диалог с GPT практически без купюр (мои запросы здесь оформлены как цитаты, ответы GPT - как код), во время диалога код был существенно доработан, финальная версия в конце статьи!

Глава первая. Начало

создай код для интерент страницы переводчика, используя инструкции https://cloud.yandex.ru/docs/translate

<html>
<head>
    <title>Переводчик</title>
</head>
<body>
    <h1>Переводчик</h1>
    <form action="translate.php" method="post">
        <p>Введите текст для перевода:</p>
        <textarea name="text" rows="10" cols="50"></textarea>
        <p>Выберите язык перевода:</p>
        <select name="language">
            <option value="en-ru">Английский - Русский</option>
            <option value="ru-en">Русский - Английский</option>
            <option value="fr-ru">Французский - Русский</option>
            <option value="ru-fr">Русский - Французский</option>
            <option value="de-ru">Немецкий - Русский</option>
            <option value="ru-de">Русский - Немецкий</option>
        </select>
        <p><input type="submit" value="Перевести"></p>
    </form>
</body>
</html>
<?php
// Получаем текст и язык перевода из формы
$text = $_POST['text'];
$language = $_POST['language'];

// Проверяем, что текст не пустой
if ($text == "") {
    echo "Пожалуйста, введите текст для перевода.";
    exit;
}

// Получаем IAM-токен и идентификатор каталога из файла config.php
require_once 'config.php';

// Формируем URL для запроса к API Яндекс.Переводчика
$url = 'https://translate.api.cloud.yandex.net/translate/v2/translate';

// Формируем заголовки для запроса
$headers = [
    'Content-Type: application/json',
    "Authorization: Bearer $IAM_TOKEN"
];

// Формируем данные для запроса
$post_data = [
    "targetLanguageCode" => $language,
    "texts" => [$text],
    "folderId" => $folder_id,
];

// Кодируем данные в формат JSON
$data_json = json_encode($post_data);

// Инициализируем cURL
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);

// Выполняем запрос и получаем ответ
$result = curl_exec($curl);

// Закрываем cURL
curl_close($curl);

// Декодируем ответ из формата JSON
$result_json = json_decode($result, true);

// Проверяем, что ответ содержит переведенный текст
if (isset($result_json['translations'][0]['text'])) {
    // Выводим переведенный текст на экран
    echo "<h1>Перевод</h1>";
    echo "<p>" . $result_json['translations'][0]['text'] . "</p>";
} else {
    // Выводим сообщение об ошибке
    echo "<h1>Ошибка</h1>";
    echo "<p>" . $result_json['message'] . "</p>";
}
?>

Как я понял, нужно создать два файла, один из которых в формате HTML, а второй в формате PHP. Как я откуда-то помню, первый HTML-файл должен называться index.html, а название PHP-файла читаем в HTML-коде в 7 строке. Код ссылается на некий файл config.php. Как он может выглядеть, я представления не имею, поэтому, спросим об этом GPT.

создай пример файла config.php

<?php
// Замените эти значения на свои
$IAM_TOKEN = '<IAM-токен>';
$folder_id = '<идентификатор каталога>';
?>

Глава следующая. Перипетия с авторизацией

Собственно вот тут https://cloud.yandex.ru/docs/translate/operations/translate Яндексом подробно описано как получать токены и даже есть примеры для CLI (Интерфейс командной строки), Python и PHP. Сложность в том, что не понятно по какому пути нужно пойти, чтобы было быстро просто и без всяких там интерпретаторов, виртуальных машин и вот этого всего. Я хотел отправить код с HTML-страницы вместе с API-ключом, но нет же...

Сразу после получения IAM-токена, получите API-ключ (Яндекс предупреждает, что это менее секьюрно, зато не нужно настраивать автоматическое обновление IAM-токена каждые 12 часов) тут https://cloud.yandex.ru/docs/iam/operations/api-key/create. Далее меняем строку 21 в файле translate.php "Authorization: Bearer $IAM_TOKEN"на "Authorization: Api-Key <API-ключ>" или ссылку на него в соседнем файле $API_key.

Глава еще одна. Кодировка

текст на странице выводится в таком виде "Петеводчик" как поправить?

Тут GPT выдал 4 варианта, как поправить, но лучший я нашел сам на stackoverflow и добавил его в HTML-файл после тэга <head> (подсказка была в самом редакторе файлов).

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

Глава об ошибочном понимании ИИ существующей действительности

На самом деле это уже вторая попытка сделать переводчик на сайте, первая с полным функционалом была написана по старым инструкциям Яндекса, поэтому в данной версии хотелось просто убедиться, что API-shmAPI работает... Оно так-то работает, но выдаёт ошибку при исполнении кода

при выполнении кода, выводится "unsupported target_language_code: en-ru" как исправить?

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

Возможно, проблема в том, что вы используете неправильный код языка для параметра target_language_code. Вы должны использовать пару кодов языков ( "откуда" - "куда"), разделенных дефисом. Например, en-ru означает перевод с английского на русский. Вы также можете использовать только код целевого языка (например, ru). В этом случае сервис попытается определить исходный язык автоматически1.
Чтобы исправить ошибку, вы можете попробовать следующее:
Проверьте, что вы указали правильный код языка в параметре target_language_code. Вы можете получить список поддерживаемых языков с помощью метода getLangs2.
Проверьте, что вы указали правильный ключ API в параметре key. Вы можете получить бесплатный ключ API на сайте Яндекс.Облака1.
Проверьте, что вы указали правильный идентификатор каталога в параметре folderId. Вы можете найти его в своем личном кабинете1.

что нужно исправить в коде, если следующий пример считать верным? далее код с вкладки PHP на странице https://cloud.yandex.ru/docs/translate/operations/translate

В коде не нужно ничего исправлять, если следующий пример считать верным. 
Этот код отправляет запрос к API Яндекс.Переводчика и получает ответ в формате JSON. 
В ответе должен быть перевод слов "Hello" и "World" с английского на русский язык. 
Пример ответа:
{
  "translations": [
    {
      "text": "Привет",
      "detectedLanguageCode": "en"
    },
    {
      "text": "Мир",
      "detectedLanguageCode": "en"
    }
  ]
}

targetLanguageCode указывается не парой языков, например, en-ru, а кодом одного языка, например ru

Нет, targetLanguageCode может указываться как парой языков, так и кодом одного языка. 
Если вы указываете пару языков, например en-ru, то вы задаете направление перевода с английского на русский. 
Если вы указываете код одного языка, например ru, то вы задаете целевой язык перевода, а исходный язык будет определен автоматически.

почему тогда сайт выдаёт "unsupported target_language_code: ru-en"?

Возможно, сайт выдает эту ошибку, потому что вы указываете код языка в неправильном формате. 
Вы должны использовать дефис (-), а не тире (–) для разделения кодов языков. 
Например, en-ru, а не en–ru. Также убедитесь, что вы используете правильные коды языков. 
Вы можете получить список поддерживаемых языков с помощью метода getLangs1.

<К сожалению, для этой беседы достигнуто ограничение.> 
<Нажмите кнопку "метла", чтобы очистить это и продолжить общение.>

Да, у Bing тоже есть свои недостатки (максимум 20 запросов на один диалог), пришлось самому догадаться заменить ru-en на ru, а en-ru - на en. Невеликое достижение, но после этого всё заработало и я "...почил в день седьмой от всех дел Своих, которые делал" (Быт. 2:2).

Эпилог

Вашему вниманию предлагаются финальные версии файлов, которые нужно разместить в отдельной папке (поддомене) вашего сайта. Хоcтинг сайта, видимо, должен поддерживать PHP, но это не точно. Кстати, все комментарии тоже дело рук GPT.

Файл index.html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
    <title>Переводчик</title>
</head>
<body>
    <h1>Переводчик Yandex</h1>
    <form action="translate.php" method="post">
        <p>Введите текст для перевода:</p>
        <textarea name="text" rows="1" cols="50"></textarea>
        <p>Выберите язык перевода:</p>
        <select name="language">
            <option value="en">en</option>
            <option value="ru">ru</option>
        </select>
        <p><input type="submit" value="Перевести"></p>
    </form>
</body>
</html>

Файл config.php

<?php
// Замените эти значения на свои
$API_key = 'AQVNw5-----------------------EiFWg';
$folder_id = 'b1go---------l4ps';
?>

Файл translate.php

<?php
// Получаем текст и язык перевода из формы
$text = $_POST['text'];
$language = $_POST['language'];

// Проверяем, что текст не пустой
if ($text == "") {
    echo "Пожалуйста, введите текст для перевода.";
    exit;
}

// Получаем API-key и идентификатор каталога из файла config.php
require_once 'config.php';

// Формируем URL для запроса к API Яндекс.Переводчика
$url = 'https://translate.api.cloud.yandex.net/translate/v2/translate';

// Формируем заголовки для запроса
$headers = [
    'Content-Type: application/json',
    "Authorization: Api-Key $API_key"
];

// Формируем данные для запроса
$post_data = [
    "targetLanguageCode" => $language,
    "texts" => [$text],
    "folderId" => $folder_id,
];

// Кодируем данные в формат JSON
$data_json = json_encode($post_data);

// Инициализируем cURL
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);

// Выполняем запрос и получаем ответ
$result = curl_exec($curl);

// Закрываем cURL
curl_close($curl);

// Декодируем ответ из формата JSON
$result_json = json_decode($result, true);

// Проверяем, что ответ содержит переведенный текст
if (isset($result_json['translations'][0]['text'])) {
    // Выводим переведенный текст на экран
    echo "<h1>Перевод</h1>";
    echo "<p>" . $result_json['translations'][0]['text'] . "</p>";
} else {
    // Выводим сообщение об ошибке
    echo "<h1>Ошибка</h1>";
    echo "<p>" . $result_json['message'] . "</p>";
}
?>

Визуализация результата

Можно ввести текст в окошко и получить перевод после нажатия на кнопку на новой странице
Можно ввести текст в окошко и получить перевод после нажатия на кнопку на новой странице
Результат перевода
Результат перевода

Планы на будущее

  • сделать перевод после нажатия кнопки пробел или enter

  • получить результат перевода на экране ввода исходного текста

  • добавить окошко с обратным переводом на русский

  • добавить три окошка справа: текст на английском, перевод на русский, обратный перевод на английский


Спасибо за внимание" Следите за обновлениями!

Пробуйте что‑то своё! GPT поможет.

Комментарии (2)


  1. HellKaim
    07.04.2023 11:12
    +3

    Это вы даже не поскребли верхушку возможностей.

    Полноценный GPT от openai работает в контексте диалога. Так же у него есть глубина "памяти" в этм диалоге.

    Если правильно разогревать нейронку, постепенно сужая контекст до прикладной задачи, она может значительно больше. 4я версия лучше подходит для нечетко сформулированных задачь, 3.5 для чистого кодинга. Так же нужно знать что оно знает только то, что было актуально в 21м году, не имеет связи с реальностью, путает методы вызова для разных версий библиотек в одном коде.

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

    Еще одна особенность этого инструмента - отсутствие понятия логики дальше 1-2-3). Оно не поймет ошибку, если ему дать описания формата 1.а 2.в 3.б 4.г

    Зная это, можно делать очень сложные вещи, но, правда, это оправдано только если вы не пишете сами. В противном случае - вам проще будет самому.

    С другой стороны, можно его применять для мерджа файлов, описания алгоритма по коду. Это чаще даже полезнее, чем сама кодогенерация.

    Удачи )


  1. wtigga
    07.04.2023 11:12
    +2

    Да. У меня тоже с программированием долго не получалось ничего толкового, потому что от идеи до хоть какой-то реализации уходило слишком много времени (недели). А теперь с чатом я могу говнокодить и получать результат за сутки. Большего мне и не надо пока.