Інтелектуальний чат-бот для консультацій клієнтів українського інтернет-магазину вітамінів та біологічно активних добавок (БАДів), побудований на основі OpenAI GPT-4o-mini та векторного пошуку Pinecone.
✅ Відповіді виключно українською мовою - навіть на запити іншими мовами ✅ Векторний пошук товарів через Pinecone з метаданими ✅ Мінімум 3 товари у кожній відповіді ✅ Обов'язкове включення товарів Biotus або My Nutri Week ✅ Валідація релевантності запитів через GPT ✅ Історія розмови (до 6 останніх повідомлень) ✅ Фільтрація за доступністю (status=true, quantity>0) ✅ RESTful API з Express.js
- Node.js + TypeScript
- Express.js - веб-сервер
- Pinecone - векторна база даних (index: vitamins-catalog-v2, dimensions: 1536)
- OpenAI - GPT-4o-mini для діалогів, text-embedding-3-small для embeddings
vitamin-support-bot/
├── src/
│ ├── config/
│ │ ├── pinecone.ts # Підключення до Pinecone
│ │ └── openai.ts # Підключення до OpenAI
│ ├── types/
│ │ └── product.ts # TypeScript інтерфейси
│ ├── services/
│ │ ├── vectorSearch.ts # Пошук товарів у Pinecone
│ │ └── chatbot.ts # Логіка чат-бота
│ ├── utils/
│ │ ├── prompts.ts # Системні промпти українською
│ │ └── validation.ts # Валідація та утиліти
│ └── index.ts # Express сервер
├── package.json
├── tsconfig.json
├── .env.example
├── .gitignore
└── README.md
npm installСтворіть файл .env на основі .env.example:
cp .env.example .envЗаповніть змінні:
# Pinecone Configuration
PINECONE_API_KEY=your_pinecone_api_key_here
PINECONE_INDEX_NAME=vitamins-catalog-v2
# OpenAI Configuration
OPENAI_API_KEY=your_openai_api_key_here
# Server Configuration
PORT=3000
NODE_ENV=development
# Application Configuration
MAX_PRODUCTS_PER_RESPONSE=10
MIN_PRODUCTS_PER_RESPONSE=3
SIMILARITY_THRESHOLD=0.7
MAX_CONVERSATION_HISTORY=6npm run devnpm run build
npm startІнформація про API
Відповідь:
{
"message": "Вітаємо в API чат-бота підтримки магазину вітамінів! 🌟",
"version": "1.0.0",
"endpoints": { ... }
}Перевірка стану сервісу
Відповідь:
{
"status": "healthy",
"services": {
"pinecone": "ok",
"openai": "ok"
},
"environment": {
"nodeEnv": "development",
"port": 3000
},
"timestamp": "2025-01-15T10:30:00.000Z"
}Відправити повідомлення боту
Запит:
{
"message": "Які вітаміни для імунітету?",
"sessionId": "опціонально-uuid"
}Відповідь:
{
"success": true,
"data": {
"response": "Вітаю! Для підтримки імунітету рекомендую наступні товари...",
"sessionId": "550e8400-e29b-41d4-a716-446655440000",
"productsFound": 5,
"relevanceCheck": {
"isRelevant": true,
"reason": "Питання про вітаміни для імунітету"
}
},
"timestamp": "2025-01-15T10:30:00.000Z"
}Приклади запитів:
# Новий діалог (без sessionId)
curl -X POST http://localhost:3000/chat \
-H "Content-Type: application/json" \
-d '{
"message": "Привіт! Які вітаміни для енергії?"
}'
# Продовження діалогу (з sessionId)
curl -X POST http://localhost:3000/chat \
-H "Content-Type: application/json" \
-d '{
"message": "А що для дітей?",
"sessionId": "550e8400-e29b-41d4-a716-446655440000"
}'Видалити сесію розмови
Приклад:
curl -X DELETE http://localhost:3000/chat/550e8400-e29b-41d4-a716-446655440000Відповідь:
{
"success": true,
"message": "Сесію успішно видалено",
"sessionId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2025-01-15T10:30:00.000Z"
}Отримати статистику сесій (для адміністрування)
Відповідь:
{
"success": true,
"data": {
"totalSessions": 5,
"sessions": [
{
"sessionId": "550e8400-e29b-41d4-a716-446655440000",
"messageCount": 8,
"createdAt": "2025-01-15T10:00:00.000Z",
"lastUpdatedAt": "2025-01-15T10:30:00.000Z"
}
]
},
"timestamp": "2025-01-15T10:30:00.000Z"
}Кожен товар у Pinecone індексі має наступні метадані:
{
id: string; // Унікальний ID
product_id: string; // ID продукту
name: string; // Назва товару
brand: string; // Бренд
sku: string; // SKU код
price: number; // Ціна в грн
description: string; // Опис товару
categories: string; // Категорії
form: string; // Форма випуску (капсули, таблетки, порошок)
package: string; // Упаковка
flavor: string; // Смак
age: string; // Вікова категорія
active: boolean; // Чи активний товар
quantity: number; // Кількість на складі
status: boolean; // Статус доступності
}Перед обробкою запиту бот перевіряє, чи стосується питання вітамінів/БАДів:
- ✅ Релевантні теми: вітаміни, мінерали, БАДи, спортивне харчування, імунітет, схуднення
- ❌ Нерелевантні: ліки, діагнози, загальні розмови, інші товари
- Створення embedding запиту через OpenAI
text-embedding-3-small - Пошук у Pinecone з фільтрами:
status=true,quantity>0 - Мінімальний score схожості: 0.7
Бот завжди намагається включити товари брендів:
- Biotus
- My Nutri Week
Якщо знайдено менше 3 товарів, додаються популярні товари.
GPT-4o-mini генерує відповідь українською з урахуванням:
- Контексту розмови (6 останніх повідомлень)
- Знайдених товарів
- Системних інструкцій
Запит:
{
"message": "Привіт! Потрібні вітаміни для імунітету"
}Відповідь:
Вітаю! 👋
Я - ваш персональний консультант з вітамінів та біологічно активних добавок.
Для підтримки імунітету рекомендую наступні товари:
📋 Рекомендовані товари:
1. **Вітамін C 1000мг** від Biotus
- Ціна: 350 грн
- Форма: капсули
- Опис: Потужний антиоксидант для підтримки імунітету
2. **Цинк + Вітамін D3** від My Nutri Week
- Ціна: 280 грн
- Форма: таблетки
- Опис: Комплекс для зміцнення захисних функцій організму
3. **Імуно Комплекс** від Nature's Bounty
- Ціна: 420 грн
- Форма: капсули
- Опис: Збалансована формула вітамінів та мінералів
💡 Додаткові поради:
Приймайте вітаміни регулярно, бажано під час їжі. Рекомендую проконсультуватися з лікарем щодо дозування.
Запит:
{
"message": "Яка погода сьогодні?"
}Відповідь:
Вибачте, але я спеціалізуюсь виключно на консультаціях щодо вітамінів, мінералів та біологічно активних добавок (БАДів).
Я з радістю допоможу вам з:
- Підбором вітамінів для здоров'я
- Рекомендаціями БАДів для різних потреб
- Інформацією про наявні товари в магазині
- Порадами щодо застосування добавок
Чи можу я допомогти вам знайти потрібні вітаміни або добавки?
- Максимальна довжина повідомлення: 500 символів
- Історія зберігається тільки в пам'яті (втрачається при перезапуску)
- Старі сесії автоматично видаляються через 24 години
- Не надає медичних рекомендацій і не діагностує хвороби
- Відповідає тільки українською, незалежно від мови запиту
- Завжди включає мінімум 3 товари
- Пріоритет брендам Biotus та My Nutri Week
- Не вигадує інформацію - тільки з Pinecone
// TypeScript інтерфейси
src/types/product.ts
// Конфігурації
src/config/pinecone.ts
src/config/openai.ts
// Сервіси
src/services/vectorSearch.ts // Пошук товарів
src/services/chatbot.ts // Логіка бота
// Утиліти
src/utils/prompts.ts // Промпти українською
src/utils/validation.ts // Валідація
// Сервер
src/index.tsnpm run dev # Режим розробки з hot-reload
npm run build # Компіляція TypeScript
npm start # Запуск production версії
npm run lint # Перевірка кодуСтворіть Dockerfile:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]Збірка та запуск:
docker build -t vitamin-chatbot .
docker run -p 3000:3000 --env-file .env vitamin-chatbotNODE_ENV=production
PORT=3000
PINECONE_API_KEY=***
OPENAI_API_KEY=***
PINECONE_INDEX_NAME=vitamins-catalog-v2Переконайтесь, що .env файл створено і містить правильні ключі.
Перевірте назву індексу в Pinecone та .env файлі.
Перевірте:
- Чи є товари в Pinecone з
status=trueтаquantity>0 - Знизьте
SIMILARITY_THRESHOLDв.env
- Перевірте мережеве з'єднання з Pinecone та OpenAI
- Розгляньте можливість кешування популярних запитів
MIT
Створено для українського магазину вітамінів 🇺🇦