Files
DLE/scripts/test-ai-assistant.sh
2026-03-01 22:03:48 +03:00

374 lines
13 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Copyright (c) 2024-2026 Тарабанов Александр Викторович
# All rights reserved.
# This software is proprietary and confidential.
# For licensing inquiries: info@hb3-accelerator.com
echo "🤖 Полный тест AI ассистента"
echo "================================"
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функция для логирования
log() {
echo -e "${BLUE}[$(date +'%H:%M:%S')]${NC} $1"
}
success() {
echo -e "${GREEN}$1${NC}"
}
error() {
echo -e "${RED}$1${NC}"
}
warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
# Проверка зависимостей
check_dependencies() {
log "Проверка зависимостей..."
if ! command -v curl &> /dev/null; then
error "curl не установлен"
exit 1
fi
if ! command -v jq &> /dev/null; then
warning "jq не установлен - JSON ответы не будут форматированы"
fi
success "Зависимости проверены"
}
# Проверка Docker контейнеров
check_containers() {
log "Проверка Docker контейнеров..."
containers=("dapp-backend" "dapp-ollama" "dapp-postgres" "dapp-vector-search")
for container in "${containers[@]}"; do
if docker ps --format "table {{.Names}}" | grep -q "^${container}$"; then
status=$(docker inspect --format='{{.State.Status}}' "$container")
if [ "$status" = "running" ]; then
success "$container: запущен"
else
error "$container: статус $status"
fi
else
error "$container: не найден"
fi
done
}
# Проверка Ollama
test_ollama() {
log "Тестирование Ollama..."
# Проверка доступности API
if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
success "Ollama API доступен"
else
error "Ollama API недоступен"
return 1
fi
# Проверка моделей
models=$(curl -s http://localhost:11434/api/tags | jq -r '.models[].name' 2>/dev/null || echo "")
if echo "$models" | grep -q "qwen2.5:7b"; then
success "Модель qwen2.5:7b загружена"
else
error "Модель qwen2.5:7b не найдена"
fi
if echo "$models" | grep -q "mxbai-embed-large:latest"; then
success "Модель mxbai-embed-large:latest загружена"
else
error "Модель mxbai-embed-large:latest не найдена"
fi
# Тест генерации
log "Тест генерации текста..."
response=$(curl -s -X POST http://localhost:11434/api/generate \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2.5:7b",
"prompt": "Привет! Как дела?",
"stream": false
}')
if echo "$response" | jq -e '.response' > /dev/null 2>&1; then
success "Генерация текста работает"
echo "Ответ: $(echo "$response" | jq -r '.response' | head -c 100)..."
else
error "Генерация текста не работает"
echo "Ответ: $response"
fi
}
# Проверка Backend API
test_backend_api() {
log "Тестирование Backend API..."
# Проверка здоровья
if curl -s http://localhost:8000/api/health > /dev/null 2>&1; then
success "Backend API доступен"
else
error "Backend API недоступен"
return 1
fi
# Проверка AI health
ai_health=$(curl -s http://localhost:8000/api/ai/health 2>/dev/null || echo "")
if [ -n "$ai_health" ]; then
success "AI health endpoint работает"
else
warning "AI health endpoint недоступен"
fi
}
# Тест RAG системы
test_rag_system() {
log "Тестирование RAG системы..."
# Создание тестовой таблицы
log "Создание тестовой таблицы..."
table_response=$(curl -s -X POST http://localhost:8000/api/tables \
-H "Content-Type: application/json" \
-d '{
"name": "test_ai_table",
"description": "Тестовая таблица для AI"
}')
table_id=$(echo "$table_response" | jq -r '.id' 2>/dev/null || echo "")
if [ -n "$table_id" ] && [ "$table_id" != "null" ]; then
success "Таблица создана (ID: $table_id)"
# Добавление колонок
log "Добавление колонок..."
curl -s -X POST "http://localhost:8000/api/tables/$table_id/columns" \
-H "Content-Type: application/json" \
-d '{
"name": "question",
"type": "text",
"placeholder": "vopros"
}' > /dev/null
curl -s -X POST "http://localhost:8000/api/tables/$table_id/columns" \
-H "Content-Type: application/json" \
-d '{
"name": "answer",
"type": "text",
"placeholder": "otvet"
}' > /dev/null
# Добавление данных
log "Добавление тестовых данных..."
curl -s -X POST "http://localhost:8000/api/tables/$table_id/rows" \
-H "Content-Type: application/json" \
-d '{
"data": {
"question": "Как работает AI ассистент?",
"answer": "AI ассистент использует машинное обучение для понимания и ответа на вопросы пользователей."
}
}' > /dev/null
curl -s -X POST "http://localhost:8000/api/tables/$table_id/rows" \
-H "Content-Type: application/json" \
-d '{
"data": {
"question": "Что такое RAG?",
"answer": "RAG (Retrieval-Augmented Generation) - это метод, который объединяет поиск информации с генерацией ответов."
}
}' > /dev/null
success "Тестовые данные добавлены"
# Тест RAG запроса
log "Тест RAG запроса..."
rag_response=$(curl -s -X POST "http://localhost:8000/api/rag/answer" \
-H "Content-Type: application/json" \
-d '{
"tableId": '$table_id',
"question": "Как работает AI ассистент?",
"threshold": 5
}')
if echo "$rag_response" | jq -e '.answer' > /dev/null 2>&1; then
success "RAG система работает"
echo "RAG ответ: $(echo "$rag_response" | jq -r '.answer' | head -c 100)..."
else
error "RAG система не работает"
echo "RAG ответ: $rag_response"
fi
# Очистка тестовой таблицы
log "Очистка тестовой таблицы..."
curl -s -X DELETE "http://localhost:8000/api/tables/$table_id" > /dev/null
success "Тестовая таблица удалена"
else
error "Не удалось создать тестовую таблицу"
echo "Ответ: $table_response"
fi
}
# Тест AI ассистента
test_ai_assistant() {
log "Тестирование AI ассистента..."
# Простой тест
log "Простой тест AI..."
simple_response=$(curl -s -X POST http://localhost:8000/api/chat/guest-message \
-H "Content-Type: application/json" \
-d '{
"message": "Привет! Как дела?",
"guestId": "test-guest-123"
}')
if echo "$simple_response" | jq -e '.aiMessage' > /dev/null 2>&1; then
success "AI ассистент отвечает"
echo "Ответ: $(echo "$simple_response" | jq -r '.aiMessage.content' | head -c 100)..."
else
error "AI ассистент не отвечает"
echo "Ответ: $simple_response"
fi
# Тест с контекстом
log "Тест с контекстом..."
context_response=$(curl -s -X POST http://localhost:8000/api/chat/guest-message \
-H "Content-Type: application/json" \
-d '{
"message": "Как меня зовут?",
"guestId": "test-guest-123"
}')
if echo "$context_response" | jq -e '.aiMessage' > /dev/null 2>&1; then
success "AI ассистент помнит контекст"
echo "Ответ: $(echo "$context_response" | jq -r '.aiMessage.content' | head -c 100)..."
else
error "AI ассистент не помнит контекст"
echo "Ответ: $context_response"
fi
}
# Тест плейсхолдеров
test_placeholders() {
log "Тестирование плейсхолдеров..."
# Создание таблицы с плейсхолдерами
log "Создание таблицы с плейсхолдерами..."
table_response=$(curl -s -X POST http://localhost:8000/api/tables \
-H "Content-Type: application/json" \
-d '{
"name": "test_placeholders",
"description": "Тест плейсхолдеров"
}')
table_id=$(echo "$table_response" | jq -r '.id' 2>/dev/null || echo "")
if [ -n "$table_id" ] && [ "$table_id" != "null" ]; then
success "Таблица создана (ID: $table_id)"
# Добавление колонки с плейсхолдером
curl -s -X POST "http://localhost:8000/api/tables/$table_id/columns" \
-H "Content-Type: application/json" \
-d '{
"name": "company_name",
"type": "text",
"placeholder": "company"
}' > /dev/null
# Добавление данных
curl -s -X POST "http://localhost:8000/api/tables/$table_id/rows" \
-H "Content-Type: application/json" \
-d '{
"data": {
"company_name": "HB3 Accelerator"
}
}' > /dev/null
success "Плейсхолдеры настроены"
# Очистка
curl -s -X DELETE "http://localhost:8000/api/tables/$table_id" > /dev/null
else
error "Не удалось создать таблицу для плейсхолдеров"
fi
}
# Проверка производительности
test_performance() {
log "Тестирование производительности..."
start_time=$(date +%s)
# Тест скорости ответа
response_time=$(curl -s -w "%{time_total}" -o /dev/null \
-X POST http://localhost:8000/api/chat/guest-message \
-H "Content-Type: application/json" \
-d '{
"message": "Быстрый тест",
"guestId": "test-guest-123"
}')
end_time=$(date +%s)
duration=$((end_time - start_time))
if (( $(echo "$response_time < 10" | bc -l) )); then
success "Время ответа: ${response_time}s (нормально)"
else
warning "Время ответа: ${response_time}s (медленно)"
fi
# Проверка памяти
ollama_memory=$(docker stats dapp-ollama --no-stream --format "table {{.MemUsage}}" | tail -1)
log "Использование памяти Ollama: $ollama_memory"
}
# Главная функция
main() {
echo "🚀 Начинаем полный тест AI ассистента"
echo "========================================"
check_dependencies
echo
check_containers
echo
test_ollama
echo
test_backend_api
echo
test_rag_system
echo
test_ai_assistant
echo
test_placeholders
echo
test_performance
echo
echo "🎯 Тестирование завершено!"
echo "================================"
# Итоговая статистика
log "Статус контейнеров:"
docker-compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"
}
# Запуск
main "$@"