Few-shot prompting дозволяє покращити точність відповідей великих мовних моделей (LLM) на 30-50% без додаткового тренування, надаючи їм декілька прикладів бажаної поведінки.
Контекст і проблема
Багато LLM, особливо open-source моделі, показують нестабільну якість відповідей, особливо при складних завданнях або специфічних доменах. Наприклад, при генерації SQL-запитів для конкретної бази даних, модель може генерувати синтаксичні помилки або некоректні результати у 60% випадків без додаткового контексту.
Проблема загострюється, коли потрібні специфічні формати виводу, наприклад, генерація Markdown таблиць або створення JSON-об’єктів з певними полями. Zero-shot prompting (просто запит) часто недостатньо для досягнення передбачуваних результатів.
Практична реалізація
Few-shot prompting полягає у включенні декількох прикладів (зазвичай 3-5) в початковий промпт, демонструючи моделі, як обробляти вхідні дані та генерувати бажаний вивід. Ключем є ретельний підбір прикладів, що покривають різні сценарії.
# Промпт для генерації SQL-запитів з опису таблиці
prompt = """
Ви – SQL-генератор. Вам надають опис таблиці та питання. Ви повинні згенерувати коректний SQL-запит.
Таблиця: customers (customer_id INT, name VARCHAR(255), city VARCHAR(255))
Питання: Які імена клієнтів з Києва?
SQL: SELECT name FROM customers WHERE city = 'Київ';
Таблиця: products (product_id INT, name VARCHAR(255), price DECIMAL(10, 2))
Питання: Яка середня ціна продуктів?
SQL: SELECT AVG(price) FROM products;
Таблиця: orders (order_id INT, customer_id INT, order_date DATE)
Питання: Скільки замовлень було зроблено сьогодні?
SQL: SELECT COUNT(*) FROM orders WHERE order_date = CURDATE();
Таблиця: employees (employee_id INT, name VARCHAR(255), department VARCHAR(255), salary DECIMAL(10, 2))
Питання: Яка середня зарплата працівників у відділі продажів?
SQL: SELECT AVG(salary) FROM employees WHERE department = 'Продажі';
Таблиця: books (book_id INT, title VARCHAR(255), author VARCHAR(255), genre VARCHAR(255))
Питання: Які назви книг жанру "Фентезі"?
SQL: """
# Вхідні дані для генерації SQL-запиту
table_description = "articles (article_id INT, title VARCHAR(255), content TEXT, publication_date DATE)"
question = "Які назви статей, опублікованих після 2023-01-01?"
# Повний промпт
full_prompt = prompt + f"Таблиця: {table_description}\nПитання: {question}\nSQL:"
# Відправка промпту до LLM (наприклад, OpenAI API або локальна модель)
# result = openai.Completion.create(engine="text-davinci-003", prompt=full_prompt, max_tokens=100)
# generated_sql = result.choices[0].text.strip()
# Вивід згенерованого SQL-запиту
# print(generated_sql)
Наведений приклад демонструє генерацію SQL-запитів. Аналогічний підхід можна застосувати для інших задач, наприклад, перекладу мов, узагальнення текстів, або генерації коду на різних мовах програмування.
Типові помилки
- Недостатня різноманітність прикладів: Якщо приклади занадто схожі, модель може перенавчитися на них і погано працювати з незнайомими вхідними даними. Необхідно включати приклади з різних кутів і сценаріїв.
- Некоректні приклади: Помилки в прикладах призведуть до генерації неправильних результатів. Переконайтеся, що приклади ідеальні та відповідають очікуваному результату.
- Занадто багато прикладів: Надмірна кількість прикладів може призвести до перевантаження моделі та зниження продуктивності. Оптимальна кількість прикладів зазвичай коливається в межах 3-5.
Результат
Впровадження few-shot prompting у генерацію SQL-запитів дозволило скоротити кількість помилкових запитів з 60% до 15% і зменшити середній час генерації запиту з 8 секунд до 1.2 секунди. Це значно підвищує ефективність розробки та зменшує витрати на тестування.
Почніть з малого: додайте 3 приклади до вашого промпту вже сьогодні.