layout-viewer / scripts /test_llm.py
Spyspook's picture
initial commit
ce82348 verified
# scripts/test_llm.py
"""
Скрипт для тестирования работы LLM-клиента.
Обращается к локальному серверу vLLM и проверяет генерацию JSON для раскладки.
Обновлен для работы с новым API generate_layout (добавлены габариты и каталог оборудования).
"""
import logging
import os
import sys
from typing import Any, Dict, List, Optional
import hydra
from omegaconf import DictConfig
# Добавляем корень проекта в PYTHONPATH, чтобы импорты из src работали корректно
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.llm.client import InventoryLLMClient
# Настройка подробного логирования
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
datefmt="%H:%M:%S"
)
logger: logging.Logger = logging.getLogger(__name__)
@hydra.main(version_base=None, config_path="../configs", config_name="main_config")
def main(cfg: DictConfig) -> None:
"""
Основная функция для выполнения тестового запроса к запущенному серверу vLLM.
Args:
cfg (DictConfig): Конфигурация проекта, загруженная через Hydra.
"""
logger.info("🚀 Запуск тестирования LLM-клиента...")
# Инициализируем клиент (он сам достанет url и модель из cfg.llm)
client: InventoryLLMClient = InventoryLLMClient(cfg)
# Задаем тестовый набор категорий
test_categories: List[str] = ["BEER", "CHIPS", "ENERGY_DRINKS", "WATER", "WINE"]
logger.info(f"🛒 Доступные категории для теста: {test_categories}")
# Подготавливаем тестовые данные для габаритов и оборудования
test_size_n: float = 6.0
test_size_m: float = 6.0
test_equipment: str = (
"- showcase_glb (Холодильник): 1.55m x 0.9m\n"
"- shelf_beer (Стеллаж): 1.55m x 0.55m"
)
logger.info(f"📏 Габариты комнаты: {test_size_n}x{test_size_m}м")
logger.info(f"📦 Каталог оборудования:\n{test_equipment}")
# Формируем тестовый запрос
test_request: str = "Сделай стенд для вечеринки: нужно много пива, чипсов и немного энергетиков. Поставь два стеллажа и один холодильник."
logger.info(f"🗣️ Тестовый промпт: '{test_request}'")
# Отправляем запрос на сервер с новыми обязательными параметрами
result: Optional[Dict[str, Any]] = client.generate_layout(
user_request=test_request,
available_categories=test_categories,
equipment_catalog=test_equipment,
size_n=test_size_n,
size_m=test_size_m
)
if result:
logger.info("✅ Успешный ответ от нейросети:")
# Выводим структуру полученного графа
nodes: List[Dict[str, Any]] = result.get("nodes", [])
edges: List[Dict[str, Any]] = result.get("edges", [])
logger.info(f"Сгенерировано узлов: {len(nodes)}")
for node in nodes:
logger.info(f" - Узел: {node.get('id')} ({node.get('type')}) на координатах ({node.get('draft_cx')}, {node.get('draft_cy')})")
logger.info(f"Сгенерировано связей: {len(edges)}")
for edge in edges:
logger.info(f" - Связь: {edge.get('source')} -> {edge.get('target')} ({edge.get('relation')})")
else:
logger.error("❌ Нейросеть не вернула результат. Проверь логи сервера vLLM.")
if __name__ == "__main__":
main()