---
title: "AI-агент з пошуком у каталозі"
description: "Optional: lookup у Custom Data у тому ж training bot без окремого Copilot."
level: optional
track: ai-catalog-search
prerequisites:
  - ../basic/use-case-01-faq-ai.md
  - ../basic/use-case-07-custom-data.md
  - ../advanced/use-case-10-tickets-categorizer.md
---

# AI-агент з пошуком у каталозі

> **Optional track** — на відміну від [Use Case 12: Copilot](/uk/learn/implementer/training/optional/use-case-12-copilot-cd-lookup.md), categorizer і lookup живуть у **тому ж** training bot. Не потрібен окремий Copilot-bot.

## Необхідні права та доступ

| Модуль / налаштування | Навіщо |
|------------------------|--------|
| **Scenario Builder** | FAQ + categorizer + CD lookup в одному bot |
| **Fast Line Pro** | Categorizer або intent для каталогу |
| **Custom Data** | Модель `products` + seed |
| **Settings → Operator Panel** | Handoff на оператора (опційно) |
| **Runs / Chat preview** | 5 контрольних запитів |

## Бізнес-контекст

Клієнт запитує товар або персонажа з навчального каталогу. Бот відповідає з Custom Data і за потреби передає діалог оператору. Типовий патерн для e-commerce / довідникових bot без архітектури Copilot.

## Очікуваний результат

- Модель `products` + seed [products-training.csv](/content/uk/learn/implementer/training/scenarios/seed/products-training.csv)
- Categorizer або filter у CD після `action_fastline_pro`
- Handoff edge при «не знайдено» або за запитом клієнта
- **Не** окремий Copilot-bot — усе в training bot

## Архітектура

```text
MessageKeyboard «Каталог» → WaitForInput (запит)
   → action_fastline_pro (categorizer / intent)
   → Router (valid filters)
   → custom_modules__get / search
      ├─ found     → MessageKeyboard (результат)
      ├─ not_found → уточнення або handoff
      └─ error     → повідомлення + fallback

Опційно: «Оператор» → connect (Use Case 3)
```

## Покрокова реалізація

### Крок 0. Custom Data — products

1. Створіть модель **products** (alias `products`).
2. Поля: `name`, `category`, `faction`, `price`.
3. Імпортуйте [products-training.csv](/content/uk/learn/implementer/training/scenarios/seed/products-training.csv).

→ [Custom Data set](/uk/customdata/how-to/use-custom-modules-set.md)

---

### Крок 1. Fast Line Pro — categorizer каталогу

| Параметр | Значення |
|----------|----------|
| Тип | **Chat-bot** |
| Prompt | Секція каталогу в [categorizer-training.txt](/content/uk/learn/implementer/training/scenarios/prompts/categorizer-training.txt) |
| Тест | «spellcaster from north» → JSON filters |

---

### Крок 2. Вхід і categorizer у сценарії

| Нода | Параметри |
|------|-----------|
| MessageKeyboard | «Що шукаєте в каталозі?» → WaitForInput |
| WaitForInput | outputVariable: `catalog_query` |
| action_fastline_pro | `user_input`: `{{catalog_query}}`, `save_response`: `catalog_filters` |

**Edges:** основний → lookup; **fallback** → «Переформулюйте запит».

---

### Крок 3. Lookup у Custom Data

| node_params (приклад) | Значення |
|-----------------------|----------|
| `module_name` | `products` |
| filter by | `category`, `faction` з categorizer |

**Edges:**

| Edge | Повідомлення (приклад) |
|------|------------------------|
| found | «{{name}} — {{price}} золота» |
| not_found | «Не знайшов у каталозі. Спробуйте інакше або натисніть «Оператор».» |
| **error** | «Помилка пошуку.» |

---

### Крок 4. Handoff на оператора

При not_found або кнопці «Оператор»:

```text
MessageKeyboard → operator_panel__connect_to_operator_with_msg
   (subject_alias з Use Case 3)
```

**Edges:** success / **limit** / **error** — обов'язково.

→ [Use Case 3](/uk/learn/implementer/training/basic/use-case-03-handoff-to-operator.md)

---

### Крок 5. П'ять контрольних запитів (self-check)

| # | Запит | Очікування |
|---|-------|------------|
| 1 | «Geralt» | found — warrior, north |
| 2 | «dragon from Mars» | not_found |
| 3 | «something cheap» | found або уточнення (не тиша) |
| 4 | «Оператор» / handoff | connect edges |
| 5 | Невідомий intent | fallback categorizer |

Кожен прогін — окремий Run або скидання state; фіксуйте edge у Runs.

## Troubleshooting

| Симптом | Що перевірити |
|---------|----------------|
| Завжди not_found | Filters vs seed CSV; регістр category/faction |
| AI «вигадує» товар | Lookup має йти з CD, не лише з LLM text |
| Повторні уточнення без кінця | Ліміт retry → handoff |
| Handoff без limit edge | [Edge-driven flow](/uk/learn/implementer/training/concepts.md#edge-driven-flow) |

## Self-check

- [ ] 5 контрольних запитів пройдено; результати в result template
- [ ] Found / not found / handoff / fallback — усі з повідомленням клієнту
- [ ] `module_name` = alias CD
- [ ] Розумієте відмінність від [Use Case 12](/uk/learn/implementer/training/optional/use-case-12-copilot-cd-lookup.md) (Copilot vs inline)

## Самостійне завдання

Додайте MessageKeyboard після found: «Ще пошук» → loop на WaitForInput; «В меню» → головне меню capstone.

## Довідкові посилання

- [Products seed CSV](/content/uk/learn/implementer/training/scenarios/seed/products-training.csv)
- [Categorizer prompt](/content/uk/learn/implementer/training/scenarios/prompts/categorizer-training.txt)
- [Categorizer pattern](/uk/learn/implementer/training/concepts.md#categorizer-pattern)
- [Custom Data set](/uk/customdata/how-to/use-custom-modules-set.md)
- [Fast Line Pro action](/uk/fastlinepro/how-to/use-action-fastline-pro.md)
