15 Технік Запитів, Які Повинен Знати Кожен Розробник для Генерації Коду

текст перекладу

Вступ

Інженерія запитів стала важливою складовою ефективного генерування коду. Правильно побудовані запити дозволяють спрямувати великі мовні моделі (LLM) для генерації, удосконалення та оптимізації коду вашої програми. У цьому пості ми розглянемо 15 перевірених технік запитів, які можна класифікувати як основні, покращувальні, розбиття на частини, техніки мислення та підготовка. Кожну техніку буде проілюстровано через процес створення та вдосконалення простого веб-додатку на Flask.

Ми почнемо з базового додатку "Hello World" на Flask, а потім крок за кроком будемо його покращувати — показуючи, як кожна техніка може систематично вдосконалювати або розширювати можливості згенерованого коду.

1. Основні техніки

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

1.1. Прямий запит

Огляд

  • Ви даєте чітку команду без додаткових деталей або контексту.

Приклад запиту

“Згенеруй мінімальний Flask додаток на Python, який виводить ‘Hello World!’ на кореневому маршруті.”

Згенерований код (концептуальний)

from flask import Flask
app = Flask(__name__)@app.route('/')  
def hello_world():  
 return "Hello World!"if __name__ == '__main__':  
 app.run(debug=True)

Чому це працює

  • Пряме, стисле доручення часто достатньо для менших завдань.
  • Як це покращує: Це створює основу для подальших покращень у наступних техніках.

1.2. Запит на основі питання

Огляд

  • Ви ставите запитання, яке стимулює модель до пояснення або надання фрагменту коду.

Приклад запиту

“Як створити мінімальний Flask додаток, який виводить ‘Hello World!’ на домашній сторінці?”

Згенерована відповідь (концептуальна)

  • Модель може повернути не тільки фрагмент коду, а й пояснення кожного кроку при створенні Flask додатка.

Чому це працює

  • Поставлене запитання може спонукати LLM надавати більш детальні відповіді.
  • Як це покращує: Порівняно з прямим запитом, ви отримуєте додатковий контекст або обґрунтування коду.

1.3. Запит на основі прикладу

Огляд

  • Ви надаєте приклад бажаного стилю або формату, щоб модель зрозуміла структуру, яку ви очікуєте.

Приклад запиту

“Ось простий сервер Node.js Express ‘Hello World’:

const express = require('express');  
const app = express();  
app.get('/', (req, res) => res.send('Hello World!'));  
app.listen(3000, () => console.log('Example app listening on port 3000!'));

Створіть подібний сервер ‘Hello World’ на Flask.”

Як це покращує

  • Модель може відтворити структуру та стиль коду з вашого прикладу, забезпечуючи узгодженість між фреймворками.
  • Цей підхід точніший, ніж прямий запит, тому що він прив’язує результат до відомого шаблону або стилю.

2. Техніки покращення

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

2.1. Ітеративне покращення

Огляд

  • Ви починаєте з початкового рішення (наприклад, мінімальний Flask додаток), а потім доручаєте моделі вдосконалити або покращити код.

Послідовність запитів

  1. “Згенеруй мінімальний Flask додаток, який виводить ‘Hello World!’”
  2. “Тепер, зміни цей Flask додаток, додавши маршрут /hello/, який привітатиме користувача за іменем.”

Покращений фрагмент коду (концептуальний)

from flask import Flask
app = Flask(__name__)@app.route('/')  
def hello_world():  
 return "Hello World!"@app.route('/hello/')  
def hello_name(name):  
 return f"Hello, {name}!"if __name__ == '__main__':  
 app.run(debug=True)

Чому це працює

  • Ви вдосконалюєте існуючий код, спрямовуючи модель на поетапне покращення.
  • Як це покращує: Ця техніка сприяє ітерованому процесу, що дозволяє адаптувати і розширювати функціональність крок за кроком.
    текст перекладу
    ## Розширення запитів

Огляд

  • Ви спеціально просите модель додати нові функції або секції до існуючого коду.

Приклад запиту

“Додайте маршрут до існуючого Flask додатку, який повертає JSON відповідь з переліком зразкових користувачів.”

Покращений фрагмент коду (концептуальний)

@app.route('/users')  
def get_users():  
 users = [  
 {"id": 1, "name": "Alice"},  
 {"id": 2, "name": "Bob"}  
 ]  
 return {"users": users}

Чому це працює

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

2.3. Трансформація стилю/форматування

Огляд

  • Ви просите змінити стиль коду, наприклад, відповідність PEP 8, правила іменування або архітектурні патерни.

Приклад запиту

“Візьміть поточний код Flask додатку та перетворіть імена функцій, щоб вони відповідали правилам іменування PEP 8 (наприклад, hello_world hello_world). Також переконайтеся, що довжина рядків не перевищує 79 символів.”

Чому це працює

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

3. Техніки на основі розбиття

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

3.1. Розбиття по функціях

Огляд

  • Ви розбиваєте складні завдання на кілька підфункцій або модулів.

Приклад запиту

  1. “Створіть функцію init_db() для ініціалізації SQLite бази даних для Flask додатку."
  2. “Створіть функцію insert_user(name) для додавання користувача в базу даних."
  3. “Створіть функцію get_all_users() для отримання всіх користувачів з бази даних."

Результат (концептуальний)

import sqlite3
def init_db():  
 conn = sqlite3.connect('mydatabase.db')  
 c = conn.cursor()  
 c.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)')  
 conn.commit()  
 conn.close()def insert_user(name):  
 conn = sqlite3.connect('mydatabase.db')  
 c = conn.cursor()  
 c.execute('INSERT INTO users (name) VALUES (?)', (name,))  
 conn.commit()  
 conn.close()def get_all_users():  
 conn = sqlite3.connect('mydatabase.db')  
 c = conn.cursor()  
 c.execute('SELECT id, name FROM users')  
 results = c.fetchall()  
 conn.close()  
 return results

Як це покращує

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

3.2. Запит на основі частин

Огляд

  • Ви надаєте частковий код і просите модель доповнити конкретні відсутні частини.

Приклад запиту

“Ось початок Flask додатку. Заповніть відсутні маршрути для додавання користувача та отримання всіх користувачів з бази даних.”

from flask import Flask, request  
from db_utils import init_db, insert_user, get_all_users
app = Flask(__name__)init_db()# TODO: Add routes hereif __name__ == '__main__':  
 app.run(debug=True)

Чому це працює

  • Сфокусовано на конкретних відсутніх сегментах, що забезпечує узгодженість з наданим кодом.
  • Як це покращує: Запит є більш цілеспрямованим, ніж загальні запити — корисно для поетапного розбудови реальних проєктів.

3.3. Покрокові інструкції

Огляд

  • Ви перераховуєте кожне підзавдання або логічний крок, який хочете реалізувати в коді.

Приклад запиту

  1. “Імпортуйте необхідні бібліотеки.”
  2. “Налаштуйте ініціалізацію бази даних.”
  3. “Створіть маршрут для додавання нового користувача за допомогою insert_user()."
  4. “Створіть маршрут для виведення всіх користувачів за допомогою get_all_users()."

Чому це працює

  • Робить процес генерування коду більш прозорим.
  • Як це покращує: Вказавши чітку послідовність дій, модель може більш надійно генерувати правильну послідовність функціональності.
    текст перекладу
    ## Техніки на основі міркувань

Запити на основі міркувань заохочують модель формулювати (або хоча б імітувати) свій процес міркування перед тим, як надати код.

4.1. Запит з ланцюгом міркувань

Огляд

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

Приклад запиту

“Поясніть, як додати аутентифікацію до Flask додатку, крок за кроком, а потім надайте фінальний фрагмент коду.”

Чому це працює

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

4.2. Запит без прикладів ланцюга міркувань

Огляд

  • Просите модель розмірковувати про проблему крок за кроком, не надаючи явних прикладів формату міркувань.

Приклад запиту

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

Як це покращує

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

4.3. Запит з кількома прикладами ланцюга міркувань

Огляд

  • Надаєте один або кілька коротких прикладів, які ілюструють, як міркувати про проблему. Потім просите модель повторити цей процес для нової проблеми.

Приклад запиту

  1. “Приклад: Щоб створити систему входу, ми ідентифікуємо таблицю користувачів, перевіряємо дані користувача і валідовуємо їх. Ось фрагмент коду. Давайте застосуємо цей підхід для реєстрації користувача.”
  2. “Використовуючи підхід покрокового міркування, показаний вище, додайте маршрут ‘/register’ і зберігайте нові дані користувача в базі даних безпечно.”

Чому це працює

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

5. Техніки на основі примінінгу

Запити на основі примінінгу використовують додатковий контекст (персонаж, посилання або шаблони), щоб впливати на стиль і знання, пов'язані з доменом, у згенерованому коді.

5.1. Запит на основі персони

Огляд

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

Приклад запиту

“Ви старший Python розробник бекенду, спеціалізуєтесь на безпеці. Створіть маршрут Flask для безпечної обробки реєстрації користувача.”

Чому це працює

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

5.2. Шаблон (скелетний) примінінг

Огляд

  • Ви надаєте шаблон або контур з місцями для заповнення, щоб модель заповнила їх.

Приклад запиту

“Заповніть місця в цьому шаблоні Flask додатку для реалізації форми входу користувача:

from flask import Flask, request, render_template
app = Flask(__name__)@app.route('/login', methods=['GET', 'POST'])  
def login():  
 if request.method == 'POST':  
 # Крок 1: ______  
 # Крок 2: ______  
 # Крок 3: повернути ______  
 return render_template('login.html')if __name__ == '__main__':  
 app.run(debug=True)  
```”

**Чому це працює**

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

**Огляд**

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

**Приклад запиту**

> _“На основі наступної документації SQLAlchemy [посилання або фрагмент], оновіть маршрути Flask додатку для використання моделей SQLAlchemy для збереження даних користувача замість прямого використання SQL запитів.”_

**Чому це працює**

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

## Висновок

Використовуючи ці 15 технік запитів, ви можете систематично розробляти, розширювати та оптимізувати Flask додаток — або будь-яку іншу кодову базу — за допомогою великих мовних моделей. Кожна нова техніка або **будує на** попередніх, або пропонує **нові підходи** для уточнення, декомпозиції, міркувань або примінінгу процесу генерації коду:

1. **Основні техніки** закладають основу, дозволяючи створювати початковий код з мінімальними труднощами.
2. **Техніки уточнення** полірують і розширюють згенерований код.
3. **Техніки декомпозиції** розбивають складні завдання на керовані частини.
4. **Техніки міркувань** заохочують модель надавати (або імітувати) покроковий процес міркувань, покращуючи чіткість та правильність.
5. **Техніки примінінгу** додають контекст, персонажа або посилання, що впливають на стиль і релевантність коду для конкретного домену.

З розвитком великих мовних моделей (LLM) розвиваються й стратегії запитів. Продовжуйте експериментувати з варіаціями цих методів, слідкуйте за новими найкращими практиками (наприклад, на [aixrv.org](http://aixrv.org) або подібних форумах) та адаптуйте запити до ваших конкретних потреб у домені та робочому процесі.

## Готові зробити ваш Flask додаток ще кращим?

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

**Удачі в роботі з запитами, і нехай ваші Flask додатки (та весь ваш код) процвітають!**



Перекладено з: [15 Prompting Techniques Every Developer Should Know for Code Generation](https://medium.com/@dnagasuresh1992/15-prompting-techniques-every-developer-should-know-for-code-generation-0ddadd2be8f2)

Leave a Reply

Your email address will not be published. Required fields are marked *