Як я створила помічника, що допомагає відповідати на бізнес-запити

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Привіт, спільното. Мене звати Катя, я вже понад 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 (гнучкий граф діалогу).

По суті, це LLM-агент, який поводиться як аналітик і відповідає на запити бізнес-користувачів у звичному чат-інтерфейсі.

З чого складається бот:

Щоб не винаходити велосипед, проєкт було зібрано з простих компонентів. Для швидкого прототипу я працювала у середовищі 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-агенти вже сьогодні можуть бути ефективними помічниками для бізнес-аналітики — навіть у простому CLI-форматі. Навіть базова інтеграція LangGraph + Gemini + SQL дозволяє отримати відповіді на запити типу «Який дохід за 2017?» або «Топ-10 продуктів минулого кварталу?» — без жодного рядка SQL з боку користувача.

LLM — це не магія, а просто зручний інтерфейс для складних процесів. З правильним підходом можна створити інструмент, який допоможе бізнес-користувачам швидко отримувати потрібні дані та приймати рішення.

Корисні посилання:

👍ПодобаєтьсяСподобалось21
До обраногоВ обраному9
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дякую, рада що сподобалась ❤️

дякую, що ділишся! щей простими словами!

Дякую! Приємно це чути!

Файна стаття і авторка ;)

Дякую, цікава стаття

А наскільки грамотно воно схему «розуміє»? Думаю маленькі проблем не створюють, але я про речі типу залежностей, назв сутностей з назв колонок ітд? Що робити як потрібно чатбога натаскати на конкретний специфічний запит?

Ну отут не згоден правда

базова інтеграція LangGraph + Gemini + SQL дозволяє отримати відповіді на запити типу «Який дохід за 2017?» або «Топ-10 продуктів минулого кварталу?» — без жодного рядка SQL з боку користувача.

може для якогось некритичного графіка чи відповіді таке ок, але sql детермінований і схема бази не просто так існує, а BI існує для якісного прийняття рішень

тоді як «LangGraph + Gemini + SQL» вже недетерміновано, тут забагато частин де щось може змінитися, сьогодні скаже одне, завтра зміниться схема, післязавтра gemini вирішить що в нього поганий настрій і раптом згенерує вам зовсім інший запит, або не дай бог взагалі якийсь дроп тейбл.

Без валідації на кожному кроці немає довіри ні до fuzzy-запиту ні до даних результату ні до графіка на основі цих даних

Мені здається основний бонус дженай в тому що він розбирає запити на людській мові й видає відповідь так само людською мовою, але в питаннях от типу «ревеню за 2017» потрібен точний запит і точна відповідь. Бо неправильна відповідь яка виглядає як правильна призведе до потенційно хибного управлінського рішення. А хайп якраз росте з того що люди чекають від ШІ чудесного джина, якому досить потерти лампу загадати бажання і він зробить все правильно, швидко й без знання SQL :)

Дякую! Дуже класний і змістовний коментар
Абсолютно згодна — поки це експеримент, але вже бачимо потенціал. Думаю, з часом AI навчиться поводитися обережніше з даними і не «фантазувати»

Підписатись на коментарі