paint-brush
Как протестировать несколько вариантов подсказок генеративного ИИк@raymondcamden
4,006 чтения
4,006 чтения

Как протестировать несколько вариантов подсказок генеративного ИИ

к Raymond Camden13m2024/03/24
Read on Terminal Reader

Слишком долго; Читать

Почти во всех моих недавних исследованиях генеративного ИИ я осознал, насколько важны подсказки. Это не обязательно побуждало меня постоянно писать более качественные подсказки, но осознание проблемы — это, по крайней мере, один шаг к ее исправлению, не так ли? Одна из вещей, которая, как я думал, поможет мне лично, — это иметь инструмент для быстрого сравнения и сопоставления различных подсказок. Очевидно, я мог бы просто открыть несколько вкладок в браузере, но мне действительно хотелось чего-то более прямого и упрощенного для моих целей. Имея это в виду, позвольте мне поделиться тем, что я создал.
featured image - Как протестировать несколько вариантов подсказок генеративного ИИ
Raymond Camden HackerNoon profile picture

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


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

Подскажите тестер

Prompt Tester — это мой инструмент с невероятно оригинальным названием для… хм… тестирования подсказок. Все начинается с одной подсказки:


Веб-приложение Prompt Tester с одним пустым приглашением


Идея состоит в том, что вы вводите исходное приглашение, а затем щелкаете один или несколько раз, чтобы добавить дополнительные приглашения. Когда все будет готово, вы можете просто нажать «Сгенерировать результаты»:


Веб-приложение Prompt Tester с двумя приглашениями и результатами


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

Код

Бэкэнд — это невероятно простой сервер Node.js, который обрабатывает статический HTML и отвечает на запросы интерфейсного API. Я еще раз благодарю Тодда Шарпа за то, что он поделился со мной своим первоначальным кодом. Вот скучная простая часть обработки:


 async function handler(req, res) { console.log('Entered handler.', req.method, req.url); if(req.method === 'GET' && req.url.indexOf('favicon.ico') === -1) { res.writeHead(200, { 'Content-Type':'text/html' }); res.write(fs.readFileSync('./demo.html')); res.end(); } else if(req.method === 'POST' && req.url === '/api') { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', async () => { body = JSON.parse(body); console.log('BODY:\n', JSON.stringify(body, null, '\t')); let result = await callGemini(body.prompt); res.writeHead(200, { 'Content-Type':'application/json' }); res.write(JSON.stringify(result)); res.end(); }); } } const server = http.createServer(handler); server.listen(3000); console.log('Listening on port 3000');


И часть callGemini , которая просто передает приглашение Google Gemini API . Теоретически это можно изменить на ChatGPT или любой другой сервис.


 const MODEL_NAME = "gemini-pro"; const API_KEY = process.env.GOOGLE_AI_KEY; const genAI = new GoogleGenerativeAI(API_KEY); const model = genAI.getGenerativeModel({ model: MODEL_NAME }); async function callGemini(text) { const generationConfig = { temperature: 0.9, topK: 1, topP: 1, maxOutputTokens: 2048, }; const safetySettings = [ { category: HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, ]; const parts = [ {text}, ]; const result = await model.generateContent({ contents: [{ role: "user", parts }], generationConfig, safetySettings, }); try { if(result.response.promptFeedback && result.response.promptFeedback.blockReason) { return { error: `Blocked for ${result.response.promptFeedback.blockReason}` }; } const response = result.response.candidates[0].content.parts[0].text; return { response }; } catch(e) { // better handling return { error:e.message } } }


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

Передняя часть относительно проста. Я использовал Milligram для основного CSS (еще раз спасибо, Тодд) и немного ванильного JavaScript для добавления новых подсказок и выполнения вызовов. Вот HTML (без встроенного CSS):


 <h1>Prompt Tester</h1> <p> This tool helps you see the result of multiple prompts at the same time. The idea is to use similar prompts with different phrasing to see how it impacts the result. </p> <div id="prompts"> </div> <template id="promptRow"> <div class="row"> <div class="column column-33"><textarea placeholder="Enter your prompt."></textarea></div> <div class="column column-67 result"></div> </div> <hr> </template> <div class="float-right"> <button id="addPrompt">Add Prompt</button> <button id="generateResults">Generate Results</button> </div>


А затем JavaScript. Обратите внимание, что выше я использовал <template> для обработки макета подсказки. Я впервые использовал этот тег, и это было относительно легко.


 let $template, $prompts, $addPromptsBtn, $generateResultsBtn; let promptCount = 0; document.addEventListener('DOMContentLoaded', init, false); async function init() { $addPromptsBtn = document.querySelector('#addPrompt'); $addPromptsBtn.addEventListener('click', addPrompt, false); $generateResultsBtn = document.querySelector('#generateResults') $generateResultsBtn.addEventListener('click', generateResults, false); $template = document.querySelector('#promptRow'); $prompts = document.querySelector('#prompts'); addPrompt(); } function addPrompt() { promptCount++; const newPrompt = $template.content.cloneNode(true); $prompts.append(newPrompt); } async function generateResults() { // disable add prompt and generate $addPromptsBtn.setAttribute('disabled', 'disabled'); $generateResultsBtn.setAttribute('disabled', 'disabled'); let $results = document.querySelectorAll('div.result'); // clear any previous results $results.forEach(r => r.innerHTML = ''); /* gather prompts from the inputs */ let prompts = []; let $fields = document.querySelectorAll('#prompts textarea'); for(f of $fields) prompts.push(f.value); let promises = []; for(p of prompts) promises.push(getResult(p)); let results = await Promise.all(promises); // assign results to result area for each, handle errors - later // there's a one to one correspondance between our array of results and the result div for(let i=0;i<results.length;i++) { if(results[i].response) $results[i].innerHTML = marked.parse(results[i].response); else if(results[i].error) $results[i].innerHTML = `<strong>Error with Prompt: </strong> ${results[i].error}`; } $addPromptsBtn.removeAttribute('disabled'); $generateResultsBtn.removeAttribute('disabled'); } async function getResult(p) { console.log('get result for',p); // quick return on empty prompt if(p.trim() === '') return { response:'<strong>Enter a prompt.</strong>' }; let req = await fetch('/api', { method:'POST', body: JSON.stringify({prompt:p.trim()})}); let result = await req.json(); return result; }


Я думаю , что это довольно простые манипуляции с DOM и вызовы API, но обязательно дайте мне знать в комментарии ниже, если что-то не имеет смысла. Обратите внимание, что я запускаю все вызовы API одновременно, а Promise.all ждет их завершения.


Также обратите внимание, что я использую marked библиотеку. Результаты Google обычно имеют Markdown, и это помогает им хорошо отображаться в моем небольшом веб-приложении.

Я думаю, что все это не очень интересно, но давайте посмотрим на некоторые тесты. Как я уже сказал, я знал, что стиль подсказки важен. То, что это было представлено мне непосредственно в инструменте, во многом укрепило это.

Пример результата — гравитация

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


Подсказка: объясните мне гравитацию, но сделайте ее подходящей для ребенка в 1 классе.

Гравитация – это сверхсила, которой обладает наша планета! Это словно невидимая сила, которая заставляет все на Земле оставаться на земле.

Представьте, что у вас в руке мяч. Когда вы его бросите, что произойдет? Оно падает, да? Это из-за гравитации. Гравитация тянет мяч к центру Земли, и он падает на землю.


Гравитация также удерживает нас на земле. Это то, что удерживает наши ноги твердо на земле и не дает нам уплыть!

Гравитация – очень важная сила. Он сохраняет все на своих местах и помогает вещам работать так, как они работают. Без гравитации мы все плавали бы в космосе, и все было бы очень хаотично!


Вот интересный способ подумать о гравитации: представьте, что Земля — это гигантский магнит, и все на Земле сделано из металла. Магнит притягивает к себе металлические предметы, и именно это удерживает их на земле.


Гравитация — очень важная и интересная сила. Это одна из вещей, которая делает нашу планету таким уникальным и особенным местом для жизни!


Подсказка: объясните мне гравитацию, но сделайте ее подходящей для ребенка 7-го класса.

Представьте, что вы играете с мячом. Вы подбрасываете его в воздух, и он возвращается к вам. Это из-за гравитации. Гравитация — это сила, которая притягивает предметы друг к другу. Это то, что удерживает вас на земле и заставляет вещи падать.


Величина гравитации между двумя объектами зависит от их массы. Чем больше масса объекта, тем сильнее его гравитация. Вот почему такие вещи, как планеты и звезды, обладают большей гравитацией, чем люди и автомобили.


Гравитация также удерживает планеты на орбитах вокруг Солнца. Гравитация Солнца намного сильнее земной, поэтому она притягивает Землю к себе. Благодаря этому Земля движется по кругу вокруг Солнца.


Гравитация — очень важная сила в нашей Вселенной. Он удерживает вещи на месте и заставляет их двигаться. Без гравитации планеты улетели бы в космос, и мы все уплыли бы.


Вот несколько забавных фактов о гравитации:

  • Гравитация ответственна за приливы. Гравитация Луны притягивает океаны Земли, заставляя их подниматься и опускаться.


  • Гравитация — причина существования атмосферы. Без гравитации воздух просто улетел бы в космос.


  • Гравитация – это то, что позволяет нам ходить. Когда мы идем, наши ноги упираются в землю, а земля отталкивает ее. Это то, что двигает нас вперед.


  • Гравитация — причина, по которой мы не улетаем в космос. Гравитация Земли тянет нас к ее центру, удерживая на земле.


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


Подсказка: объясните мне гравитацию, но сделайте ее подходящей для студента студенческого возраста.


Гравитация: сила притяжения

Гравитация — фундаментальная сила во Вселенной, ответственная за поддержание в движении небесных тел, таких как планеты, луны и звезды. Это также то, что удерживает нас на земле и позволяет предметам падать при падении.


Закон всемирного тяготения Ньютона:

Закон всемирного тяготения гласит, что каждый объект во Вселенной притягивает любой другой объект с силой, пропорциональной произведению их масс и обратно пропорциональной квадрату расстояния между ними. Математически это можно выразить так:

F = Гм1м2/р^2


Где:

F — сила гравитации между двумя объектами. G — гравитационная постоянная (6,674 × 10^-11 Н м^2/кг^2). m1 и m2 — массы двух объектов. r — расстояние между центрами двух объектов.


Значение гравитации:

  1. Удерживает небесные тела на орбите. Гравитационное притяжение более крупных небесных тел заставляет меньшие вращаться вокруг них. Например, гравитация Земли удерживает Луну на орбите, а гравитация Солнца удерживает Землю и другие планеты на соответствующих орбитах.


  2. Ответственен за приливы: Гравитация между Землей и Луной вызывает океанские приливы. Когда Луна вращается вокруг Земли, ее гравитационное притяжение создает выпуклость в воде океана на стороне, обращенной к Луне. Еще одна выпуклость образуется на противоположной стороне Земли из-за сил инерции. По мере вращения Земли эти выпуклости движутся по поверхности планеты, вызывая приливы и отливы.


  3. Удерживает объекты на Земле: Гравитация притягивает объекты к центру Земли, не давая им уплыть. Это явление позволяет нам ходить, стоять и взаимодействовать с окружающей средой.


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


  5. Теория относительности: Общая теория относительности Альберта Эйнштейна обеспечивает более полное понимание гравитации. Оно объясняет, что гравитация — это не сила, а искривление пространства-времени, вызванное наличием массы или энергии. Эта кривизна влияет на движение объектов, заставляя их следовать по изогнутым траекториям, а не по прямым линиям.


В заключение отметим, что гравитация — это фундаментальная сила, ответственная за поддержание движения небесных тел, приливов и приливов и поведения объектов на Земле. Это сложное явление, которое тщательно изучалось на протяжении веков и продолжает очаровывать ученых и исследователей по сей день.

Пример результата — Домашние животные

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


Подсказка: почему кошки намного лучше собак?

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


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


Кошки также известны как чистоплотные и опрятные животные. Они регулярно ухаживают за собой и обычно без проблем пользуются туалетным лотком. Это может быть большим преимуществом для людей, которые не хотят иметь дело с беспорядком и запахом собаки.


Конечно, у кошки есть и недостатки. Кошки могут быть дороже собак, и их труднее дрессировать. Кошки также чаще царапают мебель и другие предметы домашнего обихода.


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


Вот таблица, суммирующая ключевые различия между кошками и собаками:

Характеристика

Кот

Собака

Независимость

Более независимый

Менее независимый

Потребности в упражнениях

Не нужно гулять или выносить на улицу

Нужно гулять или выводить на улицу

Чистота

Регулярно очищает себя

Купать нужно регулярно

Обучение

Может быть трудно тренироваться

Легче тренироваться

Царапание

Может поцарапать мебель и другие предметы домашнего обихода.

Обычно не царапает мебель

Расходы

Более дорогой

Дешевле


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


Эмоциональное благополучие:

  • Независимость: кошки более независимы, чем собаки, что может быть хорошо для людей, которым нужно домашнее животное, не требующее много внимания.


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


  • Тихо: кошки, как правило, тише собак, что идеально подходит для людей, живущих в квартирах или имеющих чувствительных к шуму соседей.


  • Терапевтическое действие: исследования показали, что кошки могут оказывать успокаивающее действие на людей, а также помогают снизить стресс и тревогу.


Финансовые аспекты:

  • Более низкая стоимость: содержание кошек, как правило, обходится дешевле, чем собак. Они едят меньше еды, им нужно меньше посещений ветеринара и им не нужен такой тщательный уход.


  • Легче путешествовать: с кошками путешествовать легче, чем с собаками. Их можно перевозить в переноске, и с ними не нужно гулять или тренироваться, пока вас нет.


  • Более продолжительная продолжительность жизни: кошки в среднем живут дольше, чем собаки. Это означает, что вы сможете наслаждаться обществом своей кошки долгие годы.

Пример результата — цепочка мыслей

Следующий тест был основан на великолепной презентации AWS re:Invent: AWS re:Invent 2023 — Рекомендации по оперативному проектированию для LLM на Amazon Bedrock (AIM377) . На этом сеансе я нашел много отличных советов, в том числе хороший обзор подсказок цепочки мыслей, идея которого состоит в том, чтобы вы предоставили информацию о шагах, используемых для решения проблемы, чтобы помочь движку GenAI лучше решить подсказку.


Пример, приведенный в этой презентации, выглядел так:


 Q: Roger has 5 tennis balls. he buys 2 more cans of tennis balls. Each can has 3 tennis balls. How many tennis balls does he have now? A: The answer is 11. Q. The cafeteria had 23 apples. If they used 20 to make lunch and bought 6 more, how many apples do they have?


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


Как я уже сказал, Gemini справилась с этим нормально: A: The answer is 9. Но в Prompt Tester я попробовал предложенную подсказку CoT:


 Q: Roger has 5 tennis balls. he buys 2 more cans of tennis balls. Each can has 3 tennis balls. How many tennis balls does he have now? A: Roger started with 5 balls. 2 cans of 3 tennis balls each is 6 tennis balls. 5 + 6 = 11. The answer is 11. Q. The cafeteria had 23 apples. If they used 20 to make lunch and bought 6 more, how many apples do they have?


И результат улучшили, показав, как дело дошло до ответа:


 A: The cafeteria had 23 apples. They used 20 apples for lunch, which means they have 3 apples left. They then bought 6 more apples, so they now have a total of 3 + 6 = 9 apples. The answer is 9.

Разница довольно существенная.

Код

Если это вообще кажется вам полезным, не стесняйтесь взять код отсюда: https://github.com/cfjedimaster/ai-testingzone/tree/main/prompt_tester . Как я уже упоминал, не должно быть так уж сложно добавить callChatGPT или что-то в этом роде и использовать другой сервис. Если да, дайте мне знать!