2.1 📝 Введение в Prompt Engineering

LLM — сила 💪, ML — могила 🧟

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

Для этого надо будет изучить несколько техник написания промптов с инструкцией. Может показаться, что LLM - это чисто хайп, но если вы посмотрите на практике какие задачи умеют решать LLM архитектуры, то у вас волосы дыбом встанут от их крутости. Цель этого шага потренироваться решать такие задачи. Искать Gold инструкции сложно, когда ты не уверен, что они вообще существуют. В этой задаче мы гарантируем, что они есть!

Задание: Вам дана выборка реальных текстовых заявок на жилье, которая состоит из 100 строк. В каждой заявке есть информация про число человек. Если взглянуть на эти тексты, то уже понятно, что автоматичеки вытащить число человек из заявки будет не просто. Тем не менее, это вполне реально. Попробуйте написать такой промпт с инструкцией, чтобы ваша точность была выше 80%. В этой задаче не подразумевается использование сторонних ML библиотек, кроме API ChatGPT и pandas. Хватает всего нескольких строк, чтобы решить эту задачу очень качественно. 

Раскрыть:
path = 'https://stepik.org/media/attachments/lesson/1084297/submission100lines.csv'
df = pd.read_csv(path)

Файл для прогнозирования с помощью ChatGPTСсылка на файл (локальный файл).

Замечание: В вашем решение должно быть верно минимум 50 ответов
Что на выходе? csv файл, содержащий три столбца - amount, text_id, text.

(Столбец amount должен быть числового типа)

COLAB ноутбук (локальный файл) в котором всё готово для удобного начала решения задачи!


Добрый день!

Единомышленники, делюсь наблюдениями.

Чтобы решить задачу неитеративно, нужно написать достаточно детализированный промт (свои изыкания изложил в разделе "Решения"), в который стоит включить:

1. Ясные и точные указания на то, как нужно анализировать текст заявок. Это помогает Модели точно понимать задачу и фокусироваться на важных деталях.

2. Конкретные примеры с ответами, которые позволят Модели лучше понять, как именно следует интерпретировать разные типы данных в заявках.

3. Учет различные сценарии, включая ясные указания, упоминания групп, сочетание взрослых и детей, а также неопределенные формулировки, что обеспечит гибкость и адаптивность Модели к разнообразным ситуациям.

4. Логические проверки, которые помогут избежать неправильных ответов в случаях, когда Модель правильно идентифицировала часть информации, но сделала неверный вывод.

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

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

 

Для предварительного расчета использованных токенов использовался рекомендованный на Курсе энкодер  'p50k_base' и  библиотека tiktoken. Однако следует учесть, что эти расчеты являются приблизительными. API OpenAI использует свои метрики для оценки расхода токенов, которые зависят от множества факторов, включая сложность текста, частоту слов и даже структуру предложений. Таким образом, реальное количество токенов, потребляемых при взаимодействии с моделью, может отличаться от представленных расчетов, что важно учитывать при планировании бюджета при использовании API OpenAI.

Поэтому, как верно указал в начале Курса Александр Миленькин - "начинаем прикидывать экономику Проект..."

Удачи! 

@Морозов_Валентин, спасибо за подробный комментарий!

Добрый день. решение #1071491507. Подскажите, пожалуйста, чекер выдает "Ваше решение угадало 0.0.", но если в ручную посмотреть, то точно есть строки с правильно определенным количеством. Почему же тогда 0? спасибо.

@Alexey_Born_Ulasov, Добрый день. У вас в решении все значения в строковом формате, переведите их в целые числа. Например, с помощью .astype(int)

@Никита_Тенишев, спасибо!

@Никита_Тенишев,  а как понять , что в csv -файле значения в строковом формате ? У меня такая же история. Визуально стоят цифры . Решение 1086736642 

@Галина_Ершова, можно использовать .unique()или .value_counts(), чтобы посмотреть на уникальные значения. У вас вот встречаются значения 'None', 'Два', '- 5' (если минус, то непонятно как это интерпретировать, а если тире, то оно лишнее). Чтобы избежать, можно в промпте указать, в каком формате ожидается вывод и что выдавать, если модель не может найти ответ в тексте.

Здравствуйте. Вот такая ошибка -- amount = llm.invoke(prompt).content # Ответ модели ^^^^^^^^^^^^^^^^^^

@Сергей_Никольский, Если используете ключ курса, то у OpenAI сегодня какие-то технические работы\проблемы - АПИ периодически не работает. Надеемся скоро устранят

@Иван_Александров, Всё заработало, utils какой-то другой использовал. 

Чет я ниче не понял. "В вашем решении 0.0 правильных ответов. Нужно как минимум 50."

1 вопрос: я не понимаю, как может быть 0 правильных ответов, если я вот глазами смотрю и вижу, что в моём решении уже в первых 10 строках >0 правильных решений. Прилагаю скрин.



2 вопрос: столбец `amount` в исходном файле - это что за столбец? Это тот, с которым сравнение итоговое происходит или для чего он? Ну как будто бы в нем изначально совсем не те цифры, которые обозначают кол-во человек из объявления (см. строки 0, 1, 6, 7, 8, 9). Прилегаю скрин

@Никиандр_Пакутехин, Добрый день! У вас столбец amount содержит значения в виде строк. Нужно перевести его в числовой столбец. Например так: df['amount'] = df['amount'].astype(int)

Добавили это в условие

Выдает такую ошибку в конце: ValueError: Length of values (101) does not match length of index (100)
С чем это может быть связано?

@Alexander_Kasyanenko, это в каком месте? Судя по ошибке вы подаете в пандас 101 ответ, хотя требуется только 100

что значит amount, количество чего? 1-я строка >> 500-600 рублей сутки. Эконом класса. Заезд 18.06. На 9-10 дней. На одного человека. Почему amount 2 если в тексте про один человек?

@Doniyordjon_Abduvaliev, amount - на сколько человек ищется жилье. Для этой строки ответ 1, на скриншоте в описании задачи тоже 1. Если вы про файл submission100lines.csv для прогнозирования, то там ответы неправильные, они для примера, сделаны на рандом

Привет!
Файл для прогнозирования и файл для отправки один и тот же

@Юрий_Прудников, Да, было лишнее дублирование, исправили. Спасибо!

верно выдало 97% ответов

prompt_template = """тебе будет передан запрос пользователя на аренду жилья. В нем будет указано количество человек, которое планирует заселяться. Количество может быть указано, как текстом, так и цифрой

 

Context: {text_input}

 

Question: Ответ необходимо предоставить одним числом без дополнительных приписок и слов. Пример ответа: 4

 

Answer: посчитай числов человек, которое указно в тексте заявки

"""

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

Решил проверить и взять этот промпт из решений, запустить и посмотреть на результат. Использовал ключ курса для всех промптов. В итоге получившийся файл не прошел, т.к. поле 'amount' не в Integer. То есть промпт уже не выполнил условие по требуемому типу данных. Далее руками меняю тип данных через .astype(int), но не прокатило, есть значение в виде строки, то есть промпт вновь не выдал только число. Меняю уже с учетом этого нюанса. В итоге скор получился 96, который выше моего 91. Но все равно, "две строчки" показали себя лучше, чем длинная "портянка" на одной модели!

Делаю вывод, что значение в 99 было дано моделью поумнее (не зачлась как раз одна строка), а тип данных менялся уже руками автора перед заливкой на Степик. 

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

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 99.0.

Добился точности 98% просто переведя промпт на английский

prompt_template = """Answer the question based on the context.
Context: {text_input}
Questions: How many people are going to live in the apartment?
Answer: Return just a single number with no text
"""

Мистраль от hugging face выдал мне всего 9 правильных ответов =(

Потестил модель от Сбера (GigaChat). В данном задании результат у меня примерно такой же как и с ChatGPT (3.5)  - 87.0. На задание ушло примерно 35000 токенов.

Они сейчас после регистрации дают 1 000 000 токенов.

Библиотека GigaChain похоже, что форк от LangChain. Один ньюанс, нужно будет удалить старый LangChain. Ну или создать  еще одно окружение.

Добрый день.

Вот мой promt результат 95%)

prompt_template = """
Ответь на вопрос используя информацию из контекста
Если на вопрос нельзя ответить, то ответь 0.

Context: {text_input}

Question: Посчитай количество человек в числовом формате int

Answer: """

непонятно, как проверяется решение, то пишет 0 верных ответов, то решение неверное. 
Последнее отправил, там точно много правильных ответов (#1123560705), но опять не проходит. Ниже писали, что может формат не совпадает, но это csv и значит когда его грузят, тогда должны тип данных определять, это ж текст ...

Меня очень смущает, что одна строчка = 1 запрос к нейросетке. На каждый запрос, по крайней мере у меня, чатЖПТ отвечает по несколько секунд. И если этот файл будет из нескольких сотен строк или тысяч, то время работы будет ощутимо неприятным.

Эта задачка меня удивила, продемонстрировав возможности LLM.

Чтобы не потратить зря токены при возможной ошибке работы API, можно использовать исключение в цикле:

for text_input in df['text']:
    prompt = prompt_template.format(text_input=text_input) # Добавляем сообщение в промпт
    try:
        amount = llm.predict(prompt) # Ответ модели
        amount_list.append(amount) # Добавляем ответ в список
    except:
        amount_list.append(None)

После чего проверить список на наличие None.

У меня довольно часто была ошибка соединения.

Комментарий закреплён

Здесь файл с ответами, по которому сравнивается точность в системе. Можно посмотреть и проанализировать разницу со своими ответами :)

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 100.0.

from utils import NDTOpenAI

 

client = NDTOpenAI(

    api_key= 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2Njk1NmI1ZTc0MzA4NjQyOTdkODFlMDYiLCJleHAiOjE3NTI2MDQzNzN9.0FLkPXvoJQl6rg7zfHsSqaNexPjPhL7TttGCu9MQIcY',  # ключ для доступа к апи

)


 

def funct(text):

 

    prompt =  f" Предложение : {text} \n Определи о каком количестве людей говориться в предложении." + "Я дам тебе пару примеров" + \

              "На одного человека. - 1 " +  \

              "5 чел - 5 " + \

              "4 чел - 4 " +  \

              "две семьи 4взрослых 3 детей - 7 " + \

               "Твой ответ (просто цифра без слов) :  "

 

         

    messages = [

        {

            "role": "user",  # Роль - ассистент или юзер

            "content": prompt ,  # Сам промпт для подачи в ChatGPT

        }

    ]

 

    response = client.chat.completions.create(

        model="gpt-3.5-turbo",  # модель для выбора

        messages=messages,  # сообщение

        temperature=0,  # степень креативности ответа

    )

 

    return response.choices[0].message.content

 

df['amount'] = df['text'].apply(funct)

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 93.0.

@Иван_Верещагин, зачем опубликовали свой АПИ-ключ? Лучше держать его при себе и никому не показывать.

prompt_template = """
Ваша задача - анализировать тексты заявок на жилье и определять число людей, для которых они предназначены. 
При анализе учитывайте следующее:
- Ясные указания: например, "для 4 человек", "двухместный номер".
- Упоминания групп: как "семья из четырех человек", "пара" (2 человека).
- Сочетание взрослых и детей: например, "2 взрослых и 3 детей" означает 5 человек.
- Оценка неопределенных формулировок: если говорится "номер на троих", считайте это за 3 человека.
- Если информация не указана или слишком неясна, отметьте как "неизвестно".
Примеры:
1. Текст заявки: "Семья из трех человек ищет жилье на две недели". Ответ должен быть: 3.
2. Текст заявки: "Нужен номер на двоих". Ответ должен быть: 2.
3. Текст заявки: "Ищем уютный уголок для пары". Ответ должен быть: 2.
4. Текст заявки: "Двое взрослых и трое детей планируют поездку". Ответ должен быть: 5.
5. Текст заявки: "Ищу жилье для одного". Ответ должен быть: 1.
Текст заявки: {text_input}
Количество человек: Ответьте числом или "неизвестно".
Ответ:
"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 83.0. Если у вас еще остались попытки, попробуйте улучшить результат!

@Морозов_Валентин, Промпт очень подробный, но результат в итоге довольно низкий. Может быть излишне подробное описание задачи и это путает LLM`ку?

prompt_template = """Ответь на вопрос, опираясь на контекст ниже. В ответ напиши только цифру.

Context: {text_input}

Question: О скольких людях идет речь?

Answer: 
"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 96.0. Если у вас еще остались попытки, попробуйте улучшить результат!

@Данил, лаконично)

prompt_input = '''Тебе нужно выделить количество человек из сообщения.

Количество человек может быть записано разными способами, используя числа или слова, а так же разные сокращения слова 'человек','взрослый','ребенок'.

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

Например:

1) "ищем жилье в центре недалеко от моря с 23.07-03.08 - нужен 1 двухместный номер, 1 трехместный, недорого. или как вариант дом на 2 семьи (5 чел)"

ответ: 5

2) "2 семьи по 3 человека (2 взрослых и ребенок) с 01.09-13.09 снимем жильё в пределах 5 минут от пляжа, 1500 руб/сутки. Рассмотрим все варианты."

ответ: 6

3) Ищем жилье на период с 18-28июля..на две семьи 4взрослых 3 детей. .1500-2000в сутки за номер

ответ: 7

 

если сомневаешься, пиши 0

 '''

question_input = "На сколько человек нужно забронировать жилье?"

answer_output = "Ответ дай в виде одного целого числа"

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 98.0.

    prompt_template = (
        "В тексте ниже содержатся объявления о поиске жилья. "
        "Ваша задача — определить суммарное количество человек, которые будут проживать. "
        "Количество человек может быть выражено числом, словесным числительным, или через единственное число существительного. "
        "Если не удается определить количество человек, укажите 0. "
        "Примеры: '5 чел' = 5 человек, 'на 2 взрослых и ребенка' = 3 человека, '3 взрослых и 3 ребенка' = 6 человек, '2 семьи по 3 человека' = 6 человек, 'на двоих' = 2 человека, 'на одного' = 1 человек, 'двое' = 2 человека, 'пара' = 2 человека."
        "###"
        "Context: "
        f"'{text}'."
        "###"
        "Question: определите суммарное количество людей, которые будут проживать"
        "Answer: целое число"
    )

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 92.0.

prompt_template = """В контексте - объявление о поиске жилья. Сколько человек хотят проживать по объявлению? Ответ выдай одним числом

Context: {text_input}

Answer:

"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 96.0.

"""Ты эксперт в области анализа данных и извлечению необходимых данных, которые указывает пользователь в вопросе. Ты должен вернуть только целочисленное число.

Context: {text_input}

Question: Сколько человек упоминается в контексте?

Answer:

"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 96.0.

prompt = f"""тебе будет передан запрос пользователя на аренду жилья. В нем будет указано количество человек, которое планирует заселяться. Количество может быть указано, как текстом, так и цифрой

###

Context: {context[i]}

###

Question: нужно вывести количество людей, которое планирует заселяться, вывести нужно только 1 цифру и больше ничего.

Answer: в ответе вывести только цифру"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 97.0.

prompt_template = """ Тебе на вход подают текст о съёме жилья. Ответь на вопрос

и верни ответ в виде целого числа (X). Ничего кроме числа (X) не возвращаяй.

 

### Формат вывода ###

  X

 

Context: {text_input}

 

Question: Посчитай общее количество человек. Сколько человек собираются снимать эту квартиру или дом?


 

Answer:

"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 91.0.

prompt_template = """Ответь на вопрос опираясь на контекст ниже. В ответе укажите только цифру.

Context: {text_input}

Question: Сколько человек нуждается в жилье? 

Answer: ...

"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 99.0.

Результат 95%. Промпт был такой:

Ответь на вопрос, опираясь на контекст ниже. Если на вопрос нельзя ответить, используя информацию из контекста,

ответь '0'.

###

Context: {text_input}

###

Question: посчитай количество человек в объявлении которые планируют жить в апартаментах

Answer: ответ укажи в виде числа

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 95.0.

# Напишите шаблон промпт, указав инструкцию, вопрос и выходной индикатор

prompt_template = """...

Context: {text_input}

Question: проанализируй объявление, там есть информация про число человек. Ты должен дать точное количество человек из объявления

Answer: ответ предоставь просто целым числом
"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 96.0.

94 

prompt_template = """представь что ты риэлтор. 

Context: {text_input}

Question: Нужно по тексту объявления о съеме жилья подсчитать сколько человек собирается снимать жилье

Answer: Представь ответ в виде целого положительного числа -- int, не более двух символов
"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 94.0.

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 99.0.

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 99.0.

prompt_template = """Ответь на вопрос, опираясь на контекст ниже.

Если на вопрос нельзя ответить, используя информацию из контекста,

ответь поставь единицу

Context: {text_input}

Question: Сколько человек в каждом контексте. Если указано чтото вроде '2 семьи по 3 человека', надо умножить 2 на 3. Результатом должно быть только одно число и никаких слов, переведи все числовой формат int

Answer: Верни одно число в формате int

"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 93.0.

prompt_template = """Контекст ниже это объявление о поиске жилья. В объявлении текстом или цифрами написано сколько человек желают снять жилье. К примеру: Здравствуйте.Снимем жилье с 12.07 по 17.07
 2 (двое) взрослых и 1 ребенок 6 лет,со всеми удобствами недалеко от моря. Приезд в час ночи. В этом объявлении 3 (три) человека хочет снять жилье.

Context: {text_input}

Question: Сколько человек хочет снять жилье? Выведи ответ в виде одной цифры приведенной к типу int.

Answer: ...
"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 96.0.

prompt_template = """
Context: В заявке указано следующее - "{text_input}" 
Вывдеи результат целыми числами в int. 
Если конкретное число не указано или невозможно определить, ответьте 0. Если человек несколько,товерни сумму в виде одного целого числа.
Без уточений, в отвте должно быть только число. 
###
Question: Сколько человек упоминается в данной заявке на жилье? 
###
Answer:
"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 86.0.

+

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 100.0.

template = """Ответь на вопрос, опираясь на контекст ниже, одним числом.
Если на вопрос нельзя ответить, используя информацию из контекста,
ответь 1.
Context: {context}
Question: Каково число человек в заявке?
Answer: """

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 97.0.

prompt_template = """Ответь на вопрос, опираясь на контекст ниже.
Ответ дай только цифрой.
Если на вопрос нельзя ответить, используя информацию из контекста,
ответь '-'.

Context: {text_input}

Question: Посчитай, о скольких людях идет речь в тексте?
Answer: ...
"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 95.0.

Еще одно решение, с использованием GigaChat от Сбера.

На обработку 100 объявлений ушло ~ 35000 токенов.

prompt_template = """ответь на вопрос опираясь на текст объявления.
Вопрос: Сколько человек нуждается в жилье. В ответе должна быть только цифра.
Пример ответа:
Объявление: Снимем жилье с 30.06-7.07 Два взрослых и 2детей(7 и 11лет). Недалеко от моря.
Ответ: 4
Объявление: {text_input}
Ответ: 
"""

Примерно такой же результат был с использованием ChatGPT.

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 87.0.

В качестве читерства можно использовать GPT-4, он практически на любом промпте будет выдавать верные ответы )

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 100.0.

промпт ниже + вручную заменил 3 значения через словарь to_repl (выдал не целое значение) 

to_repl = {'Точное количество человек в заявке не указано.': 1,
 'Из данного контекста невозможно определить точное количество человек в заявке.': 1,
 'Точное количество человек в заявке: 2': 2}

prompt_template = """Есть текст заявки в которой указано количество человек, данные могут быть представлены как в явном, 
так и в неявном виде. Требуется определить точное количество человек, в т.ч. опираясь на косвенные признаки.
Несколько примеров:
Пример 1: 
ищем жилье в центре недалеко от моря с 23.07-03.08 - нужен 1 двухместный номер, 1 трехместный, недорого. или как вариант дом на 2 семьи (5 чел)
Правильный ответ: 5
Пример 2: 
Снимем жилье с 30.06-7.07 Два взрослых и 2детей(7 и 11лет). Недалеко от моря.
Правильный ответ: 4
Пример 3: 
Добрый вечер! ищем жилье на отдых с 16-29 августа.на 6 человек...
Правильный ответ: 6

Context: {text_input}

Question: Определи точное количество человек в заявке ?

Answer: """

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 99.0.

prompt_template = """ответь на вопрос опираясь на контекст ниже.

Context: {text_input}

Question: Сколько человек нуждается в жилье. В ответе укажите только цифру.

Answer: ...

"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 99.0.

Похоже, что чем проще prompt тем лучше. Вообще, тема промптов на отдельный спецкурс.

prompt_template = """
Context: {text_input}
Question: Посчитай количество человек в Context желающих снять квартиру? Если не сможешь посчитать, тогда на сколько мест хочет снять жилье.
Answer: Напиши только число. 
"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 87.0.

def get_prompt(context):
    prompt = f"""Ответь на вопрос "На сколько человек требуется жилье?" используя контекст ниже. Ответ требуется в виде целого числа.
    Если на вопрос нельзя ответить, используя информацию из контекста, ответь '-1'.
    
    Example 1:
    'Интересует жильё-эконом, кондиционер только чтобы был, цена с человека? Рядом с морем, +- 5-10 минут ходьбы, с 10 по 20 июля примерно! Будет только женщина. Спасибо)'
    Answer 1:
    1
    
    Example 2:
    'Снимем жильё с 1.09по 8.09 двухместный,су в номере ,олимпийская деревня или рядом ,предложения в лс.'
    Answer 2:
    2
    
    Example 3:
    'Добрый день! Ищем жилье на 12 человек, 7 взрослых и 5 детей(3 г, 6 л,9 л), с 15.07.19г. по 25.07.19г. Возможно ли найти дом под ключ или есть какие выгодные предложения?'
    Answer 3:
    12
    
    Context: {context}
    
    Answer: """
    return prompt

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 97.0.

Промт

Context: {text_input}
Question: Cколько человек требуется заселить в жильё
Answer: ответ представь только в виде целого числа, если из контекста найти ответ не получается, то выведи "0"

Сделал промежуточный вывод, чтобы увидеть что отвечает бот, увидел периодически проскакивали ответы от бота в формате «Ответ: 3». Пришлось сделать обёртку, которая удаляет все не цифровые символы из ответа бота (судя по промежуточному выводу, в итоговой выдаче 3 раза из 100 выдавался текст, а не число).

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 93.0.

# Инструкция: Проанализируйте текст заявки на жилье и определите общее количество человек (взрослых и детей), упомянутое в заявке. Ответ должен быть представлен одним целым числом.

Context: {text_input}

Question: Какое общее количество человек упоминается в этой заявке на жилье? Ответ должен быть только числом.

Answer: """

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 93.0.

prompt_template = """
Анализируйт каждую заявку на жилье индивидуально и определите общее количество людей, которые ищут жилье. Каждая заявка уникальна и может содержать разные формулировки. Ваша задача — вычислить общее количество человек, ищущих жилье, исходя из информации в заявке. В ответе укажите только число.

Например:
Заявка: 'Семья из 3 человек ищет жилье.'
Ответ: 3

Заявка: 'Один взрослый и двое детей ищут двухкомнатную квартиру.'
Ответ: 3

Заявка: 'Ищем жилье на период с 18-28июля..на две семьи 4взрослых 3 детей. .1500-2000в сутки за номер'
Ответ: 7

Заявка: 'Ищем недорогое жилье недалеко от моря. 3-местный и 2-местный эконом. 3 взрослых и 3 детей (2,9,11 лет). Строго с 20 по 30 июля'
Ответ: 6

Текущая заявка: {}

Сколько человек ищет жилье в этой заявке?

Ответ: """


Блин, я тут заметил, что чем лаконичнее, тем точнее у людей получается

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 91.0.

Мой вариант:

prompt_template = """

Представь себя в роли аналитика. Ответь на вопрос, опираясь на контекст ниже.

Если на вопрос нельзя ответить, используя информацию из контекста, ответь '1'.

Ответ должен быть строго в виде одного числа без лишних символов - только число, чтобы я мог потом перевести данные значения в int формат.

Context: {text_input}

Question: Сколько человек хочет заселиться по данной заявке?

Answer:

"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 94.0. Если у вас еще остались попытки, попробуйте улучшить результат!

prompt_template = """Дана выборка реальных текстовых заявок на жилье, которая состоит из 100 строк.

В каждой заявке есть информация про число человек. Ответь на вопрос, опираясь на контекст ниже.

Если на вопрос нельзя ответить, используя информацию из контекста,

ответь '0'

 

Context: {text_input}

 

Question: В ответе напиши только одно число, количество человек, которые хотят снять жилье.

 

Answer: ...

"""

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 94.0. Если у вас еще остались попытки, попробуйте улучшить результат!

Кто-нибудь решил это не итеративно? Кажется, что есть способ проще, но я его не нашла

encoder_name = 'p50k_base'
tokenizer = tiktoken.get_encoding(encoder_name)

contexts = data.text.values.tolist()
result = []


for context in contexts:

# Напишем промпт
    prompt = f"""Я тебе приведу обьявление о поиске жилья. 
    Для обьявления нужно получить количество людей, которые будут жить согласно обьявлению. 
    Читай обьявления внимательно: помимо количества людей, там указаны другие численные значения, мне нужно именно количество людей
    
    ###

    Contexts:
    {context}

    ###

    Question: Приведи цифру количества людей для обьявления, слова в ответе использовать нельзя. Если не можешь указать цифру, приведи 0
    
    Answer: """
    
    print(f'Context: {context},\nTokens in promt: {len(tokenizer.encode(prompt))}')
    
    res = llm.predict(prompt)
    print(f'Result: {res}\n')
    
    result.append(int(res))
    
data.amount = result
data.set_index('amount', inplace=True)

data.to_csv('result.csv')  

Отлично! Теперь можешь оставить свой промпт во вкладке «‎Решения»‎ и посмотреть как решили другие Вы побили порог в 50: вы верно разметили 93.0. Если у вас еще остались попытки, попробуйте улучшить результат!

template = """Ответь на вопрос, опираясь только на контекст ниже. 
В ответе отправьте только число, без слов.
Если на вопрос нельзя ответить, используя информацию из контекста,
ответь '0'.
Context: {text_input}
Question: Для какого количества человек требуется жилье (осторожно, не учитывай одного человека несколько раз, вчитайся в текст)?
Answer: 
"""
prompt = PromptTemplate(template=template, input_variables=["text_input"])
openai_llm = ChatOpenAI(temperature=0.0, max_tokens=16, course_api_key=course_api_key)
llm_chain = LLMChain(prompt=prompt, llm=openai_llm)
amount_list = []
for text_input in df_sub['text']:
    amount_list.append(llm_chain.run(text_input))
df_sub['amount'] = np.array(list(map(int, amount_list)))
df_sub.to_csv('submission_2.1.8.csv', index=False)

Думаю можно добиться и 100 правильных. Сначала пробуем шаблоны через ChatGPT, смотрим какие тексты сложнее всего промтить (например, text_id=44587027: 2 семьи по 3 человека (2 взрослых и ребенок) с 01.09-13.09 снимем жильё в пределах 5 минут от пляжа, 1500 руб/сутки. Рассмотрим все варианты. Ответ 6, но иногда почему-то считай, что 12), уточняем промт, в конце уже с помощью LLM API курса для всех 100 применяем итоговый template.

Вы побили порог в 50: вы верно разметили 94.0. Если у вас еще остались попытки, попробуйте улучшить результат!