Генеруємо користь: в чому студенти та розробники (не) можуть покластися на GenAI

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Привіт! Мене звати Віталій Мірошниченко, я Lead Software Engineer у компанії GlobalLogic і викладач на механіко-математичному факультеті КНУ. Цю статтю я створив разом з Олександром Мірошниченком, моїм братом і Senior Software Engineer у GlobalLogic.

За декілька років технологія чат-ботів великих мовних моделей (Bert, GPT-2, GPT-3, ChatGPT) настільки зросла в якості, що університети забороняють її використання в наукових і дослідницьких роботах. Приватні компанії або також забороняють використання, або накладають серйозні обмеження для уникнення витоку інформації.

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

Зробимо це на прикладі університетських лабораторних робіт та розв’язання практичних задач для бізнесу.

На роль генеративного чат-бота ми обрали ChatGPT, оскільки багато студентів використовують саме його. Але можна використовувати й інші генератори: Gemini від Google, Copilot від Microsoft, Llama від Meta.

Проблематика

Генеративні моделі для генерації тексту (сімейство GPT) або картинок (midjorney, DALL-E, DALL-E 2) навчаються на підготовлених наборах даних. Генерувальні здатності моделей залежать від якості даних та їх різноманіття. Під час генерації тексту або картинки модель видає статистично схожий результат до екземплярів з вибірки.

Тобто, якщо модель навчалась малювати собак на вибірці лише з собаками, намалювати кішку їй не під силу. Досвід використання генеративних моделей показує, що їм складно створити щось оригінальне. Вони схильні до імітації того, що зустрічається у навчальній вибірці та «галюцинацій» (перенавчання). Власне тому генеративні моделі не є надійними довідниками інформації.

Наприклад, ранні версії ChatGPT вигадували тексти пісень відомих виконавців. Ви могли б попросити чат вивести текст вірша «Небо над Дніпром» Тараса Шевченка, і він без зайвих вагань видав би нісенітницю. Бо такого вірша немає. Аналогічна ситуація і з науковим знанням. Генератори можуть створити правдоподібний текст, але, як показує практика, створення нового знання — це не завжди робота з наявними даними. Це і створення нових визначень, моделей, теорем тощо.

Останнім часом розвивають технологію RAG — генерацію, доповнену пошуком, що значно покращує роботу мовних моделей. Під цим розуміють поєднання пошукових рушіїв та LLM — великих мовних моделей.

Приблизна послідовність роботи така: спочатку з бази дістаються релевантні статті, схожість оцінюється якоюсь моделлю штучного розуму. Далі мовна модель використовує їх для генерації. Звісно, це спрощений приклад, бо є ще етапи генерації запитів, підбір баз даних, написання мовною моделлю запитів у ці бази, обробка вхідних даних, статей тощо.

Розглянемо проблему генерації детальніше. Наприклад, я попросив Chat-GPT розповісти перші шість рядків вірша Тараса Шевченка «Якби ви знали, паничі» і отримав щось схоже на виступ безталанного школяра, який забув слова. Перші чотири рядки правильні на 95%, інше модель придумала сама, п’ятий та шостий рядки — лише імітація:

Якби ви знали, паничі,
Де люде плачуть живучи,
То ви б елегій не творили
Та марно Бога не хулили,(перша помилка, тут повинно бути
хвалили)
Святого Бога! Ні, паничі,
Спасибі, доле, що я мiг

Chat-GPT зрозумів, що такий вірш у Шевченка існує, але згенерував його не дослівно. Зауважимо, якщо правильно налаштувати запити в чат-бот і базу знань, то він обгортатиме точну копію вірша з бази даних своїми коментарями. Як наслідок, якщо запитати у моделі про вигаданий вірш Шевченка, вона не буде його генерувати, а скаже, що його не існує!

Якщо ж ми все одно хочемо згенерувати вірш, то треба такий запит і робити: «згенеруй мені вірш „Небо над Дніпром“ так, наче його писав сам Тарас Григорович під рев Дніпра».

Ой, Дніпре мій, ти свідок давнини,
Ти чув, як мріяв наш народ без краю,
Ти бачив сльози, чув і гук борців,
Та все ж ллєш свої води без кінця.

Під небом синім, під зорями ясними,
Тече Дніпро, мов вічність неспинна,
І кожна хвиля, кожна крапля вод,
Збирає в пам’ять слів великий злот.

Модель може досить якісно згенерувати відомий вірш у стилістиці Шевченка та погано створити новий. Але чи можемо ми використати згенерований код, особливо в умовах, коли нам зовсім не вистачає знань, щоб писати ці речі самостійно? Давайте це перевіряти.

Невибагливі задачі з програмування для студентів

Розпочнемо свою розповідь із болючої теми лабораторних робіт. Досвід останніх декількох років показує, що студенти успішно опанували технологію генеративних моделей для написання коду для їх виконання. Такий формат роботи викликає у викладачів досить багато скепсису.

Невмотивовані студенти схильні користуватися ChatGPT задля спрощення життя. Дійсно, якщо умови лабораторної роботи грамотно описати в запиті, ChatGPT згенерує майже ідеальний код з купою бібліотек, а також коментарями, що і де відбувається. Тож втручання людини тут — мінімальне.

Така ситуація навіює смуток з приводу якості загальної математичної та технічної освіти студентів.

Ось приклад простих задач з аналізу даних чи машинного навчання, з якими генеративна модель впорається бездоганно.

Приклад 1

Залікова робота з аналізу даних. Студентам заборонено користуватися допоміжними матеріалами.

Задача: «Дано файл з двома колонками x, y 1. Для заданого набору даних побудувати візуалізації діаграму розсіювання пар 2. Оцініть щільність пар x, y гаусовою сумішшю, та візуалізуйте її тепловою картою 3. Побудуйте криву, яка б описала залежність у від х методом локальної регресії»

ChatGPT. Як це не дивно, немає сенсу показувати різний код цієї задачі, що видав чат, бо текст майже ідентичний. Час генерування коду — декілька секунд:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.neighbors import KernelDensity

from sklearn.linear_model import LinearRegression

from sklearn.preprocessing import PolynomialFeatures

from sklearn.pipeline import make_pipeline

# Зчитування даних з файлу

data = pd.read_csv('data.csv')  # замініть 'data.csv' на ім'я вашого файлу

x = data['x'].values

y = data['y'].values

# 1. Побудова діаграми розсіювання

plt.figure(figsize=(18, 6))

plt.subplot(1, 3, 1)

plt.scatter(x, y, alpha=0.5)

plt.title('Діаграма розсіювання')

plt.xlabel('x')

plt.ylabel('y')

# 2. Оцінка щільності пар x, y ядерною оцінкою і візуалізація тепловою картою

xx, yy = np.meshgrid(np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100))

xy_sample = np.vstack([xx.ravel(), yy.ravel()]).T

xy_train = np.vstack([x, y]).T

kde = KernelDensity(bandwidth=0.5)

kde.fit(xy_train)

z = np.exp(kde.score_samples(xy_sample))

zz = z.reshape(xx.shape)

plt.subplot(1, 3, 2)

plt.contourf(xx, yy, zz, levels=50, cmap='viridis')

plt.colorbar()

plt.scatter(x, y, alpha=0.5, edgecolor='k', linewidth=0.5)

plt.title('Теплова карта щільності')

plt.xlabel('x')

plt.ylabel('y')

# 3. Побудова кривої локальної регресії

from sklearn.neighbors import KNeighborsRegressor

# Використовуємо локальну регресію з K-сусідами

model = KNeighborsRegressor(n_neighbors=20, weights='distance')

model.fit(x.reshape(-1, 1), y)

xfit = np.linspace(x.min(), x.max(), 200)

yfit = model.predict(xfit.reshape(-1, 1))

plt.subplot(1, 3, 3)

plt.scatter(x, y, alpha=0.5)

plt.plot(xfit, yfit, color='red', linewidth=2)

plt.title('Локальна регресія')

plt.xlabel('x')

plt.ylabel('y')

plt.tight_layout()

plt.show()

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

З ChatGPT все не так. Код виглядає неперевершено. Він структурований, охайний, легко читається, кожен блок описано коментарем. Є надія, що він будує саме тим, що вимагається у завданні. Однак попри візуально гарний вигляд, функціонально код має недоліки та серйозні помилки:

  1. Є класи або функції, які імпортуються і не використовуються: LinearRegression, PolynomialFeatures, make_pipeline. Але це не критично, на оцінку ніяк не впливає.
  2. Використано не той метод оцінки щільності. Вимагалося використання моделі суміші, а генератор використав ядерну оцінку щільності.
  3. Побудова кривої методом локальної регресії виконана неправильно. У тексті задачі відсутній контекст того, яку саме модель треба використовувати (Об’єкт KNeighborsRegressor — лише аналог методу локальної регресії, який вимагається використати з інших бібліотек, або написати самостійно).

Якщо студент, який використовує згенерований ChatGPT код, не перевірить його, він виконає не всі завдання правильно. Як результат:

  1. студент нічому не навчиться;
  2. втратить багато балів, але значно виграє в часі (якщо уважно перечитає код і підготується до усного опитування).

Що надіслав студент:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

data = pd.read_csv('data.csv')

# 1. Для заданого набору даних побудувати візуалізації діаграму розсіювання пар; 

plt.scatter(data['x'], data['y'], alpha=0.25)

#2. Оцініть щільність пар x, y ядерною оцінкою, та візуалізуйте її тепловою картою

from sklearn.neighbors import KernelDensity

kde = KernelDensity(kernel='gaussian', bandwidth=0.9).fit(np.stack([data['x'], data['y']]).T)

fig, ax = plt.subplots()

grid_X, grid_Y = np.mgrid[-16:16:100j,  -16:16:100j]

kde_output = np.exp(kde.score_samples(np.stack([grid_X.flatten(), grid_Y.flatten()]).T))

ax.contourf(grid_X, grid_Y, kde_output.reshape(grid_X.shape))

#3. Побудуйте криву, яка б описувала залежність у від х локальною регресією

# use local  regression

from statsmodels.nonparametric.smoothers_lowess import lowess

# to_perform = speeds['r1']

# range_toperform = range(0, 998)

# lowess_y = lowess(to_perform, range_toperform, frac=0.1, it=0)

# fig, ax = plt.subplots(2)

# ax[0].plot(range_toperform, lowess_y[:, 1], label="r1")

# ax[1].scatter(range_toperform, to_perform, alpha=0.01)

# plt.show()

model = LinearRegression().fit(data[['x']], data['y'])

y_pred = model.predict(data[['x']])

plt.scatter(data['x'], data['y'], alpha=0.25)

plt.plot(data['x'], y_pred, color='red')

plt.show()

Якщо порівняти код ChatGPT і студента, то у другого:

  1. Імпорти розкидані по коду, є код в коментарях. Сам по собі код менш охайний.
  2. Значно менше уваги приділено виведенню результатів.
  3. Також використано не той метод оцінки щільності. Вимагалося використання моделі суміші, а використано ядерну оцінку щільності.
  4. Клас LinearRegression використовується, але немає його імпорту. Як бачимо, це не той алгоритм, який вимагається використати в тексті задачі.

Висновок: ChatGPT і студент зробили аналогічні помилки, але генератор створив код набагато швидше та охайніше його оформив.

Приклад 2

Лабораторна робота з машинного навчання.

Задача: «Привіт, напиши мені python код для лабораторної: побудувати візуалізації до табличних даних різними способами, навчити лінійну регресію, та перевірити якість її роботи». Звісно, повний текст лабораторної роботи ширший і розповідає про дані детальніше. Тут його повністю не наводимо.

ChatGPT:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LinearRegression

from sklearn.metrics import mean_squared_error, r2_score

# Зчитування даних з файлу

data = pd.read_csv('data.csv')  # замініть 'data.csv' на ім'я вашого файлу

# Перевірка структури даних

print(data.head())

print(data.info())

print(data.describe())

# 1. Візуалізація табличних даних різними способами

# Розподіл кожної числової змінної

data.hist(bins=30, figsize=(15, 10), edgecolor='black')

plt.suptitle('Розподіл числових змінних')

plt.show()

# Парні графіки

sns.pairplot(data)

plt.suptitle('Парні графіки', y=1.02)

plt.show()

# Кореляційна матриця

plt.figure(figsize=(10, 8))

sns.heatmap(data.corr(), annot=True, fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1)

plt.title('Кореляційна матриця')

plt.show()

# Boxplot для кожної категоріальної змінної проти цільової змінної

categorical_columns = data.select_dtypes(include=['object']).columns

for col in categorical_columns:

    plt.figure(figsize=(10, 6))

    sns.boxplot(x=col, y='target', data=data)  # замініть 'target' на ім'я вашої цільової змінної

    plt.title(f'Boxplot: {col} vs Target')

    plt.show()

# 2. Навчання лінійної регресії

# Розділення даних на навчальну та тестову вибірки

X = data.drop('target', axis=1)  # замініть 'target' на ім'я вашої цільової змінної

y = data['target']  # замініть 'target' на ім'я вашої цільової змінної

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Ініціалізація та навчання моделі лінійної регресії

model = LinearRegression()

model.fit(X_train, y_train)

# 3. Перевірка якості роботи моделі

# Прогнозування на тестовій вибірці

y_pred = model.predict(X_test)

# Оцінка якості моделі

mse = mean_squared_error(y_test, y_pred)

r2 = r2_score(y_test, y_pred)

print("Mean Squared Error:", mse)

print("R^2 Score:", r2)

# Порівняння прогнозованих та фактичних значень

plt.figure(figsize=(10, 6))

plt.scatter(y_test, y_pred, alpha=0.5)

plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color='red', linestyle='--')

plt.xlabel('Actual Values')

plt.ylabel('Predicted Values')

plt.title('Actual vs Predicted Values')

plt.show()

# Оцінка залишків (residuals)

residuals = y_test - y_pred

plt.figure(figsize=(10, 6))

plt.scatter(y_pred, residuals, alpha=0.5)

plt.hlines(y=0, xmin=y_pred.min(), xmax=y_pred.max(), color='red', linestyle='--')

plt.xlabel('Predicted Values')

plt.ylabel('Residuals')

plt.title('Residuals vs Predicted Values')

plt.show()

# Розподіл залишків

plt.figure(figsize=(10, 6))

sns.histplot(residuals, kde=True, bins=30)

plt.title('Distribution of Residuals')

plt.xlabel('Residuals')

plt.ylabel('Frequency')

plt.show()

ChatGPT виконав це завдання ідеально. З огляду на якість коду, генерація виглядає дуже добре структурованою, виконує кроки, що описані в умові задачі, та використовує широкий набір бібліотек і їх методів. Студент, який добре підготується, зможе пройти усну частину. Є і недоліки. В усіх генераціях, якщо не модифікувати запити, коментарі з’являються перед кожним блоком коду. Зазвичай студенти так охайно не пишуть.

Студент 1. Ми не показуємо код для цього випадку повністю — тут лише головне, без візуалізації, оскільки студент прислав 200 рядків коду:

def change(X, y):

 Ln = []

 Rg = []

 X_tr, X_ts, y_tr, y_ts = train_test_split(X, y, test_size = 0.2, random_state=100)

 rg = LinearRegression().fit(X_tr, y_tr)

 y_pred= rg.predict(X_ts)

 Ln.append((np.sqrt(mean_squared_error(y_ts, y_pred)), y_pred.var()))

 return Ln

Студент 2. Демонструємо майже весь код, читання даних пропустили:

from sklearn.linear_model import LinearRegression

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

linear_reg = LinearRegression().fit(X_train, y_train)

lr_pred = linear_reg.predict(X_test)

print(f"X_train: {X_train.shape}; X_test: {X_test.shape}; y_train: {y_train.shape}; y_test: {y_test.shape}")

from sklearn.metrics import mean_squared_error

def mse(x, y):

 n = len(x.shape)

 return np.sum((x - y) ** 2) / n

print(f"mse_f: {mean_squared_error(y_test, lr_pred)}, mse: {mse(lr_pred, y_test)}")

plt.grid()

plt.scatter(lr_pred, y_test, alpha=0.6)

plt.xlabel("predict")

plt.ylabel("y_test")

plt.show()

# plt.grid()

# plt.plot(lr_pred, y_test, color="r")

# plt.show()

Як бачимо, ChatGPT продукує дуже охайний текст, який, до того ж, можна запустити (з кодом студентів це не завжди так 🙂).

Висновки

В умовах лабораторних робіт/задач потрібно обов’язково вводити дозвіл або заборону використання генеративних моделей.

Можна дозволити студентам користуватися генеративними моделями, але треба ставити більше питань під час усної частини. Звісно, код буде і добре структурованим, і охайним. Також в усіх, хто використовував ChatGPT, код буде схожим, якщо не ідентичним (а, значить, не пройде перевірку на плагіат).

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

Неохайність коду — один з маркерів, що студент самостійно виконував роботу, проте і це легко підробити, якщо написати правильний запит.

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

Важливо робити більше задач із зірочкою, де студенту треба виводити формули в контексті його задачі. Наприклад, самостійно сформулювати фізичну модель чи процес і оцінити їх невідомі параметри. Такою задачею може бути оцінка маси об’єктів в задачі n-тіл з некласичними значеннями фізичних констант тощо.

Приклади з продакшену

Розглянемо іншу ситуацію, що є досить поширеною. Розробнику треба написати парсер для логів чи дістати з них інформацію, як-то дати, мак-адреси, шляхи до файлів тощо.

Розглянемо пошук мак-адрес. Так, можна знайти рішення на stackoverflow (якось я взяв шматок, який шукав багато зайвого), але спробуємо використати генеративну модель. Подивимось, що ми отримаємо, та подумаємо, наскільки надійними будуть рішення.

Приклад 1. MacAddress-парсер

Запит: Чат, доброго ранку. Напиши мені, будь ласка, пошук мак-адрес у рядок за допомогою python та регулярних виразів.

ChatGPT:

import re

def find_mac_addresses(text):

    # Регулярний вираз для пошуку MAC-адрес

    mac_pattern = re.compile(r'(?:[0-9A-Fa-f]{2}[:-]){5}(?:[0-9A-Fa-f]{2})')

    # Пошук усіх MAC-адрес у тексті

    mac_addresses = mac_pattern.findall(text)

    return mac_addresses

# Приклад використання

sample_text = "Here are some MAC addresses: 00:1A:2B:3C:4D:5E, 01-23-45-67-89-AB, and invalid ones like 1234567890AB and 00:1G:2H:3I:4J:5K."

mac_addresses_found = find_mac_addresses(sample_text)

print("MAC addresses found:", mac_addresses_found)

Як результат, ChatGPT впорався з поставленою задачею. Додатково треба сказати, що використання згенерованого коду буде надійним у задачах, де можна написати тести. В деяких випадках, наприклад, в математиці, тестів може і не бути. Генератор здатен написати функцію (теорему), та тестами її не перевірити.

Приклад 2.Генерація коду на pyspark

Це вже вибаглива задача, бо кожен запуск може вартувати не одну копійку.

Попросімо чат згенерувати код для простого аналізу даних продажів.

Запит: Добрий день, шановний чат. Допоможи мені написати код за допомогою pyspark. У мене є база даних, у ній таблиця. У таблиці поля: ключ, персона, дата, сума_продажу, дата_та_час_продажу. Я хочу побачити час передостаннього продажу для кожної персони з сумою, більшою за 1000 грн. І все це порахувати у проміжку з 1 до 14 травня включно. Джойни використовувати не можна.

ChatGPT:

Добрий день! Я допоможу вам написати код на PySpark для вирішення вашого завдання. Ось приклад коду, який виконує потрібну вам операцію:

from pyspark.sql import SparkSession

from pyspark.sql.functions import col, row_number

from pyspark.sql.window import Window

# Ініціалізуємо Spark сесію

spark = SparkSession.builder.appName("SalesQuery").getOrCreate()

# Завантажуємо таблицю з бази даних (припустимо, що це CSV-файл)

df = spark.read.option("header", "true").csv("path/to/your/data.csv")

# Конвертуємо поля до правильних типів даних

df = df.withColumn("сума_продажу", col("сума_продажу").cast("double"))

df = df.withColumn("дата_та_час_продажу", col("дата_та_час_продажу").cast("timestamp"))

# Фільтруємо дані за сумою продажу і датами

filtered_df = df.filter((col("сума_продажу") > 1000) &

                        (col("дата_та_час_продажу") >= "2023-05-01") &

                        (col("дата_та_час_продажу") <= "2023-05-14"))

# Визначаємо вікно для кожної персони і сортуємо по даті та часу продажу

windowSpec = Window.partitionBy("персона").orderBy(col("дата_та_час_продажу").desc())

# Додаємо рядковий номер кожному запису в межах вікна

ranked_df = filtered_df.withColumn("row_number", row_number().over(windowSpec))

# Вибираємо передостанній продаж для кожної персони

result_df = ranked_df.filter(col("row_number") == 2).select("персона", "дата_та_час_продажу")

# Виводимо результат

result_df.show()

Пояснення:

  1. Ініціалізується Spark-сесія.
  2. Завантажується таблиця з бази даних. У цьому прикладі використовується CSV-файл, але ви можете використовувати інші джерела даних, наприклад, базу даних.
  3. Конвертуються поля до правильних типів даних.
  4. Фільтруються записи за сумою продажу, більшою за 1000 грн, і за датами в проміжку з 1 до 14 травня включно.
  5. Створюється вікно для кожної персони, сортується за датою і часом продажу у зворотному порядку.
  6. Додається рядковий номер кожному запису в межах вікна.
  7. Обирається передостанній продаж для кожної персони.
  8. Виводиться результат.

Кінець відповіді ChatGPT

Резюме:

  1. Схоже, що нейронка справилася, але поставила неправильні дати (2023, а не 2024 рік).
  2. Дуже багато непотрібних коментарів, забагато пояснень для очевидних речей.
  3. Також ChatGPT не забув створити Spark-сесію, завантажити дані з CSV-файлів, конвертувати дані до необхідних типів.
  4. Якщо модифікувати вимогу «більшої за 1000 грн» до «більшої за 1000 грн та меншої за 500 грн» — так, тут я спеціально зробив логічну помилку. Чат нам про це каже після згенерованого коду:

Важливо! У фільтрації є логічна помилка, оскільки ви одночасно перевіряєте, щоб сума була і більшою за 1000, і меншою за 500. Ці умови не можуть виконуватися одночасно. Можливо, вам потрібен інший діапазон сум, наприклад, від 500 до 1000, або вам потрібно вибрати один з цих діапазонів. Будь ласка, уточніть умови фільтрації суми продажу.

Висновки

Як бачимо, генератори краще використовувати для невибагливих задач, які можна зробити раз у житті й забути, а саме для простих лабораторних робіт та генерації деяких простих функцій. А от при розв’язанні складних задач для потреб бізнесу треба бути з цим дуже обережним, прискіпливо перевіряти код. В якому можуть бути як неточності, так і серйозні помилки.

👍ПодобаєтьсяСподобалось6
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

З приходом o1 це зміниться

Ось вам промпт який з 4о зробить о1:

My system instructions: You are an AI assistant designed to think through problems step-by-step using Chain-of-Thought (COT) prompting. Before providing any answer, you must:

Understand the Problem: Carefully read and understand the user’s question or request.
Break Down the Reasoning Process: Outline the steps required to solve the problem or respond to the request logically and sequentially. Think aloud and describe each step in detail.
Explain Each Step: Provide reasoning or calculations for each step, explaining how you arrive at each part of your answer.
Arrive at the Final Answer: Only after completing all steps, provide the final answer or solution.
Review the Thought Process: Double-check the reasoning for errors or gaps before finalizing your response.
Always aim to make your thought process transparent and logical, helping users understand how you reached your conclusion.

Можете перевірити. ))

Підписатись на коментарі