База знаний через API превращает набор документов в постоянный поисковый слой: приложение загружает файлы, ждёт индексацию, находит релевантные фрагменты и получает ответ с цитатами. В LLMTOKENAPI этот цикл собран вокруг /v1/knowledge-bases; данные разных организаций изолированы, а исходный контент хранится в зашифрованном виде.
Когда нужна управляемая база знаний
Собственная связка парсера, embeddings, векторной базы и генерации даёт полный контроль, но требует обслуживать форматы, очереди, повторные загрузки, права доступа и удаление. Управляемый API полезен, когда продукту важнее быстро получить воспроизводимый RAG-контур и измерять качество ответа, чем поддерживать каждый инфраструктурный компонент.
Для разового поиска по нескольким страницам постоянная база избыточна: используйте Contents или Search API. Если данные должны автоматически обновляться с сайта, подключите Website Knowledge Sync — его отдельная схема описана в статье про синхронизацию базы знаний.
Создайте базу отдельным запросом
Ключу нужны knowledge:write для создания и загрузки, а также knowledge:read для статуса, поиска и ответа. Начните с понятного имени и необязательного описания:
curl https://api.llmtokenapi.ru/v1/knowledge-bases \
-H "Authorization: Bearer $LLMTOKENAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Документация продукта",
"description": "Публичные руководства и внутренние регламенты поддержки"
}'
Сохраните id из ответа как BASE_ID. Не используйте имя как технический идентификатор: оно описывает бизнес-контекст, а UUID служит ссылкой для файлов, поиска и удаления. Список баз читается через GET /v1/knowledge-bases.
Загрузите файл идемпотентно
Файл передаётся как multipart/form-data в поле file. Для каждого логического добавления нужен Idempotency-Key; при сетевом повторе отправляйте тот же ключ:
curl https://api.llmtokenapi.ru/v1/knowledge-bases/BASE_ID/files \
-H "Authorization: Bearer $LLMTOKENAPI_API_KEY" \
-H "Idempotency-Key: support-handbook-v3" \
-F "file=@support-handbook.pdf"
Один файл может занимать до 100 МБ и до 1 000 страниц. Поддерживаются PDF, DOCX, PPTX, XLSX, TXT, Markdown, HTML, CSV и распространённые растровые изображения. TypeScript SDK умеет ограниченно параллелить пакет до 100 файлов, но каждому элементу всё равно назначается отдельное задание и идемпотентный ключ.
Перед обработкой содержимое проходит проверку и разбор. Повторная отправка файла с тем же хешем в ту же базу не должна создавать вторую копию. Это полезная страховка, но не заменяет версионирование на стороне приложения: храните источник, дату и бизнес-версию документа рядом с его идентификатором.
Дождитесь готовности индекса
Загрузка создаёт асинхронное ingest-задание. Не отправляйте пользовательский вопрос сразу после 202 Accepted. Проверяйте общий статус базы:
curl https://api.llmtokenapi.ru/v1/knowledge-bases/BASE_ID/status \
-H "Authorization: Bearer $LLMTOKENAPI_API_KEY"
Статус показывает число готовых, обрабатываемых и проблемных файлов. По уже готовой части можно искать, пока остальные документы ещё индексируются. В интерфейсе показывайте эту неполноту явно: «готово 18 из 20» полезнее, чем молча отвечать по частичному корпусу.
Список объектов доступен через GET /v1/knowledge-bases/BASE_ID/files. Для сбоя сохраните идентификатор задания и публичный код ошибки; не повторяйте загрузку с новым ключом, пока не выяснено состояние старого запуска.
Сначала проверьте семантический поиск
До генерации ответов убедитесь, что retrieval находит нужные фрагменты. Метод /search принимает вопрос, topK от 1 до 50 и флаг rerank, включённый по умолчанию:
curl https://api.llmtokenapi.ru/v1/knowledge-bases/BASE_ID/search \
-H "Authorization: Bearer $LLMTOKENAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "Каков срок ответа поддержки на критический инцидент?",
"topK": 8,
"rerank": true
}'
Проверяйте не только первый результат. Целевой фрагмент должен находиться среди верхних кандидатов, содержать достаточный контекст и ссылаться на ожидаемый файл. Если retrieval слабый, генеративная модель не исправит отсутствующее доказательство. Практика измерения порядка документов разобрана в руководстве по Rerank API для RAG.
Получите ответ с цитатами
Когда поиск стабилен, используйте /answer. Параметр model: "auto" оставляет выбор подходящего публичного маршрута сервису, а maxOutputTokens ограничивает длину результата:
curl https://api.llmtokenapi.ru/v1/knowledge-bases/BASE_ID/answer \
-H "Authorization: Bearer $LLMTOKENAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "Каков срок ответа поддержки на критический инцидент?",
"topK": 8,
"rerank": true,
"model": "auto",
"maxOutputTokens": 1200
}'
Ответ должен рассматриваться вместе с citations. Ссылка доказывает происхождение фрагмента, но не гарантирует, что документ актуален или правило применимо к конкретному клиенту. Для юридических, медицинских и финансовых решений добавляйте проверку человеком и дату действия источника.
Разделите доступ и жизненный цикл данных
Не используйте один ключ для загрузчика и пользовательского чат-интерфейса. Процесс импорта получает knowledge:write, а runtime ответа — только knowledge:read. База привязана к организации; идентификатор другого tenant не должен открывать его файлы.
При удалении база сразу становится недоступной для чтения, а физическая очистка объектов и векторов завершается по эксплуатационной политике. Поэтому удаление — отдельная подтверждаемая операция, а не способ «переиндексировать» данные. Если нужна строгая замена всего корпуса, соберите и проверьте новую базу, переключите приложение на её UUID и только затем удалите старую.
Измерьте качество на собственных вопросах
Составьте набор из 30–100 реальных вопросов: простые факты, сравнения, вопросы без ответа и конфликтующие версии. Для каждого отметьте правильный файл, ожидаемый смысл и допустимый отказ. Измеряйте recall retrieval, корректность цитаты, полноту ответа, задержку и стоимость.
Актуальные схемы запросов доступны в OpenAPI LLMTOKENAPI, а общие ограничения — в документации. Хорошая база знаний через API начинается с контролируемого корпуса и проверки поиска. Лишь после этого подключайте генерацию, иначе красивый ответ скроет проблему индексации вместо того, чтобы решить её.



