Когда вы только начинаете создавать что-то на базе искусственного интеллекта, все громкие голоса указывают в одном направлении: на модель. Выберите правильную, говорят они, и всё остальное встанет на свои места. Спустя несколько недель моих собственных экспериментов я могу сказать вам, что это совсем не так. Выбор между доступными большими языковыми моделями важен, но это, пожалуй, лишь двадцать процентов работы. Остальное — это системная работа. Это настройка инфраструктуры, мастерство и непрерывное тестирование. Это осознание пришло ко мне рано, и с тех пор оно изменило мой подход к каждому проекту.
Модель — это только начало
Легко понять, почему новички зацикливаются на моделях. Примечания к релизам обещают улучшенное рассуждение, увеличенные контекстные окна и более чистые результаты. Эти улучшения реальны, но они носят общий характер. Современная модель не узнает автоматически политику возврата вашей компании. Она не будет надежно форматировать ответы для вашего мобильного приложения, если вы не скажете ей, как это делать. Она не может извлечь данные о наличии товаров в реальном времени из ниоткуда.
Я усвоил это на собственном горьком опыте. Мой первый прототип использовал способную модель и выдавал красивые, уверенные абзацы, которые время от времени были совершенно неверными. Текст звучал профессионально, потому что модель освоила тон, но у нее не было доступа к актуальной информации. Я потратил дни на сравнение бенчмарков моделей, когда мне следовало думать о конвейерах данных и инъекции контекста. Модель не была сломана. Система вокруг нее была неполной. Это различие имеет решающее значение, когда вы переходите от демо-версий к программному обеспечению, на которое люди действительно полагаются.
Промпты — это код, а не просто рекомендации
Высококачественные промпты лежат в основе любого надежного ИИ-приложения. Вначале я относился к промптам как к поисковым запросам — коротким, неформальным, оптимистичным. Я просил модель «резюмировать это» или «быть полезной» и надеялся на лучшее. Результаты хаотично колебались между полезными и бесполезными, и я понятия не имел почему.
Теперь я отношусь к промптам как к легковесным программам. Хороший промпт определяет роль, указывает формат вывода, включает примеры при необходимости и устанавливает границы. Если мне нужен JSON, я прошу JSON и показываю схему. Если мне нужен краткий ответ, я явно ограничиваю длину и запрещаю вводные фразы. Итерации имеют значение. Я веду журнал промптов и их результатов, меняя по одной переменной за раз. Одно неопределенное прилагательное в промпте может изменить поведение всего рабочего процесса. Такая чувствительность требует строгости, а не догадок.
Мусор на входе — мусор на выходе
Надежное извлечение данных — это то место, где тихо умирают многие ИИ-проекты. Retrieval-Augmented Generation, или RAG, стал стандартным паттерном для предоставления моделям доступа к частным или актуальным данным. Идея проста: извлечь релевантные документы, поместить их в контекстное окно модели и позволить модели рассуждать на основе фактов. На практике всё гораздо сложнее.
Я потратил время на отладку простой базы знаний, которая постоянно выдавала несвязанные результаты. Модель была в порядке. Проблема была в слое извлечения. Мои чанки были слишком маленькими и лишенными контекста. Эмбеддинги генерировались без очистки дублирующихся заголовков. Поиск по сходству находил технически близкий текст, который отвечал на не тот вопрос. Исправление этого означало переосмысление стратегии разбиения на чанки, добавление фильтров метаданных и внедрение этапа переранжирования. Как только извлечение стабилизировалось, ответы модели мгновенно улучшились. Урок был ясен: вы не сможете исправить плохое извлечение данных с помощью лучшей модели. Вы должны правильно построить конвейер.
Нельзя улучшить то, что вы не измеряете
Постоянная оценка — это привычка, которая отличает эксперименты от продуктов. Когда я начинал, я оценивал «по ощущениям». Я прочитал пять ответов, одобрительно кивнул и пошел дальше. Это работает до тех пор, пока пользователь не задаст шестой вопрос и не получит что-то странное.
Теперь я создаю небольшие наборы для оценки для каждой функции. Я собираю реальные запросы пользователей, помечаю ожидаемое поведение и запускаю автоматические проверки. Я слежу за дрейфом: промпт, который работал в прошлом месяце, может ухудшиться после обновления модели или изменения базовых данных. Я разделяю оценку стиля и фактическую точность. Выглядеть профессионально — это хорошо; быть правым — обязательно. Без этого цикла вы выпускаете продукт, полагаясь на надежду, а надежда — это не стратегия тестирования.
Знайте пределы машины
Понимание ограничений моделей уберегло меня от пустых обещаний и недоработок. У этих систем есть реальные ограничения. Контекстные окна стали больше, чем раньше, но у них все еще есть пределы, и заполнение их до отказа снижает производительность на краях. Модели галлюцинируют, особенно в нишевых темах, где обучающих данных мало. Они с трудом справляются с точной арифметикой и определенными типами многошаговой логики. Они чувствительны к формулировкам.
Стоимость и скорость — это тоже ограничения. Модель, генерирующая идеальную прозу за десять секунд, может оказаться непригодной для чат-интерфейса в реальном времени. Теперь я заранее сопоставляю функции с бюджетами задержки (latency budgets). Если задаче требуется ответ менее чем за секунду, я могу предварительно вычислять ответы, агрессивно использовать кэширование или использовать меньшую модель для черновика и большую — только для доработки. Работа в рамках ограничений — это стандарт инженерии. ИИ здесь не исключение.
Создание инструментов для реальных людей
Сейчас я изучаю применение LLM и программную инженерию с простой целью: создавать инструменты, которыми люди пользуются каждый день. Это звучит очевидно, но разрыв между крутым прототипом и инструментом повседневного использования огромен. Демо-версия может простить сорокасекундную паузу и многословный ответ. Человек, пытающийся завершить задачу перед встречей, — нет.
Инструментам повседневного использования нужны обработка ошибок, резервные варианты (fallbacks) и понятный UI на случай, если модель не уверена в ответе. Они должны интегрироваться в существующие рабочие процессы, а не навязывать новые. Теперь я думаю о граничных случаях: что произойдет, если модель откажется отвечать, если контекст переполнится или если API выдаст тайм-аут? Выпуск программного обеспечения с ИИ означает решение этих вопросов с помощью кода, а не просто на одном оптимизме.
Давайте делиться тем, что узнаем
Я хочу наладить связь с другими разработчиками, которые идут тем же путем. Область развивается быстро, и лучшие практики все еще формируются. Ни у кого нет всех ответов. Независимо от того, сражаетесь ли вы с дизайном промптов, боретесь с конвейерами поиска (retrieval pipelines) или пытаетесь понять, как масштабировать оценку результатов, проблемы лучше решать сообща.
Давайте делиться тем, что узнаем. Не отполированными до блеска докладами для конференций, а «грязной серединой». Сломанными конвейерами, правками промптов, которые наконец сработали, тестами оценки, которые поймали баг перед запуском. Именно такой детальный и честный обмен превращает индивидуальные эксперименты в общую базу знаний.
Главный вывод
Если вы только начинаете путь в разработке ИИ, тратьте меньше времени на поиск...
