Гайд · TNWS AI
Как скрыть служебные метаданные документа от LLM в LlamaIndex
Отдельные настройки metadata для генератора и embedding-модели с проверкой MetadataMode.LLM и EMBED.
Задача и применимость
Поисковый запрос: «как исключить metadata из LLM LlamaIndex excluded_llm_metadata_keys». Факты и синтаксис сверены с официальной документацией LlamaIndex Framework для Python 19 сентября 2026 года. Пример предназначен для актуального Python-пакета llama-index и указанных в коде интеграций; доступность конкретной модели и конфигурация её провайдера зависят от среды запуска. Если код обращается к embeddings или LLM, ключ задаётся через серверное окружение и здесь не приводится. Точный релиз локально не установлен, поэтому перед рабочим запуском фиксируйте номер установленной версии и повторите тест на ней.
По умолчанию метаданные LlamaIndex попадают в текст, доступный и модели embeddings, и LLM. excluded_llm_metadata_keys исключает поля для генератора, excluded_embed_metadata_keys — для embeddings. Итоговый контент для разных целей можно проверить через get_content(metadata_mode=MetadataMode.LLM или MetadataMode.EMBED). Не путайте это с удалением metadata из объекта.
Нумерованный порядок работы
- Разделите метаданные на публичные поля, служебные идентификаторы и секреты; последние вообще не помещайте в Document.
- Создайте тестовый Document с file_name и category, укажите excluded_llm_metadata_keys для file_name.
- Напечатайте get_content с MetadataMode.LLM и проверьте отсутствие file_name при сохранении фактического текста.
- Отдельно решите, должен ли file_name влиять на embedding; при необходимости исключите и там.
- Повторите тест на node после индексации и проверьте, что UI не выдаёт скрытый путь как ссылку.
Готовый шаблон Python
from llama_index.core import Document
from llama_index.core.schema import MetadataMode
doc = Document(text="Правило возврата: 14 дней.",
metadata={"file_name": "internal-r7.txt", "category": "returns"})
doc.excluded_llm_metadata_keys = ["file_name"]
llm_text = doc.get_content(metadata_mode=MetadataMode.LLM)
embed_text = doc.get_content(metadata_mode=MetadataMode.EMBED)
assert "internal-r7.txt" not in llm_text
print(llm_text, embed_text)
Код ниже в статье предназначен для тестовых источников без персональных сведений. Вызовы SDK не выполнялись в данном окружении с реальной моделью; синтаксис Python проверен отдельно. Не переносите вывод демонстрационного эксперимента на любой корпус и любого провайдера без повторной проверки.
Пример входа и ожидаемого результата
Вход: Document с текстом о сроке 14 дней и служебным file_name=internal-r7.txt. Ожидается, что LLM-представление не содержит file_name, а embedding-представление может его содержать, пока вы не добавили excluded_embed_metadata_keys. Это проверка подготовки контекста, не доказательство безопасности всей системы хранения.
Сохраните входные файлы, идентификаторы документов и ожидаемое утверждение в отдельном проверочном наборе. При неуспехе выделяйте слой ошибки: чтение источника, преобразование в nodes, получение embedding, поиск, синтез ответа или UI. Правильная форма ответа ещё не гарантирует правильного происхождения сведений.
Диагностика и границы решения
Исключение метаданных из промпта нельзя использовать как способ хранения секретов. API-ключ, личный адрес или токен, включённые в Document, остаются в объекте и могут попасть в логи, storage или ответы другого компонента. Для таких данных требуется удаление до создания документа и отдельный контроль доступа. Служебный file_name может помогать в поиске, но путь на сервере почти никогда не следует показывать как URL пользователю. Сравнивайте LLM- и EMBED-представления до вызова внешней модели: без этого можно неожиданно передать ей внутреннее название файла. Исключение file_name из embeddings изменяет векторное представление, поэтому после изменения параметров переиндексируйте данные и измерьте retrieval. Если категория используется для фильтрации, её исключение из текста embeddings не обязательно удаляет поле metadata для структурного фильтра; тестируйте оба механизма отдельно.
Дополнительный проверочный сценарий
Создайте файл с нейтральным текстом и служебным названием, содержащее слово «секретный»; спросите, попадает ли это слово в LLM-представление. Затем добавьте клиентский tenant ID в metadata и убедитесь, что фильтр доступа не зависит от того, видит ли ID генератор. Обратите внимание на узлы после разбиения: поля наследуются, поэтому настройка исключений должна быть проверена на том уровне, который реально передаётся в prompt. Если metadata выводится в citations или трассировке, тест одной лишь строки MetadataMode.LLM не гарантирует отсутствия утечки. Сформируйте матрицу каналов: промпт, embeddings, storage, UI, логи и экспорт. Для каждого пометьте допустимые поля и проверьте отдельно.
Критерии проверки
- file_name отсутствует в LLM-тексте.
- Содержимое правила осталось доступным.
- Секретов нет в самом Document и сторонних каналах.
Помимо положительного теста проводите отрицательный: отсутствующий факт, чужой документ, старая редакция либо несовместимая модель — в зависимости от задачи. Если одна проверка не проходит, не объявляйте настройку готовой. При работе с чужими источниками доступ к исходнику и цитате должен проверяться отдельно от поисковой релевантности.
Типичные ошибки и что не делать
- Не хранить секреты в metadata под видом исключения.
- Не путать EMBED и LLM режимы.
- Не считать отсутствие поля в prompt удалением из индекса.
Не передавайте ключи, личные документы и приватные пути в опубликованный пример или сторонний trace без оценки прав доступа. Не исправляйте отсутствие нужного текста одним только промптом: генератор не восстановит источник, который не загрузили или не нашли. При смене модели либо backend повторяйте тест на зафиксированном наборе вопросов.
FAQ
Как проверить текст для LLM?
get_content с MetadataMode.LLM.
Как исключить поле из embeddings?
Установить excluded_embed_metadata_keys.
Исчезнет ли metadata из Document?
Нет, меняется только включение поля в соответствующий текст.
Официальные источники
Частые вопросы
Как проверить текст для LLM?
get_content с MetadataMode.LLM.
Как исключить поле из embeddings?
Установить excluded_embed_metadata_keys.
Исчезнет ли metadata из Document?
Нет, меняется только включение поля в соответствующий текст.
Читайте также
Как измерить hit rate и MRR поиска в LlamaIndex RetrieverEvaluator
Размеченный вопрос, expected_ids и оценка позиции релевантного узла до тестирования ответов генератора.
Как ограничить размер пакета при индексации в LlamaIndex VectorStoreIndex
insert_batch_size при from_documents: контролируем память и задержки загрузки, не путая пакет с размером чанка.
Как обновить одну редакцию документа в LlamaIndex без смешивания версий
Стабильный id_, update_ref_doc и контроль старого и нового правила в поисковой выдаче.
Комментарии
Пока тихо. Скажите первое слово