Как искусственный интеллект помог нам добавить векторный поиск в Cassandra за шесть недель

ИИ помог добавить векторный поиск в Cassandra за 6 недель

С огромным спросом на функциональность векторного поиска, необходимую для поддержки приложений генеративного искусственного интеллекта, DataStax поставила перед собой крайне амбициозную цель – добавить эту возможность в Apache Cassandra и Astra DB, нашу управляемую службу, построенную на Cassandra.

В апреле, когда я спросил у нашего главного вице-президента по продукту, кто будет это разрабатывать, он сказал: “Почему бы тебе не сделать это?”

С помощью двух других инженеров я приступил к созданию новой реализации векторного поиска 7 июня – всего за шесть недель.

Могут ли новые инструменты для разработки искусственного интеллекта помочь нам достичь этой цели? Некоторые инженеры с уверенностью утверждают, что искусственный интеллект делает столько ошибок, что это отрицательно сказывается на производительности. Попробовав их на этом важном проекте, я убедился, что эти инструменты на самом деле значительно повышают производительность. Фактически, я больше никогда не вернусь к ручному написанию всего. Вот что я узнал о программировании с помощью ChatGPT, GitHub Copilot и других инструментов искусственного интеллекта.

Copilot

Copilot прост в использовании: это усовершенствованная автозаполнение. Большую часть времени он будет автоматически дополнять строку или находить соответствие нескольких строк из контекста. Вот, я написал комментарий и начал новую строку с кодом neighbors. Copilot предложил правильно дополнить остаток строки (с текстом, следующим после “neighbors” на второй строке):

Вот немного более сложный пример из тестового кода, где я начал писать цикл как mapToLong, но затем изменил структуру данных, чтобы было удобнее использовать метод forEach. Copilot помог мне:

Иногда (это скорее исключение, чем правило) он удивляет меня, предлагая дополнить весь метод:

Copilot полезен, но у него есть два ограничения. Во-первых, он настроен на (правильное) соблюдение осторожности. Он все еще может ошибаться, но это редкость; когда он не знает, что делать, он не предлагает автодополнения. Во-вторых, его возможности ограничены требованием быть достаточно быстрым, чтобы без проблем интегрироваться с небольшой паузой в наборе текста, что пока исключает использование сложной модели, например GPT-4.

(См. также этот твит Макса Кригера для “максималистского” подхода к Copilot.)

ChatGPT

Вы можете попробовать заставить Copilot генерировать код из комментариев, но для этого случая использования вы почти всегда получите лучшие результаты с использованием GPT-4 через платный доступ к ChatGPT или его API.

Если вы еще не пробовали GPT-4, вам обязательно стоит это сделать. Действительно, иногда он может ошибаться, но гораздо реже, чем GPT-3.5 или Claude. Также верно, что иногда он не может решить простые задачи (вот я борюсь, чтобы он понял простой бинарный поиск). Но иногда он почти поразительно хорош, например, когда он сразу же разобрался с условием гонки. И даже когда он не очень хорош, иметь партнера для отладки, который может ответить с приемлемым симулякром интеллекта, бесценно для поддержания концентрации и мотивации.

И вы можете использовать его для всего. Или почти всего, что можно описать текстом, что очень близко к “всему”, особенно в контексте программирования.

Вот несколько мест, где я использовал GPT-4:

  • Случайные вопросы о API, для которых раньше приходилось искать информацию самостоятельно. Это наиболее вероятная категория, в результате которой могут возникать галлюцинации, и я в основном перешел на Phind для этого случая использования (см. ниже).
  • Микро-оптимизации. Это похоже на Copilot, но с поиском соответствий во всем Stack Overflow, так как это (частично) то, на чем он был обучен.
  • Я использовал потоковые конвейеры Stream, потому что мне пока не очень хорошо удается превратить логику в моей голове в функциональную цепочку вызовов методов Stream. Иногда, как в этом примере, конечный результат оказывается хуже, чем то, с чего мы начали, но это часто случается в программировании. Это гораздо проще и быстрее сделать с помощью GPT, чем по одной клавише. И то, что петля времени до получения результатов становится быстрее, увеличивает вероятность того, что я попробую новую идею, так как стоимость эксперимента ниже.
  • Конечно же, GPT также знает о git, но, возможно, вы не осознали, насколько хорошо он умеет создавать пользовательские инструменты с использованием git. Как и другие пункты этого списка, это то, что я мог сделать раньше вручную, но наличие GPT, который ускоряет процесс, означает, что теперь я буду создавать такие инструменты (раньше я обычно предпочитал второе по качеству решение, вместо того, чтобы потратить час на одноразовый скрипт, подобный этому).

Вот мое любимое сотрудничество с GPT-4. Мне потребовалось написать специальный класс, чтобы избежать издержек сборки мусора при использовании наивного подхода с ConcurrentHashMap<Integer, Integer>, и это было для Lucene, которая имеет строгую политику без внешних зависимостей, поэтому я не мог просто заменить ее на конкурентную примитивную карту, как у Trivago – fastutil-concurrent-wrapper.

Я несколько раз общался с GPT, улучшая его решение. Этот разговор иллюстрирует, на мой взгляд, несколько лучших практик с GPT (на середину 2023 года):

  1. При написании кода GPT лучше всего справляется с хорошо инкапсулированными проблемами. В отличие от этого, у меня было больше неудачных попыток заставить его выполнять рефакторинги, затрагивающие несколько частей класса, даже если это небольшой класс.
  2. Фразы предлагайте в виде вопросов. “Не будет ли более эффективным …?” GPT (и, тем более, Клод) неохотно прямо противоречат своему пользователю. Оставьте ему возможность не согласиться, иначе вы можете непреднамеренно заставить его начать фантазировать.
  3. Не пытайтесь делать все в большой языковой модели (LLM). Итоговый результат этого разговора все еще требует некоторых доработок, но он достаточно близок к тому, что мне было нужно, и было проще и быстрее просто закончить его вручную, вместо того чтобы пытаться добиться от GPT идеального результата.
  4. В целом, я не верю в волшебные подсказки – лучше использовать простую подсказку, и если GPT начинает идти в неправильном направлении, исправьте его – но есть места, где правильная подсказка действительно может помочь очень сильно. Конкурентное программирование на Java – одно из таких мест. Предпочтительным решением GPT является просто добавление synchronized ко всему и считать это готовым. Я обнаружил, что если сказать ему думать в стиле гуру по конкурентности Клиффа Клика, это очень помогает. Недавно я также начал использовать слегка отредактированную версию системной подсказки Джереми Говарда.

Просмотрев этот список, поразительно, насколько он соответствует правилу, что искусственный интеллект – это как бесконечное количество стажеров, которые всегда в вашем распоряжении. Стажеры лучше всего справляются с самостоятельными задачами, часто неохотно противоречат своим руководителям и часто проще сделать работу самостоятельно, чем объяснить подробности своих требований стажеру. (Хотя я рекомендую сдерживаться от такого поведения с реальными стажерами, с GPT это не имеет значения.)

Расширенный анализ данных

Расширенный анализ данных, ранее известный как Code Interpreter – также часть ChatGPT – это следующий уровень, и я хотел, чтобы его уже было в наличии для Java. Он объединяет генерацию кода на Python GPT-4 в песочнице Juypter или Jupyter-подобной и ставит его в цикл для исправления собственных ошибок. Вот пример из моей отладки, когда я пытался выяснить, почему мой индексированный код строил граф с разделением.

Основная проблема, на которую нужно обратить внимание, заключается в том, что ADA, решая проблемы с неожиданным вводом, отбрасывает причинные строки, что обычно не то, что вы хотите. И он обычно доволен своими усилиями, как только код выполняется без ошибок – вам нужно быть точным в отношении проверок на здравый смысл, которые вы хотите, чтобы он включал. После того, как вы сообщите ему, что искать, он добавит это в свой цикл “повторять, пока не получится”, и вам не придется повторяться.

Также стоит упомянуть: слухи говорят, что ADA теперь работает на более продвинутой модели, чем обычный GPT-4, с (как минимум) более длинным окном контекста. Я теперь по умолчанию использую ADA для всего, и кажется, что это улучшение; единственным недостатком является то, что иногда он начинает писать на Python, когда я хочу на Java.

Клод

Клод – конкурент OpenAI GPT от Anthropic. Клод примерно на уровне GPT 3.5 по написанию кода – он заметно хуже, чем GPT-4.

Но у Клода окно контекста в 100 000 токенов, что в десять раз больше, чем у GPT-4. (OpenAI только что объявила о выпуске Enterprise ChatGPT, увеличивающем окно контекста GPT-4 до 32 000 токенов, что все равно только треть от Клода.)

Я использовал Клода для трех вещей:

  1. Вставка целых классов кода Cassandra, чтобы помочь разобраться, что они делают.
  2. Загрузка научных статей и задавание вопросов по ним.
  3. Делать и то, и другое одновременно: вот научная статья, вот моя реализация на Java. В чем разница? Соответствуют ли эти различия ограничениям X и Y?

Bing и Phind

Bing Chat получил много внимания, когда был запущен ранее в этом году, и до сих пор является хорошим источником бесплатного GPT-4 (выберите настройку “Творческий режим”), но это все. Я почти полностью перестал его использовать. Что бы ни сделал Microsoft с версией GPT-4 в Bing, она стала намного хуже в написании кода, чем версия в ChatGPT.

Вместо этого, когда мне нужен поиск с искусственным интеллектом, я использую Phind. Это то, что должен был быть Bing, но по какой-то причине маленький стартап превзошел Microsoft в одном из его флагманских проектов. Phind полностью заменил Google для моих вопросов типа “как я могу сделать X” на Java, Python, git и других языках. Вот хороший пример решения проблемы с незнакомой библиотекой. При таких запросах Phind почти всегда справляется — и с соответствующими источниками. В отличие от этого, Bing почти всегда цитирует хотя бы один источник, говорящий не то, что на самом деле.

Bard

Пока я не нашел ничего, в чем хорош Bard. У него нет навыка GPT-4 в написании кода или большого контекстного окна у Claude. В то же время, он более галлюцинирует, чем оба.

Сделать программирование продуктивным — и веселым

Cassandra — это большая и зрелая кодовая база, которая может показаться устрашающей новичку, который хочет добавить функциональность — даже для меня, после десяти лет, проведенных в основном на управленческой стороне. Если искусственный интеллект собирается помочь кому-то из нас двигаться быстрее, это и есть путь. ChatGPT и связанные инструменты искусственного интеллекта хороши в написании кода для решения четко поставленных задач, как часть более крупного проекта, разработанного человеческим инженером, или для единоразовых инструментов. Они также полезны для отладки, создания прототипов и изучения незнакомого кода.

Вкратце, ChatGPT и Copilot были ключом к выполнению нашего срока. Благодаря этим инструментам моя производительность повысилась на 50-100%, в зависимости от задачи. У них есть ограничения, но они отлично работают над мелкими задачами, помогая человеку-наблюдателю оставаться в зоне комфорта, выступая как беспокоиться партнер для обсуждения идей. Даже если у вас есть годы опыта программирования, вам нужно это делать.

Наконец, даже без аспектов продуктивности, программирование с помощью искусственного интеллекта, который помогает с повторяющимися частями, просто веселее. Это дало мне второе дыхание и новый уровень волнения от создания крутых вещей. Я с нетерпением жду использования более продвинутых версий этих инструментов по мере их развития и совершенствования.