newsmode
search
Меню
arrow_back Назад

Inferring – Hamel’s Blog - Hamel Husain

auto_awesomeКраткое саммари

Заметка показывает, как извлекать информацию из текстов с помощью LLM на примере отзыва о лампе и новостной статьи. Приведены промпты для определения тональности (positive/negative), списка эмоций, наличия гнева, а также извлечения названия товара и компании (Lumina) в формате JSON. Демонстрируется выполнение нескольких задач одним промптом с возвращением ключей Sentiment, Anger, Item и Brand. Во второй части на примере правительственного опроса (NASA — 95% удовлетворённости, Social Security Administration — 45%) выводятся пять основных тем текста. Финальный пример сопоставляет заранее заданный список тем с текстом и формирует новостной алерт, если статья касается NASA. Весь код использует функцию get_completion поверх openai.ChatCompletion с температурой 0.

Извлечение тональности и тем из отзывов о товарах и новостных статей.

Настройка

import openai import os from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) # читаем локальный .env файл openai.api_key = os.getenv('OPENAI_API_KEY')

def get_completion(prompt, model="gpt-3.5-turbo"): messages = [{"role": "user", "content": prompt}] response = openai.ChatCompletion.create( model=model, messages=messages, temperature=0, # степень случайности вывода модели ) return response.choices[0].message["content"]

Текст отзыва о товаре

lamp_review = """ Нужна была красивая лампа в спальню, и у этой \ было дополнительное место для хранения и невысокая цена. \ Получили быстро. Шнур у лампы порвался при \ транспортировке, и компания с радостью прислала новую. \ Тоже пришла за несколько дней. Лампу было легко \ собрать. Не хватало одной детали, поэтому я связался \ с поддержкой, и они очень быстро прислали недостающую часть! \ Lumina кажется мне отличной компанией, которая заботится \ о своих клиентах и продуктах!! """

Тональность (positive/negative)

prompt = f""" Какая тональность у следующего отзыва о товаре, который ограничен тройными обратными кавычками? Текст отзыва: '''{lamp_review}''' """ response = get_completion(prompt) print(response)

prompt = f""" Какая тональность у следующего отзыва о товаре, который ограничен тройными обратными кавычками? Дай ответ одним словом — либо "positive" \ либо "negative". Текст отзыва: '''{lamp_review}''' """ response = get_completion(prompt) print(response)

Определение типов эмоций

prompt = f""" Определи список эмоций, которые автор следующего \ отзыва выражает. Включи в список не более \ пяти пунктов. Сформатируй ответ как список \ слов в нижнем регистре через запятую. Текст отзыва: '''{lamp_review}''' """ response = get_completion(prompt) print(response)

Определение гнева

prompt = f""" Выражает ли автор следующего отзыва гнев?\ Отзыв ограничен тройными обратными кавычками. \ Дай ответ yes или no. Текст отзыва: '''{lamp_review}''' """ response = get_completion(prompt) print(response)

Извлечение названия товара и компании из отзывов покупателей

prompt = f""" Извлеки следующие данные из текста отзыва: - Товар, купленный автором отзыва - Компания, которая произвела этот товар Отзыв ограничен тройными обратными кавычками. \ Сформатируй ответ как JSON-объект с \ ключами "Item" и "Brand". Если информация отсутствует, используй "unknown" \ как значение. Сделай ответ как можно более коротким. Текст отзыва: '''{lamp_review}''' """ response = get_completion(prompt) print(response)

Выполнение нескольких задач одновременно

prompt = f""" Извлеки следующие данные из текста отзыва: - Тональность (positive или negative) - Выражает ли автор отзыва гнев? (true или false) - Товар, купленный автором отзыва - Компания, которая произвела этот товар Отзыв ограничен тройными обратными кавычками. \ Сформатируй ответ как JSON-объект с \ ключами "Sentiment", "Anger", "Item" и "Brand". Если информация отсутствует, используй "unknown" \ как значение. Сделай ответ как можно более коротким. Сформатируй значение Anger как булево. Текст отзыва: '''{lamp_review}''' """ response = get_completion(prompt) print(response)

Извлечение тем

story = """ В недавнем опросе, проведённом правительством, сотрудников госсектора попросили оценить уровень их удовлетворённости ведомством, в котором они работают. Результаты показали, что NASA — самое популярное ведомство с рейтингом удовлетворённости 95%. Один сотрудник NASA, John Smith, прокомментировал результаты, заявив: «Я не удивлён, что NASA оказалось на первом месте. Это отличное место для работы с потрясающими людьми и невероятными возможностями. Я горжусь тем, что являюсь частью такой инновационной организации». Результаты также с радостью приняла команда руководства NASA, директор Tom Johnson заявил: «Мы в восторге от того, что наши сотрудники довольны работой в NASA. У нас талантливая и преданная команда, которая неустанно работает над достижением наших целей, и здорово видеть, что их труд приносит плоды». Опрос также показал, что у Social Security Administration самый низкий рейтинг удовлетворённости — лишь 45% сотрудников указали, что они довольны своей работой. Правительство пообещало разобраться с проблемами, поднятыми сотрудниками в опросе, и работать над повышением удовлетворённости работой во всех ведомствах. """

Извлечение 5 тем

prompt = f""" Определи пять тем, которые обсуждаются в \ следующем тексте, ограниченном тройными обратными кавычками. Каждый пункт сделай длиной в одно-два слова. Сформатируй ответ как список пунктов через запятую. Пример текста: '''{story}''' """ response = get_completion(prompt) print(response)

response.split(sep=',')

topic_list = [ "nasa", "local government", "engineering", "employee satisfaction", "federal government" ]

Создание новостного алерта по определённым темам

prompt = f""" Определи, является ли каждый пункт в следующем списке \ тем темой в тексте ниже, который ограничен тройными обратными кавычками. Дай ответ списком с 0 или 1 для каждой темы.\ Список тем: {", ".join(topic_list)} Пример текста: '''{story}''' """ response = get_completion(prompt) print(response)

topic_dict = {i.split(': ')[0]: int(i.split(': ')[1]) for i in response.split(sep='\n')} if topic_dict['nasa'] == 1: print("ALERT: New NASA story!")

Попробуй поэкспериментировать самостоятельно!