Создание пользовательской базы знаний
Плагин Alauda Hyperflux поставляется со встроенной системной базой знаний, охватывающей Alauda Container Platform (ACP) и документацию продуктов Alauda. Наряду с ней Hyperflux поддерживает отдельную пользовательскую базу знаний, которую можно заполнить собственным содержимым — внутренними runbook, SRE playbook, проектной документацией, версиями документации по продуктам Alauda, которые не входят в поставляемый корпус, или любыми другими приватными Git repositories. Hyperflux выполняет поиск по обеим базам знаний при каждом запросе и объединяет результаты, поэтому добавление пользовательского корпуса расширяет поставляемую продуктовую базу знаний, а не заменяет её.
Это руководство описывает путь, управляемый администратором: массовый импорт списка Git repositories в пользовательскую базу знаний с использованием builder внутри pod. (Для загрузки файлов конечными пользователями через chat UI используйте инструмент BYO Knowledge, добавленный в v1.3.1 — та же целевая база, но другой entry point.)
Рабочий процесс выполняется внутри развернутого pod smart-doc. В образ уже включены исходный код builder,
embedding model и нужное Python-окружение, а в pod уже есть подключение к PostgreSQL пользовательской базы
знаний. Вам нужен только manifest с repository для импорта и доступ kubectl exec к глобальному cluster.
Содержание
Как работает pipeline embeddingПредварительные требованияStep 1 — Опишите свой корпусStep 2 — Скопируйте manifest в pod smart-docStep 3 — Запуститеprepare внутри podStep 4 — Запустите embed внутри podStep 5 — Создайте BM25 index для пользовательской базы знаний (один раз)(Необязательно) Multi-cluster: dump и restoreЗамена поставляемой системной базы знаний (advanced)Периодичность повторных запусковОграничения и особенностиКак работает pipeline embedding
builder smart-doc преобразует список Git repositories в векторизованную базу знаний в два этапа:
- Prepare — клонирует repositories, разделяет каждый документ
.md/.mdxпо заголовкам и размеру chunk, затем вызывает LLM (тот же, который уже настроен для запущенного плагина Hyperflux) для генерации однопараграфного summary и нескольких репрезентативных вопросов для каждого документа. Результат:documents.json. - Embed — загружает embedding model
gte-multilingual-base, вычисляет embeddings как для chunks, так и для summary каждого документа, и записывает их в PostgreSQL пользовательской базы знаний (docvec_user_kb) под именем collection, которое читает запущенный server (user_defined_kbпо умолчанию).
После этого запущенный server подхватывает новый контент при следующем запросе — без изменения chart, без перезапуска pod. Системная база знаний при этом не затрагивается.
ПРИМЕЧАНИЕ: BM25 index, используемый гибридным retrieval, не создаётся на этапе embed. Поставляемые дампы системной базы знаний содержат заранее построенный BM25 index, но база данных пользовательской KB создаётся пустой во время установки. Если в вашем deployment включён hybrid retrieval (по умолчанию), вы должны один раз создать BM25 index для collection пользовательской KB — см. Step 5.
Предварительные требования
- Доступ
kubectlк cluster, на котором работает Hyperflux (глобальный cluster), с правомexecна podsmart-docв namespacecpaas-system. - Доступ на чтение ко всем Git repositories, которые вы хотите импортировать. Если они приватные, подготовьте пару HTTPS user/token.
- LLM endpoint с достаточной квотой. На этапе prepare выполняется один вызов LLM на каждый исходный документ (примерно 1 000–3 000 вызовов на базу знаний размера ACP). По умолчанию команды внутри pod используют LLM endpoint, уже настроенный для Hyperflux (тот, который был задан при установке через LLM Base URL / LLM API Key / LLM Model Name). Если у вашей учетной записи есть ограничения по rate limit, подготовьте отдельный endpoint с более высокой квотой и переопределите переменные окружения в exec session (Step 3).
Вам не нужны отдельное Python-окружение на рабочей станции, загруженная копия gte-multilingual-base,
отдельный экземпляр PostgreSQL или клон repository smart-doc — всё это уже встроено в container smart-doc.
Step 1 — Опишите свой корпус
Создайте JSON manifest со списком всех Git repositories, которые нужно импортировать. Сохраните его на локальной
машине как my-kb.json (подойдет любое имя — вы скопируете файл в pod на Step 2).
Добавьте дополнительные записи repos, чтобы импортировать несколько repositories за один запуск.
Справочник по полям:
Step 2 — Скопируйте manifest в pod smart-doc
Step 3 — Запустите prepare внутри pod
Откройте интерактивную shell-сессию в container serve и выполните этап prepare:
Полезные флаги:
--dryrun— клонирует repositories и выводит список документов, но не вызывает LLM. Сначала используйте этот режим, чтобы проверить, что фильтрыsub_dirsиdoc_typeсоответствуют ожидаемым.
ПРИМЕЧАНИЕ:
prepareне кеширует ответы LLM между запусками — каждый вызов повторно выполняет по одному запросу LLM на каждый исходный документ. Планируйте полную стоимость на документ при каждом повторном прогоне и повторно запускайте prepare только тогда, когда действительно изменился исходный корпус (иначе повторно запускайте толькоembedдля уже существующегоdocuments.json).
Step 4 — Запустите embed внутри pod
Оставайтесь в той же shell-сессии, чтобы переменные окружения из Step 3 по-прежнему действовали:
Chart уже экспортирует EMB_MODEL_NAME=/opt/gte-multilingual-base, DEVICE=cpu и
PG_USER_KB_CONN_STR (указывающую на базу данных пользовательской KB docvec_user_kb), поэтому
передавать --emb-model или --device не нужно. Явно передайте --pg-conn-str "${PG_USER_KB_CONN_STR}",
поскольку значение по умолчанию в script — строка подключения к системной KB (PG_SYS_KB_CONN_STR).
Что делают флаги:
ПРЕДУПРЕЖДЕНИЕ: Если
--vector-typesвключаетdoc_summary, ноdocuments.jsonбыл создан запускомprepare, в котором не был установленENABLE_GEN_QUESTIONS=true, embed молча создаст 0 summary vectors и лишь выведет в концеno_summary=N. Если значениеno_summaryвысокое, повторно запуститеprepareсENABLE_GEN_QUESTIONS=trueперед повторным запуском embed.
ПРИМЕЧАНИЕ: container serve по умолчанию работает на CPU (
DEVICE=cpu). Встраивание 5 000 chunks на CPU занимает примерно час; для небольшого внутреннего корпуса (несколько сотен документов) — несколько минут. Если вам нужен GPU throughput, запустите build на pod, запланированном на GPU (это выходит за рамки данного руководства), и используйте путь dump-and-restore между cluster, описанный далее.
Этап embed не вызывает LLM; его можно недорого повторно запускать для того же documents.json, чтобы попробовать
другой размер chunk или расширить существующую collection новыми документами.
Step 5 — Создайте BM25 index для пользовательской базы знаний (один раз)
База данных пользовательской KB создаётся пустой во время установки — в отличие от поставляемых дампов системной KB, в ней не создаётся BM25 index заранее. Если включён hybrid retrieval (по умолчанию), создайте index один раз после первого запуска embed:
Без этого index путь hybrid retrieval молча переключается на dense-only для пользовательской KB (результаты по-прежнему возвращаются, но без точного совпадения по ключевым словам).
На этом всё — ни изменение chart, ни перезапуск pod не требуются. Запущенный server уже читает данные из
docvec_user_kb / user_defined_kb при каждом запросе, поэтому ваш пользовательский корпус начинает влиять на
ответы немедленно. Проверьте это, задав типовой вопрос через chat UI.
(Необязательно) Multi-cluster: dump и restore
Если вы хотите один раз собрать корпус и затем развернуть его в нескольких cluster, выполните pg_dump
пользовательской KB после Step 4 и восстановите его на каждом целевом cluster:
Затем выполните Step 5 (BM25 index) на каждом целевом cluster — index является per-database и сам по себе не
сохраняется при restore в пустую DB (при restore в уже заполненную DB BM25 объединяется, если присутствует в
дампе; для новой пользовательской KB после restore выполните CREATE INDEX).
ПРИМЕЧАНИЕ:
pg_restoreдампа пользовательской KB в целевой cluster, где уже есть содержимое user-KB (например, предыдущие BYO uploads), вызовет конфликт наCREATEтаблиц langchain. Для чистого overlay используйте вместо этого механизм swap chart или сначала удалите и заново создайтеdocvec_user_kbна целевом cluster. Обычныйpg_restoreнаиболее безопасен только тогда, когда целевая пользовательская KB пуста.
Замена поставляемой системной базы знаний (advanced)
Описанный выше workflow добавляет данные в user KB и оставляет поставляемую продуктовую базу знаний без изменений. Если у вас другое требование — например, поставляемая документация Alauda в вашем окружении неверна, и вы хотите заменить её на внутреннюю версию — выполните тот же workflow внутри pod, но нацельтесь на системную KB:
--pg-conn-str "${PG_SYS_KB_CONN_STR}"--collection-name <your-system-kb-collection-name>- Обновите
pgconnect.pgCollectionNameв chart, чтобы он указывал на имя вашей collection, и выполните повторный запуск.
Этот путь требует изменения chart и отключает автоматические обновления системной KB при будущих релизах Hyperflux (проверка правила auto-swap не совпадёт с вашим пользовательским именем collection). Используйте его только тогда, когда расширения пользовательской KB недостаточно.
Периодичность повторных запусков
Пользовательские базы знаний устаревают быстрее, чем продуктовая документация. Планируйте повторный запуск prepare → embed по расписанию, соответствующему вашим source repositories:
- Runbook, которые меняются ежедневно → nightly cron (Kubernetes
CronJob, выполняющий те же команды внутри pod как одноразовый job) с повторным embedding в ту же collectionuser_defined_kb. - Архитектурная документация, обновляющаяся ежеквартально → ручной повторный запуск на каждом релизном рубеже.
Повторный запуск embed для той же collection использует детерминированные row ID (make_row_id в
smart_doc_builder.py:38-48), поэтому неизменённые chunks обновляются идемпотентно, а изменённые chunks
перезаписываются — но строки для документов, которые были удалены из manifest, становятся сиротскими.
Для чистой замены удалите и заново создайте collection перед повторным embedding:
Затем повторно выполните Step 4, чтобы заполнить данные заново. BM25 index на langchain_pg_embedding
продолжает автоматически применяться к новым строкам, поэтому повторно выполнять Step 5 не нужно —
если только вы не удаляли саму базу данных (например, для overlay через pg_restore в multi-cluster,
описанного выше).
Ограничения и особенности
- Пользовательский корпус использует общую user KB вместе с загрузками через BYO Knowledge tool. Файлы,
которые конечные пользователи загружают через chat UI (добавлено в v1.3.1), попадают в ту же collection
user_defined_kb, что и корпус, управляемый администратором. Они сосуществуют, пока не конфликтуют URL; на практике это нормально, потому что BYO uploads используют отдельную схему URL. Если вы когда-нибудь удалите и заново создадите collection (раздел Re-roll cadence), BYO uploads в этой collection будут удалены вместе с вашим корпусом — если они важны, сначала сделайте резервную копию. - Фильтры версии системной KB не применяются к user KB. Когда пользователь задаёт вопрос, зависящий от версии (например, об ACP 4.3), системная KB фильтруется по этой версии, а user KB возвращает совпадения по всем версиям. Если ваш пользовательский корпус содержит несколько версий, ожидайте, что в ответах будут появляться chunks из разных версий.
- Несоответствие embedding model — самая частая тихая ошибка: vectors, созданные чем-либо, кроме встроенной
/opt/gte-multilingual-base, можно будет извлечь, но они всегда будут давать оценку близкую к нулю, поэтому ответы будут сводиться к «У меня недостаточно информации» без явной ошибки. Описанный здесь workflow внутри pod по умолчанию использует встроенную модель — переопределяйтеEMB_MODEL_NAMEтолько если точно понимаете, что делаете.