Узнайте, как создать игру «Векторный поиск» с AI Studio и Cloud Run, и какой неожиданный баг заставил меня переделывать приложение. Попробуйте сами!
Вы когда-нибудь сталкивались с ситуацией, когда AI-инструмент делает больше, чем вы просили? Я создал простую игру-поиск слов для конференции, но AI Studio сгенерировала динамическое приложение, которое менялось при каждом обновлении страницы. В этой статье я расскажу, как я построил «Векторный поиск» с помощью AI Studio и Cloud Run, и какой неожиданный баг заставил меня срочно всё переделывать.
Мы с DEV и MLH освещали AI Engineer's World Fair и каждый день выпускали физическую газету «The Daily Context». В каждый номер мы хотели включать игру. Для первого выпуска я придумал небольшую головоломку — поиск слов, который назвал «Vector Search». Игру я построил с помощью AI Studio и развернул на Cloud Run. Получилось очень просто и быстро, а мелкие детали вроде анимации конфетти при завершении и кнопки показа ответа добавили шарма.
Утром перед запуском цифровой версии газеты я обнаружил забавную проблему. AI Studio сделала больше, чем нужно: она создала приложение, где поле для поиска слов менялось при каждом обновлении страницы. В печатной версии поле было статическим, но цифровая генерировала новое расположение слов. Слова для поиска оставались теми же, поэтому я сразу не заметил.
Хотя динамическое поле даёт лучший игровой опыт, участникам конференции было сказано посещать цифровую версию газеты для получения ответов. Мне пришлось быстро упростить приложение, чтобы цифровая и печатная версии совпадали. Это классическая проблема, которая не возникла бы до эры AI!
Давайте разберём, как создать подобную игру с помощью AI Studio и Python. Я использую простой пример: поле 10x10, слова из списка AI-терминов, случайное размещение.
import random
import string
# Список слов для поиска
words = ["RAG", "LoRA", "GPT", "BERT", "T5"]
# Размер поля
SIZE = 10
def create_grid(size):
# Создаём пустую сетку
grid = [['' for _ in range(size)] for _ in range(size)]
return grid
def place_word(grid, word):
# Пытаемся разместить слово случайно
for _ in range(100): # максимум 100 попыток
direction = random.choice(['horizontal', 'vertical'])
if direction == 'horizontal':
row = random.randint(0, SIZE-1)
col = random.randint(0, SIZE - len(word))
# Проверяем, что все ячейки свободны или совпадают
if all(grid[row][col+i] in ('', word[i]) for i in range(len(word))):
for i, char in enumerate(word):
grid[row][col+i] = char
return True
else: # vertical
row = random.randint(0, SIZE - len(word))
col = random.randint(0, SIZE-1)
if all(grid[row+i][col] in ('', word[i]) for i in range(len(word))):
for i, char in enumerate(word):
grid[row+i][col] = char
return True
return False
def fill_grid(grid):
# Заполняем оставшиеся ячейки случайными буквами
for r in range(SIZE):
for c in range(SIZE):
if grid[r][c] == '':
grid[r][c] = random.choice(string.ascii_uppercase)
def print_grid(grid):
for row in grid:
print(' '.join(row))
# Создаём и заполняем
import copy
grid = create_grid(SIZE)
for word in words:
placed = place_word(grid, word.upper())
if not placed:
print(f"Не удалось разместить слово {word}")
fill_grid(grid)
print_grid(grid)В моём случае AI Studio генерировала новое поле при каждом запросе. Чтобы сделать поле статическим, я сохранял сгенерированное состояние и возвращал его без изменений. Вот упрощённая версия:
from flask import Flask, jsonify, render_template_string
import random
import string
app = Flask(__name__)
# Глобальная переменная для хранения состояния
cached_grid = None
cached_words = None
def generate_static_game():
# Генерируем один раз и кешируем
global cached_grid, cached_words
if cached_grid is not None:
return cached_grid, cached_words
words = ["RAG", "LoRA", "GPT", "BERT", "T5"]
grid = create_grid(10)
for word in words:
place_word(grid, word.upper())
fill_grid(grid)
cached_grid = grid
cached_words = words
return grid, words
@app.route('/game')
def game():
grid, words = generate_static_game()
# Возвращаем HTML с данными
return render_template_string('''
<h2>Vector Search</h2>
<pre>{{ grid_str }}</pre>
<p>Найдите слова: {{ words }}</p>
''', grid_str='\n'.join(' '.join(row) for row in grid), words=', '.join(words))
if __name__ == '__main__':
app.run()Попробуйте сами создать свою версию игры с помощью AI Studio или любого AI-инструмента. Когда будете тестировать, обязательно проверьте, не делает ли AI больше, чем вы просили. Если вы разрабатываете для продакшена, всегда фиксируйте состояние, чтобы избежать неожиданных изменений. А если хотите поиграть в мою оригинальную игру — вот ссылка (она уже статическая!).
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →