Перейти к содержанию

Пилот: upload с knowledge_id (RAG-10)

Цель: проверить экспериментально гипотезу из rag-double-embedding.md (Вариант C):

Если сразу передать knowledge_id в metadata при POST /api/v1/files/, вызовется ли process_file только один раз, а не два?

Экономия при подтверждении: ×2 эмбеддинг-токенов + вдвое меньше места в Qdrant при массовом sync KB (24+ файла).


Что готово в skeletons/

  • upload-with-knowledge-id-pilot.sh — самодостаточный bash-скрипт, включая:
    • Автогенерация тестового Markdown
    • Замер baseline Qdrant
    • Загрузка через POST /api/v1/files/ с metadata
    • Замер после (коллекции, точки)
    • Парсинг логов rag-openwebui на process_file вызовы
    • Автоматический вывод: подтверждена ли гипотеза
    • Уборка

Порядок прогона (~20 минут)

1 · Подготовка ragserver

# ssh oswold@192.168.1.200
mkdir -p ~/rag-tests
cd ~/rag-tests

# Скопируй скрипт из репо:
cp /path/to/alatyr-infra-kb/skeletons/upload-with-knowledge-id-pilot.sh .
chmod +x upload-with-knowledge-id-pilot.sh

# Установить jq если нет:
sudo apt install -y jq

2 · Создать тестовую knowledge collection в UI

  • Открой https://rag.alatyr-service.ru (или http://192.168.1.200:3000)
  • Workspace → Knowledge → New Knowledge
  • Name: pilot-8a
  • Description: Тестовая коллекция для пилота 8a — удалить после
  • Открой созданную, скопируй ID из URL (/workspace/knowledge/<UUID>)

3 · Получить токены из Vaultwarden

# Из Vaultwarden:
# - "OpenWebUI API · admin" → скопируй Bearer token
# - "Qdrant API key" → скопируй ключ

4 · Запустить пилот

export OW_API_TOKEN='sk-...'         # из Vaultwarden
export QDRANT_KEY='...'              # из Vaultwarden
export KNOWLEDGE_ID='...'            # UUID из шага 2

./upload-with-knowledge-id-pilot.sh

Скрипт вернёт вердикт автоматически. Полный лог — в /tmp/pilot-8a.log.

5 · Интерпретация

Результат Действие
process_file вызвался 1 раз, коллекций +0 Переписать sync-to-openwebui.sh — использовать этот endpoint
process_file вызвался 2 раза, коллекция создана Оставляем Вариант A (смириться). Обновить rag-double-embedding.md — Вариант C проверен, не работает
⚠️ Неоднозначно Читай /tmp/pilot-8a.log глазами, проверь версию OpenWebUI (docker exec rag-openwebui cat /app/backend/open_webui/config.py \| grep VERSION)

6 · Убрать пилотные артефакты

# В UI:
# Workspace → Knowledge → pilot-8a → Delete
# Workspace → Files → pilot-8a-*.md → Delete

Если гипотеза подтвердилась — план миграции

Изменения в sync-to-openwebui.sh:

- # БЫЛО: два POST'а
- curl POST /api/v1/files/ -F "file=@$f"
- FID=...
- curl POST /api/v1/knowledge/{KID}/file/add -d "{\"file_id\":\"$FID\"}"

+ # СТАНЕТ: один POST
+ curl POST /api/v1/files/ \
+       -F "file=@$f" \
+       -F "metadata={\"knowledge_id\":\"$KID\"}"

Оценка: 30 минут переписать, 15 минут тест на 3-х файлах, 5 минут полный sync KB.

Гейт: запусти полный sync только если пилот прошёл ✅. Иначе можно потерять эмбеддинги существующей KB.


Пре-риски

  • Версия OpenWebUI матери́ет. Возможно поведение отличается между 0.6 (docs.openwebui.com рекомендует этот путь) и старее (наш docker-стек). Проверить docker exec rag-openwebui pip show open-webui для точной версии.
  • Metadata json может парсаться иначе. Если -F "metadata={\"knowledge_id\":\"..\"}" не работает — попробовать вариант в query: POST /api/v1/files/?knowledge_id=....
  • process_file может вызываться асинхронно. Скрипт ждёт 8 сек — если в логах пусто, увеличь sleep до 30 сек и повтори анализ.

Изменения после пилота

  • Обновить rag-double-embedding.md — секция "Вариант C" → «Проверено экспериментально»
  • Если подтверждено — обновить sync-to-openwebui.sh и rag-sync.md
  • Если подтверждено — переоценить объём Qdrant после следующего полного sync

Автор: агент, 08.08.2026