ваше сообщение коммита
This commit is contained in:
170
scripts/manage-models.sh
Executable file
170
scripts/manage-models.sh
Executable file
@@ -0,0 +1,170 @@
|
||||
#!/bin/bash
|
||||
# Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||||
# All rights reserved.
|
||||
# This software is proprietary and confidential.
|
||||
# For licensing inquiries: info@hb3-accelerator.com
|
||||
|
||||
# Цвета для вывода
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Функции
|
||||
log() {
|
||||
echo -e "${BLUE}[$(date +'%H:%M:%S')]${NC} $1"
|
||||
}
|
||||
|
||||
success() {
|
||||
echo -e "${GREEN}✅ $1${NC}"
|
||||
}
|
||||
|
||||
warning() {
|
||||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||
}
|
||||
|
||||
# Проверка статуса моделей
|
||||
check_models_status() {
|
||||
log "Проверка статуса моделей..."
|
||||
|
||||
# Проверяем какие модели загружены в память
|
||||
loaded_models=$(docker exec dapp-ollama ollama ps 2>/dev/null | grep -v "NAME" | wc -l)
|
||||
|
||||
if [ "$loaded_models" -gt 0 ]; then
|
||||
success "Модели в памяти: $loaded_models активных"
|
||||
docker exec dapp-ollama ollama ps
|
||||
else
|
||||
warning "Модели не загружены в память"
|
||||
fi
|
||||
|
||||
# Проверяем доступные модели
|
||||
available_models=$(docker exec dapp-ollama ollama list 2>/dev/null | grep -v "NAME" | wc -l)
|
||||
success "Доступных моделей: $available_models"
|
||||
}
|
||||
|
||||
# Предзагрузка моделей
|
||||
preload_models() {
|
||||
log "Предзагрузка моделей в память..."
|
||||
|
||||
# Проверяем что Ollama готов
|
||||
until curl -s http://localhost:11434/api/tags > /dev/null 2>&1; do
|
||||
log "Ожидание запуска Ollama..."
|
||||
sleep 2
|
||||
done
|
||||
|
||||
success "Ollama готов!"
|
||||
|
||||
# Загружаем основные модели
|
||||
log "Загрузка qwen2.5:7b..."
|
||||
docker exec dapp-ollama ollama run qwen2.5:7b "Инициализация" > /dev/null 2>&1 &
|
||||
|
||||
log "Загрузка mxbai-embed-large:latest..."
|
||||
docker exec dapp-ollama ollama run mxbai-embed-large:latest "Инициализация" > /dev/null 2>&1 &
|
||||
|
||||
# Ждем загрузки
|
||||
sleep 10
|
||||
|
||||
success "Модели загружены!"
|
||||
check_models_status
|
||||
}
|
||||
|
||||
# Поддержание моделей в памяти
|
||||
keep_alive() {
|
||||
log "Запуск поддержания моделей в памяти..."
|
||||
|
||||
while true; do
|
||||
# Проверяем статус каждые 5 минут
|
||||
loaded_models=$(docker exec dapp-ollama ollama ps 2>/dev/null | grep -v "NAME" | wc -l)
|
||||
|
||||
if [ "$loaded_models" -eq 0 ]; then
|
||||
log "Модели выгружены, перезагружаем..."
|
||||
preload_models
|
||||
else
|
||||
log "Модели в памяти: $loaded_models активных"
|
||||
fi
|
||||
|
||||
sleep 300 # 5 минут
|
||||
done
|
||||
}
|
||||
|
||||
# Очистка моделей из памяти
|
||||
clear_memory() {
|
||||
log "Очистка моделей из памяти..."
|
||||
|
||||
# Останавливаем все модели
|
||||
docker exec dapp-ollama ollama ps | grep -v "NAME" | awk '{print $1}' | xargs -I {} docker exec dapp-ollama ollama stop {} 2>/dev/null || true
|
||||
|
||||
success "Память очищена"
|
||||
check_models_status
|
||||
}
|
||||
|
||||
# Главное меню
|
||||
show_help() {
|
||||
echo "🤖 Управление моделями Ollama"
|
||||
echo "================================"
|
||||
echo "Использование: $0 [команда]"
|
||||
echo ""
|
||||
echo "Команды:"
|
||||
echo " status - Показать статус моделей"
|
||||
echo " preload - Предзагрузить модели в память"
|
||||
echo " keep - Поддерживать модели в памяти"
|
||||
echo " clear - Очистить память"
|
||||
echo " test - Протестировать скорость ответа"
|
||||
echo " help - Показать эту справку"
|
||||
echo ""
|
||||
echo "Примеры:"
|
||||
echo " $0 status # Проверить статус"
|
||||
echo " $0 preload # Загрузить модели"
|
||||
echo " $0 keep # Держать в памяти"
|
||||
}
|
||||
|
||||
# Тест производительности
|
||||
test_performance() {
|
||||
log "Тест производительности..."
|
||||
|
||||
# Тест с холодным стартом
|
||||
log "Тест холодного старта..."
|
||||
start_time=$(date +%s.%N)
|
||||
docker exec dapp-ollama ollama run qwen2.5:7b "Тест" > /dev/null 2>&1
|
||||
end_time=$(date +%s.%N)
|
||||
cold_time=$(echo "$end_time - $start_time" | bc)
|
||||
|
||||
# Тест с горячим стартом
|
||||
log "Тест горячего старта..."
|
||||
start_time=$(date +%s.%N)
|
||||
docker exec dapp-ollama ollama run qwen2.5:7b "Тест" > /dev/null 2>&1
|
||||
end_time=$(date +%s.%N)
|
||||
hot_time=$(echo "$end_time - $start_time" | bc)
|
||||
|
||||
echo "📊 Результаты теста:"
|
||||
echo " Холодный старт: ${cold_time}s"
|
||||
echo " Горячий старт: ${hot_time}s"
|
||||
|
||||
if (( $(echo "$hot_time < $cold_time" | bc -l) )); then
|
||||
success "Модели работают быстрее из памяти!"
|
||||
else
|
||||
warning "Модели не остаются в памяти"
|
||||
fi
|
||||
}
|
||||
|
||||
# Обработка аргументов
|
||||
case "${1:-help}" in
|
||||
"status")
|
||||
check_models_status
|
||||
;;
|
||||
"preload")
|
||||
preload_models
|
||||
;;
|
||||
"keep")
|
||||
keep_alive
|
||||
;;
|
||||
"clear")
|
||||
clear_memory
|
||||
;;
|
||||
"test")
|
||||
test_performance
|
||||
;;
|
||||
"help"|*)
|
||||
show_help
|
||||
;;
|
||||
esac
|
||||
373
scripts/test-ai-assistant.sh
Executable file
373
scripts/test-ai-assistant.sh
Executable file
@@ -0,0 +1,373 @@
|
||||
#!/bin/bash
|
||||
# Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||||
# 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 "$@"
|
||||
Reference in New Issue
Block a user