0Pricing
AI Agents · Урок

Фильтрация метаданных для гибридного поиска

Объединяйте векторное сходство со структурированными фильтрами (дата, автор, тег), чтобы получать точные результаты с учётом контекста.

«Фильтрация метаданных для гибридного поиска» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Pinecone, Weaviate, Qdrant: сравнение
  2. Фильтрация метаданных для гибридного поиска
  3. Обновление и удаление векторов
  4. Выбор метрик расстояния (cosine, L2, dot)
← Назад к AI Agents