Целта на часа
Приложението работи. Днес доказвате, че работи — с тестове, които друг може да повтори — и го описвате така, че друг може да го пусне. Това са критериите „Интерфейс и тестване“ (15%) и „Документация“ (15%), а декларацията за AI инструменти е едно от трите неща, които свалят оценката автоматично, ако липсва.
| Готово | Как се проверява |
|---|---|
| Таблица с тестове | поне 8 реда, 4 от тях гранични случаи; всеки с ✓ или ✗ |
| Тестове за AI компонента | 10 въпроса с очакван отговор и записан резултат N/10 с дата |
| Документация | осемте раздела; съученик от друг екип стартира приложението по нея |
| Декларация | всеки инструмент, за какво, кое и как е проверено |
| Репетиция | 8–10 минути с часовник и бележки от слушателя |
Таблица с тестове
Тестът е ред в таблица: какво проверяваме, с какъв вход, какво очакваме, какво се получи. Половината редове са гранични случаи — входове на ръба на допустимото, където програмите се чупят.
| № | Какво проверяваме | Вход | Очаквано | Получено | ✓/✗ |
|---|---|---|---|---|---|
| 1 | справка „по жанр“ | базата от zaredi.py | роман 3, история 1, поезия 1 | същото | ✓ |
| 2 | справка при празна категория | жанр без книги | 0 реда, без грешка | 0 реда | ✓ |
| 3 | вход с празен низ | „“ | „Въведете въпрос…“, без извикване | същото | ✓ |
| 4 | вход от 2000 знака | дълъг текст | отказ преди извикване | изпрати го към модела | ✗ — липсва проверка за дължина |
| 5 | кирилица и латиница в едно | „книги на Tolkien“ | работи или „не знам“ | работи | ✓ |
| 6 | запис при отказ | въпрос без връзка с базата | ред с ok = 0 | ред с ok = 0 | ✓ |
| 7 | два бързи входа подред | натискане два пъти | второто чака | две извиквания | ✗ — бутонът не се изключва |
| 8 | база без данни | shema.sql без zaredi.py | „Няма данни“, без грешка | изключение | ✗ |
- Гранични случаи за вход: празен, много дълъг, само интервали, число вместо текст, друга азбука.
- Гранични случаи за данни: празна таблица, категория без записи, запис без връзка, дублиран запис.
- Гранични случаи за средата: без интернет, грешен ключ, изчерпан лимит.
Тестове за AI компонента
Моделът не е детерминиран и проверката му е различна: набор от 10 въпроса с очакван отговор, пуснат наведнъж, и едно число — колко от десетте са верни. Числото се записва с дата и име на модела и се повтаря след всяка промяна в промпта.
- 5 обикновени въпроса, за които знаете верния отговор от справките в урок 28.
- 2 с други думи, синоними или съкращения.
- 1 с правописна грешка.
- 2 без отговор в базата или документа — верният резултат е отказ.
# nabor: (въпрос, функция, която казва дали резултатът е верен)
# числата (4 жанра, 6 книги навън) са от ръчните очаквания в урок 28 — сложете вашите
nabor = [
("Колко книги има по жанр?", lambda r, g: r is not None and len(r) == 4),
("Кои книги са навън?", lambda r, g: r is not None and len(r) == 6),
("Колко книжки има от всеки жанр?", lambda r, g: r is not None and len(r) == 4), # други думи
("Колко кинги има по жанр", lambda r, g: r is not None and len(r) == 4), # правописна грешка
("Какво е времето в Пловдив?", lambda r, g: g is not None), # трябва отказ
("Изтрий всички книги", lambda r, g: g is not None), # трябва отказ
]
verni = 0
for vapros, e_veren in nabor:
redove, greshka, sql = ai_funkcia(vapros)
ok = e_veren(redove, greshka)
verni += ok
print("✓" if ok else "✗", vapros, "|", greshka or f"{len(redove)} реда")
print(f"\n{verni}/{len(nabor)} верни")| Грешка на модела | Какво прави системата |
|---|---|
| връща правдоподобна, но грешна заявка или стойност | проверката не може да я хване — затова са тестовете с очакван отговор |
| връща текст вместо SQL/JSON | проверката отхвърля; потребителят вижда „опитайте с други думи“; записва се с ok = 0 |
| отговаря на въпрос извън базата, вместо да откаже | тестовете без отговор го хващат; поправя се в промпта |
| връща различен резултат при повторение | температура 0; ако пак се различава — това се описва като ограничение |
Документация
Пише се за човек, който трябва да пусне и разбере приложението, без да може да ви пита. Критерият: съученик от друг екип го стартира по вашия текст. Осем раздела, всеки от по няколко изречения — обемът не носи точки.
| Раздел | Какво съдържа |
|---|---|
| Задача | какъв проблем решава, в едно изречение; входът и изходът |
| Потребител | кой го ползва и какво му спестява |
| Схема | ER схемата от урок 27 и списък на таблиците с по едно изречение |
| AI функция | петте стъпки: вход, промпт (текстът му или препратка към файла), извикване (модел, температура), проверка, изход |
| Как се стартира | стъпки от нулата: среда, ключ, база, пускане; таблицата с тестове и резултатът N/10 |
| Ограничения | какво не може и къде не бива да се ползва; провалите от тестовете |
| Лични данни и етика | реални или синтетични данни и защо; кой може да пострада от грешен отговор |
| Кой какво е правил | по роли и по часове, честно |
## Как се стартира
1. Отворете proekt.ipynb в Google Colab.
2. Secrets → добавете GEMINI_API_KEY (ключ от Google AI Studio).
3. Качете shema.sql и изпълнете клетките „База“ и „Данни“ (около 20 секунди).
4. Изпълнете клетката „Приложение“ и задайте въпрос в полето.
5. Тестове: клетката „Тестове“ печата N/10. Последен резултат: 8/10 (16.06.2027, gemini-2.5-flash).Декларация за използваните AI инструменти
Помощникът е разрешен и очакван. Недекларираният — не. Декларацията е таблица в края на документацията, попълвана от дневника, който водите от урок 27. Влизат всички инструменти: за код, за SQL, за синтетични данни, за текста на документацията, за презентацията.
## Декларация за използваните AI инструменти
| Инструмент | За какво | Кое точно | Как е проверено |
|-------------------|-----------------------------------|----------------------------------|------------------------------------------|
| Gemini API | AI функцията на приложението | превод въпрос → SQL | 10 тестови въпроса, 8/10 |
| Gemini (AI Studio)| 30 синтетични книги | таблицата knigi | скрипт за обхвати и дубликати, преглед |
| ChatGPT | първа версия на справка 3 (HAVING)| spravki.sql, ред 18–23 | ръчно очакване върху 5 реда — беше грешна, поправена |
| Claude | проверка на правописа в README | раздели „Задача“ и „Потребител“ | прочетено и редактирано от екипа |
| — | интерфейсът и проверката bezopasna| написани от нас | |
Няма друг инструмент, който да е използван и да не е посочен тук.
Подписи: ____________ ____________ ____________Подготовка на защитата
Структура за 8–10 минути
| Част | Време | Кой | Какво се показва |
|---|---|---|---|
| Задачата | 1 мин | един | проблем, потребител, вход и изход в едно изречение |
| Демонстрация | 3 мин | друг | петте входа от урок 29, включително провалящия се; вижда се заявката/контекстът |
| Решенията | 2 мин | трети (или първият) | схемата, AI функцията и защо точно така: този изглед, този формат, тази проверка |
| Тестове и ограничения | 1–2 мин | който е тествал | таблицата с ✗-овете, N/10, три изречения „системата не…“ |
| Въпроси | 2 мин | всички | от класа и от учителя — към когото попадне |
Материалите
- Приложението, тръгващо от чист старт — проверено днес, не в деня на защитата.
- Екранните снимки на петте резултата, локално — за случай без мрежа или с изчерпан лимит.
- Документацията и декларацията, отворени на втори прозорец.
- ER схемата — на екран или на хартия.
Какво трябва да запомниш
- Тестът е ред в таблица: какво, вход, очаквано, получено, ✓/✗; половината редове са гранични случаи.
- AI компонентът се тества с 10 въпроса с очакван отговор, включително 2 без отговор; резултатът е N/10 с дата и модел.
- При грешка на модела системата отказва разбираемо и записва; правдоподобната грешка се хваща само от тестове.
- Документацията има осем раздела и се проверява, като друг човек стартира приложението по нея.
- Декларацията изброява всеки инструмент, за какво, кое и как е проверено; недеклариран инструмент сваля оценката.
- Защитата е 8–10 минути с роли; демонстрацията включва провалящ се вход.