Если вы ищете, как в ChatGPT и в API OpenAI устроен поиск по своим документам, то первое, что нужно знать: старого механизма больше нет. У OpenAI был отдельный эндпоинт Search, к которому обращались из кода, чтобы найти нужный кусок в своей базе текстов. Его убрали из документации и отключили для всех организаций 3 декабря 2022 года. Аккаунты, созданные после 3 июня, доступ к нему уже не получали. Причина простая: у OpenAI появились методы, которые справляются с этой задачей лучше. Ниже - что именно закрыли, чем это заменяют и что делать, если вы наткнулись на старый пример кода.
Что закрыли и почему
Эндпоинт Search работал так: вы отдавали ему набор документов и запрос, а он возвращал документы, отсортированные по релевантности. Под капотом кандидатов сначала отбирал биграммный фильтр, то есть поиск шёл по парам соседних слов. Такой отбор понимает буквальные совпадения и почти не понимает смысл: запрос "как вернуть деньги за подписку" не совпадёт с документом, где написано "процедура отмены и возмещения".
Именно на это OpenAI и ссылается в руководстве по переходу: система на эмбеддингах гораздо лучше учитывает контекст, а в долгую ещё и заметно дешевле. Поэтому разработчикам настойчиво рекомендовали переехать, а не ждать.
Вариант первый: поиск на эмбеддингах
Это рекомендованный OpenAI путь, и для большинства сценариев он и правда закрывает задачу. Логика такая: каждый ваш документ один раз превращается в вектор чисел, запрос пользователя превращается в такой же вектор, а поиск сводится к сравнению векторов между собой. Совпадение слов при этом не обязательно - находится текст, близкий по смыслу.
Отдельно в руководстве оговорено, что делать при больших объёмах. Если документов больше десяти тысяч, векторы стоит держать не у себя в памяти, а в специализированном поисковом движке. В качестве примеров OpenAI называет Pinecone и Weaviate.
Из нашего опыта: узкое место здесь не сам поиск, а нарезка. Документы почти всегда нужно резать на куски по несколько абзацев, иначе в вектор одной статьи попадает столько разных тем, что он перестаёт быть похожим хоть на что-то конкретное.
Вариант второй: повторить старое поведение самому
OpenAI описал и второй путь для тех, кому переезд на эмбеддинги сразу не подходит. Если вы вызывали Search с параметром document, то есть передавали документы прямо в запросе, старые вызовы openai.Search.create и openai.Engine.search заменяются готовым фрагментом кода из руководства. У него есть одна оговорка, о которую легко споткнуться: фрагмент работает только с движками, не относящимися к Codex, потому что у тех другой токенизатор. Этот код планировали внести в библиотеку openai-python под именем openai.Search.create_legacy.
Как был устроен поиск по файлу
Второй способ вызова - с параметром file - работал сложнее, и OpenAI раскрыл его внутреннюю кухню, чтобы такую же схему можно было собрать у себя. Шаги были такие:
- Вы загружали файл в формате jsonl. Каждая строка файла становилась отдельным документом.
- В каждой строке обязательно было поле text и необязательное поле metadata.
- Документы складывались в Elasticsearch. Поле text индексировалось анализатором standard_bigram_analyzer: стандартный токенизатор плюс фильтры lowercase, english_stop и shingle. Поле metadata в индексе не включалось.
- Дальше шёл обычный поисковый запрос к Elasticsearch, а параметр max_rerank определял, сколько документов вернуть в качестве кандидатов.
- Кандидатов пропускали через вызов Search ещё раз, уже чтобы пересортировать их по релевантности.
Обратите внимание на фильтр english_stop: стоп-слова там английские. Для русских текстов такая схема изначально работала хуже, и это лишний довод в пользу эмбеддингов, а не воспроизведения старого механизма.
А что с поиском внутри самого ChatGPT
Здесь важно не перепутать две разные вещи. Закрытый эндпоинт Search - это инструмент разработчика, который вызывали из кода. Обычному пользователю ChatGPT он не был виден никогда, и на работу интерфейса его отключение не повлияло.
В самом ChatGPT поиск по своим материалам живёт в других механизмах: загрузка файлов в чат и подтягивание нужных кусков под ваш вопрос. В блоке связанных статей OpenAI ставит рядом с руководством по переходу именно их: как работает загрузка файлов, оптимизация загрузок в ChatGPT Enterprise и материал про RAG и семантический поиск для GPT. То есть подход у пользовательской части тот же самый - поиск по смыслу, а не по совпадению слов.
Что делать, если наткнулись на старый пример
Руководству по переходу больше двух лет, а примеры с openai.Search.create до сих пор попадаются в статьях, ответах на форумах и в подсказках моделей. Проверять их стоит по трём признакам.
- В коде есть openai.Search.create или openai.Engine.search. Это мёртвый вызов, он не заработает ни на каком ключе.
- Упоминается параметр max_rerank или загрузка jsonl "для поиска". Это описание старой файловой схемы.
- Статья обещает "поиск по документам одним запросом к OpenAI". Сегодня это две отдельные части: считаем эмбеддинги, ищем по ним в своём хранилище.
И общее правило, которое экономит время: если инструкция по API написана до конца 2022 года, её нужно перепроверять целиком, а не по одной строчке. За это время у OpenAI сменились и модели, и библиотека, и сами подходы к работе с документами.
Где купить ChatGPT из России
И для экспериментов с эмбеддингами, и для работы в самом чате нужен оплаченный аккаунт, а карта российского банка на сайте OpenAI не проходит. Мы оформляем подписку на вашу почту: ChatGPT Go, Plus, Pro 5x и Pro 20x, а также пополнение API-баланса. Оплата картой РФ или через СБП, выдача в день заказа, поддержка на русском в чате на сайте.
Обсуждение
0 комментариев