Як я створила помічника, що допомагає відповідати на бізнес-запити
Привіт, спільното. Мене звати Катя, я вже понад 13 років у фронтенді, зараз працюю в ELEKS. Більшу частину кар’єри писала UI, боролась із CSS, будувала архітектури й відстоювала ті самі «не можна так робити в продакшн». Але останні кілька років мене все більше затягує бекенд — цікаво ж розуміти, як усе працює під капотом: від баз даних до логіки обробки запитів.
З чоловіком ми час від часу запускаємо невеликі pet-проєкти — щось спробувати, десь поекспериментувати, а іноді просто перевірити: «а що, якщо...». Один із таких експериментів несподівано виріс у повноцінного AI-бізнес-бота.
Такий собі асистент, який може відповідати на запити про бізнес-дані звичайною мовою. Наприклад:
«Show the top 5 products by revenue» або «What was the revenue in 2017?» — і бот не тільки знайде відповідь, а ще й побудує графік.
Діалог із ботом:
Згенерований графік:
Все зібрали на LangGraph, Gemini API та SQLite — просто й сердито. Найскладніше, як виявилось, змусити все це працювати стабільно, без галюцинацій, і щоб відповіді були не тільки технічно правильні, а й зрозумілі для звичайного користувача.
Як з’явилась ідея
Я дуже люблю ходити на мітапи у своєму місті. Це зустрічі, де однодумці стають друзями та діляться новинами про нові технології, штучний інтелект, стартапи, цікаві проєкти та просто надихають одне одного ідеями. Під час однієї з таких зустрічей розказували, як швидко розвивається AI і які можливості відкриваються для бізнесу. Тому стало цікаво: а як ці технології працюють на практиці? Можна зробити щось корисне, але при цьому не надто складне в реалізації?
Долучайтесь до збору на Павуки Допхіна!
І тут зазвичай найголовніше питання: як зробити так, щоб бот не просто відповідав на запитання, а ще й пам’ятав хід розмови? З власного досвіду знаю, що найкраще розуміння приходить тоді, коли щось пишеш сам.
Тому захотілось створити чат-бота, що допоможе бізнес-користувачам отримувати важливу інформацію простими словами — без необхідності розуміти складні SQL-запити чи витрачати час на розбір дашбордів. Проєкт швидко почав набирати обертів і став місцем експериментів, щоб робити AI доступним і дійсно корисним. Так і з’явилася ідея чат-бота, який говорить із базою даних простою мовою.
Що це за бот
Business Insider Bot — це простий, але доволі потужний чатбот, який дозволяє «розмовляти» з бізнес-даними.
Основні можливості:
- розуміє природну мову (через Gemini API);
- автоматично будує SQL-запити (користувач цього навіть не бачить);
- «знає» структуру бази даних (сам сканує її);
- зберігає контекст розмови;
- вміє будувати графіки (Matplotlib, Seaborn);
- керується логікою через LangGraph (гнучкий граф діалогу).
По суті, це
З чого складається бот:
Щоб не винаходити велосипед, проєкт було зібрано з простих компонентів. Для швидкого прототипу я працювала у середовищі Kaggle Notebook, що дозволяло легко тестувати код та експериментувати.
Основні компоненти:
Компонент |
Для чого |
LangGraph |
керує потоком розмови |
Gemini API |
обробка природної мови та генерація SQL-запитів |
SQLite |
база з e-commerce даними |
Matplotlib / Seaborn |
для графіків |
Чому саме ці технології
Для розуміння людських запитів я використала Gemini API від Google. Gemini добре підходить для таких потреб, адже непогано розуміє природну мову та враховує контекст запитів. Звісно, можна також розглядали інші сервіси, як-от OpenAI GPT, але Gemini виявився більш зручним для інтеграції. Плюс, безкоштовна версія Gemini дозволила почати без зайвих витрат.
LangGraph взяла для того, щоб організувати логіку спілкування у вигляді графа. Кожен крок або дія — це окремий вузол, і так можна легко додавати нові функції або змінювати порядок дій, а також керувати тим, як бот підтримує розмову. Це зробило розробку гнучкою і зручною.
SQLite — це легка і проста у використанні база даних, в якій зберігаються дані від E-commerce dataset by Olist. Вона ідеально підходить для швидких запитів і роботи в локальному середовищі, адже не потребує складного налаштування і працює дуже швидко.
Як це все зібрати докупи
1. Побудова графа розмови
LangGraph — це такий собі фреймворк-режисер: він дозволяє задати логіку розмови у вигляді графа, де кожен вузол — це окремий крок у поведінці нашого агента. Дуже зручно: вся логіка структурована, а додати нову фічу — просто як вставити новий вузол у схему.
У нашому боті було використано кілька базових вузлів:
- db_scan — відповідає за знайомство з базою: бот одразу після запуску сканує таблиці та колонки, щоб знати, з чим має справу;
- chatbot — основний мозок системи: аналізує контекст, викликає Gemini для генерації відповіді і вирішує, що робити далі — дати відповідь, виконати SQL чи побудувати графік;
- user — очікує на введення повідомлення від користувача.
Ось фрагмент коду, що відповідає за чатбот:
def chatbot(state: AnalysisState) -> AnalysisState: if state["messages"]: sys_prompt = build_system_prompt(state["db_details"]) new_output = llm.invoke(sys_prompt + state["messages"]) else: new_output = AIMessage(content="BusinessInsider chatbot is here to help you!") return state | {"messages": [new_output]}
Цей код бере контекст розмови і генерує відповідь за допомогою LLM (моделі).
2. Пам’ять розмови
Щоб бот «пам’ятав», про що йшла мова, було створено спеціальний об’єкт AnalysisState, який зберігає:
- історію повідомлень (messages),
- опис бази даних (db_details),
- стан завершення розмови (finished).
class AnalysisState(TypedDict): messages: Annotated[list, add_messages] db_details: str finished: bool
Це дозволяє зберігати всю інформацію між кроками діалогу і відновлювати контекст.
3. Навчили модель розуміти структуру бази
Одним із ключових моментів було змусити бота «знати» схему бази даних. Для цього на початку роботи бот сканує базу, читає назви таблиць і колонок, і створює текстовий опис структури.
def get_db_schema_description(state: AnalysisState) -> AnalysisState: ... prompt = f"""Using next schema create a DB details to be used for llm understanding...""" response = llm.invoke(prompt) return state | {"db_details": response.content}
Завдяки цьому бот отримує «знання» про базу і може формувати адекватні SQL-запити.
4. Взаємодія з користувачем
Інтерфейс дуже простий — бот виводить відповідь, користувач вводить нове повідомлення.
def user_node(state: AnalysisState) -> AnalysisState: print("Model:", last_msg.content) user_input = input("User: ") ... return state | {"messages": [("user", user_input)]}
Це дозволяє вести діалог у чат-формі.
5. SQL + графіки
Було створено два інструменти, які бот може викликати:
execute_sql_query(query: str) -> list plot_query_result(query: str, chart_name: str, chart_type: str = "bar")
Це дає змогу не лише отримувати числа, а й візуалізувати їх.
6. Фінальна збірка графа
Після визначення всіх вузлів граф скомпілюється:
graph_builder = StateGraph(AnalysisState) graph_builder.add_edge(START, "db_scan") ... chat_graph = graph_builder.compile()
В результаті отримали повноцінного агента, здатного вести діалог і відповідати на бізнес-запити.
Приклад діалогу
Ось як виглядає діалог з ботом:
Model: BusinessInsider chatbot is here to help you! User: Provide top 3 cities by revenue Model: The top 3 cities by revenue are Sao Paulo with approximately 1,914,924, Rio de Janeiro with approximately 992,539, and Belo Horizonte with approximately 355,611. Do you want to get more insights? User: What time period is available for analysis Model: The time period available for analysis ranges from September 4, 2016, to October 17, 2018. Do you want to get more insights? User: Build barchart Model: Could you please specify which data you would like to visualize in the bar chart? For example, you could ask for a bar chart of the top product categories by sales, or sales over time. User: Build bar chart for monthly revenue for 2017 Model: Here is the bar chart for monthly revenue for 2017: Image(filename='/kaggle/working/charts/Monthly Revenue for 2017.png') Do you want to get more insights? User: exit
Користувач ставить просте запитання, а бот трансформує його у SQL і дає зрозумілу відповідь.
Що вийшло
Business Insider Bot успішно виконує запити до бази даних англійською мовою, генерує SQL під капотом і формує відповіді у звичному «людському» форматі.
Хоча SQLite суттєво спростила життя під час розробки і дозволила швидко запустити прототип, без мінусів не обійшлося. Це рішення добре працює з невеликими обсягами даних, але якщо система зросте або стане складнішою, SQLite може просто не впоратись — їй бракує масштабованості, паралельної обробки та інших «дорослих» функцій.
Ще одна річ: бот сильно залежить від доступу до бази. Якщо база з якоїсь причини недоступна (наприклад, у хмарному середовищі з обмеженнями), бот просто не запрацює як слід. Це обмежує гнучкість і варіанти розгортання.
І останнє. Хоча бот добре «працює» на демо-даних з e-commerce, з іншими наборами даних можуть виникати проблеми. Відповіді стають менш точними, особливо якщо структура або формат суттєво відрізняються.
Хочеш спробувати? Код доступний у Kaggle Notebook, його можна клонувати, адаптувати під свою базу або додати нові можливості.
Висновки
Цей проєкт показав, що
LLM — це не магія, а просто зручний інтерфейс для складних процесів. З правильним підходом можна створити інструмент, який допоможе бізнес-користувачам швидко отримувати потрібні дані та приймати рішення.
Корисні посилання:
- Повна реалізація Business Insider Bot — Kaggle Notebook
- Датасет для аналітики — E-commerce dataset by Olist (SQLite)
- Документація до
LLM-моделі від Google — Gemini API - Фреймворк для створення агентів як графів станів — LangGraph
6 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів