Фильтрация метаданных для гибридного поиска
Объединяйте векторное сходство со структурированными фильтрами (дата, автор, тег), чтобы получать точные результаты с учётом контекста.
«Фильтрация метаданных для гибридного поиска» — бесплатный урок AI Agents на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Зачем нужна фильтрация?
Чистый векторный поиск возвращает K наиболее похожих фрагментов — даже если они относятся не к тому арендатору, написаны не на том языке или взяты не из того документа.
Фильтры метаданных ограничивают область поиска релевантными подмножествами, повышая точность AND полноту.
Хранение метаданных
При загрузке добавляйте к каждому фрагменту словарь метаданных:
metadata = {
'tenant_id': 'acme',
'language': 'en',
'source': 'help-docs',
'updated_at': '2024-08-12',
'tags': ['shipping', 'returns']
}
for k, v in metadata.items():
print(f"{k}: {v}")
Filtering in Pinecone
results = index.query(
vector=query_vec,
top_k=5,
filter={
'tenant_id': 'acme',
'language': 'en'
}
)Фильтры по диапазону
Большинство векторных БД также поддерживает фильтры по диапазону:
filter = {
'updated_at': {'$gte': '2024-01-01'},
'score': {'$gt': 0.5}
}
print(filter)
In and Not-In
filter = {
'tags': {'$in': ['shipping', 'returns']},
'archived': {'$ne': True}
}
print(filter)
Фильтрация в Qdrant
Qdrant располагает богатым языком фильтрации:
from qdrant_client.models import Filter, FieldCondition, MatchValue
filter = Filter(must=[
FieldCondition(key='tenant_id', match=MatchValue(value='acme')),
FieldCondition(key='language', match=MatchValue(value='en'))
])
results = client.search(
collection_name='docs',
query_vector=query_vec,
query_filter=filter,
limit=5
)Предварительная фильтрация и постфильтрация
Две стратегии:
- Предварительная фильтрация — применить фильтр THEN выполнить поиск (корректно, но без индексов метаданных может быть медленно)
- Постфильтрация — выполнить поиск, затем отбросить несовпадающие результаты (быстро, но можно получить нулевой результат)
В промышленных системах выполняют предварительную фильтрацию при наличии подходящих индексов метаданных.
Гибридный поиск: векторы + ключевые слова
Объединяйте семантический поиск с классическим поиском по ключевым словам BM25. Выполните оба поиска и объедините оценки (объединение взаимных рангов — стандартный подход):
def rrf(vec_results, bm25_results, k=60):
scores = defaultdict(float)
for rank, doc in enumerate(vec_results):
scores[doc.id] += 1 / (k + rank)
for rank, doc in enumerate(bm25_results):
scores[doc.id] += 1 / (k + rank)
return sorted(scores.items(), key=lambda x: -x[1])Мультитенантность
В SaaS каждый запрос должен фильтроваться по идентификатору арендатора. Жёстко задайте это в своей оболочке извлечения, чтобы об этом нельзя было забыть:
def search(query, tenant_id, top_k=5):
return index.query(
vector=embed(query),
top_k=top_k,
filter={'tenant_id': tenant_id}
)Управление доступом с помощью метаданных
Храните разрешения пользователей и ролей в метаданных:
metadata = {
'visibility': 'public', # or 'internal', 'restricted'
'department': 'engineering',
'allowed_roles': ['engineer', 'manager']
}
# At query time:
filter = {'allowed_roles': {'$contains': current_user_role}}Повышение приоритета новых документов
Чтобы отдавать предпочтение новым документам, извлеките больше кандидатов, затем пересчитайте их оценки с учётом новизны:
candidates = index.query(vector=query_vec, top_k=50)
scored = [
(c.score * recency_factor(c.metadata['updated_at']), c)
for c in candidates
]
scored.sort(reverse=True)
final = scored[:5]Следите за кардинальностью метаданных
Метаданные с высокой кардинальностью (миллионы уникальных значений) приводят к огромным индексам. По возможности предварительно агрегируйте данные — например, храните год и месяц вместо полной временной метки для фильтрации по времени.
Обязательный фильтр
Какой фильтр должен ALWAYS включать каждый мультитенантный агент?
Итоги
Фильтры метаданных ограничивают область поиска. Для лучших результатов объединяйте их с гибридным поиском (векторным + BM25). Мультитенантность и управление доступом зависят от этого.
Часто задаваемые вопросы
Урок «Фильтрация метаданных для гибридного поиска» бесплатный?
Да — полный текст урока «Фильтрация метаданных для гибридного поиска» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Фильтрация метаданных для гибридного поиска»?
Объединяйте векторное сходство со структурированными фильтрами (дата, автор, тег), чтобы получать точные результаты с учётом контекста. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Фильтрация метаданных для гибридного поиска»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Pinecone, Weaviate, Qdrant: сравнение
- Фильтрация метаданных для гибридного поиска
- Обновление и удаление векторов
- Выбор метрик расстояния (cosine, L2, dot)