Текстовое полеCompatible with Milvus 3.0.x

В приложениях искусственного интеллекта для поиска векторный поиск помогает находить семантически схожие сущности, но приложению часто также требуется исходный текст, лежащий в основе каждого совпадения. LLM или агент может использовать этот текст в качестве контекста для чтения, цитирования, составления резюме или включения результата в запрос.

Milvus предоставляет скалярный тип поля « TEXT » для хранения длинного исходного текста непосредственно вместе с сущностями. Типичные значения включают отрывки, длинные документы, тексты статей, заявки и журналы. В отличие от поля « VARCHAR », которое требует фиксированного значения « max_length », поле « TEXT » не требует установки максимальной длины в байтах в схеме коллекции.

Чтобы определить поле типа « TEXT », установите для параметра « datatype » значение « DataType.TEXT ».

Для работы этой функции требуется Storage V3. Инструкции по включению и сведения о совместимости см. в разделе «Storage V3».

common.storage.useLoonFFI По умолчанию установлено значение « false », что означает, что Storage V3 по умолчанию отключен. Перед созданием коллекции, содержащей поле « TEXT », установите для этого параметра значение « true »; в противном случае Milvus отклонит схему коллекции.

schema.add_field(
    field_name="content",
    datatype=DataType.TEXT,
)

После определения поля каждая сущность может содержать строковое значение в этом поле. Значения TEXT вставляются так же, как и в другие скалярные поля, и возвращаются в результатах запросов или поиска путем указания поля в output_fields.

TEXT Поля поддерживают нулевые значения. Чтобы включить эту функцию, установите для параметра « nullable » значение « True ». Подробности см. в разделе «Поля, допускающие нулевые значения».

Ограничения

  • Поле TEXT не может быть первичным полем, ключом разбиения или кластеризующим ключом.
  • TEXT не может использоваться в качестве типа элемента поля с параметром « ARRAY », включая скалярное подполе в StructArray.
  • В Milvus 3.0.0 поля типа « TEXT » не поддерживают значения по умолчанию.
  • В Milvus 3.0.0 поля типа « TEXT » не поддерживаются во внешних коллекциях.
  • Пользователи не могут создавать скалярный индекс для поля типа « TEXT ». При использовании типа « enable_match=True » Milvus создает управляемый системой текстовый индекс для сопоставления текста. Этот внутренний индекс не является скалярным индексом, созданным пользователем.
  • Общие операторы скалярного фильтрации нельзя применять напрямую к полю TEXT. К ним относятся операторы сравнения, такие как == и !=, операторы диапазона, такие как >, >=, < и <=, а также IN, LIKE, операторы регулярных выражений (=~ и !~) и IS NULL или IS NOT NULL. Для фильтрации по проанализированным терминам определите поле с помощью enable_analyzer=True и enable_match=True, а затем используйте TEXT_MATCH или TEXT_MATCH_FUZZY. Для полнотекстового поиска с ранжированием по релевантности используйте BM25.
  • В Milvus 3.0.0 функция BM25 или MinHash, использующая поле TEXT в качестве входных данных, должна быть определена при создании коллекции. Её нельзя добавить позже с помощью add_function_field или AlterCollectionSchema, даже если существующая коллекция пуста, поскольку Milvus не может заполнить выходные данные функции на основе сохраненных значений TEXT. Чтобы добавить такую функцию в существующую коллекцию, используйте поле ввода « VARCHAR » или заново создайте коллекцию, включив данную функцию в её схему. Подробности о добавлении функции и генерируемого ею векторного поля см. в разделе «Изменение схемы коллекции».
  • Функции вложения текста также должны быть определены при создании коллекции. Milvus 3.0.0 не поддерживает их добавление во время выполнения.

Выберите TEXT или VARCHAR

TEXT и « VARCHAR » — оба хранят строковые значения, но предназначены для разных задач. Используйте « VARCHAR » для коротких, ограниченных метаданных, которые идентифицируют, классифицируют или фильтруют сущности. Используйте « TEXT » для более длинного исходного контента, который предоставляет LLM или агенту достаточно контекста для чтения, цитирования, резюмирования или построения подсказки.

АспектVARCHARTEXT
Лучше всего подходит дляКороткие метаданные, используемые для идентификации, классификации или фильтрации объектов, например title, tag, category или external_id.Более длинный исходный контент, используемый LLM или рабочими процессами агентов, например content, passage, article_body или log_message.
Параметр «Length»Требуется параметр max_length, который определяет максимальное количество байтов, которое может хранить поле. Максимальное значение составляет 65,535 байт. Если значение может превысить этот предел, используйте параметр TEXT.Не требует значения max_length, поэтому в схеме не требуется фиксированное ограничение на количество байтов для текстового значения.
Поведение храненияКаждое значение хранится в пределах настроенного для поля параметра « max_length ».Использует автоматический выбор хранилища для больших текстовых значений. Подробности см. в разделе «Как Milvus хранит большие значения TEXT».
Поддержка в качестве основного поляМожет использоваться в качестве первичного поля.Не может использоваться в качестве первичного поля.
ФильтрацияИспользуйте для коротких строковых метаданных, которые должны появляться в выражениях фильтрации, таких как category == "news" или tag in ["ai", "database"].Не поддерживает общие скалярные операторы фильтрации. Для фильтрации по проанализированным терминам используйте текстовые операторы с поддержкой сопоставления, а для полнотекстового поиска с ранжированием по релевантности — алгоритм BM25.

Подробнее о полях типа « VARCHAR » см. в разделе «Поле VarChar».

Как Milvus хранит большие значения TEXT

Разверните, чтобы узнать, как это работает

При вставке сущности строка, указанная вами для поля « TEXT », является значением TEXT. Milvus сравнивает размер этого значения с dataNode.text.inlineThreshold, который по умолчанию равен 65,536 байтам, а затем выбирает один из двух внутренних путей хранения.

Large text storage Хранение больших текстовых данных

  • Встроенное хранение: если значение TEXT меньше, чем dataNode.text.inlineThreshold, Milvus сохраняет исходное текстовое значение непосредственно в данных поля TEXT.
  • Хранение LOB: если значение поля ` TEXT ` больше или равно ` dataNode.text.inlineThreshold`, Milvus рассматривает это значение как большой объект и хранит исходный текст отдельно в хранилище объектов, например MinIO. В данных поля ` TEXT ` сохраняется внутренняя ссылка на отдельно хранящийся текст. Когда поле ` TEXT ` запрашивается в результатах запроса или поиска, Milvus использует эту ссылку для извлечения и возврата исходного текста.

Выбор хранилища является внутренним. Вы вставляете данные, запрашиваете и ищете поле ` TEXT ` одинаковым образом, независимо от того, какой путь к хранилищу использует Milvus. Для настройки порогового значения или связанного с ним поведения хранения, уплотнения и сборки мусора обратитесь к разделам «Настройки, связанные с dataNode » и «Настройки, связанные с dataCoord».

Если в вашем развертывании используется объектное хранилище, большие значения TEXT могут отображаться в виде объектов, управляемых Milvus, по таким путям, как lobs/.... Эти объекты относятся к деталям реализации и не должны перемещаться, копироваться или удаляться вручную. После удаления сущностей, удаления раздела или уплотнения данных использование объектного хранилища может уменьшиться только после того, как сборщик мусора Milvus удалит данные крупных объектов, на которые больше нет ссылок, по истечении периода безопасности.

Одним из распространённых способов использования TEXT является полнотекстовый поиск с использованием BM25. В этой схеме поле TEXT хранит исходное содержимое, а BM25 анализирует текст и генерирует разреженные векторы для ранжирования совпадений по ключевым словам. Результаты поиска могут затем возвращать совпавшее значение TEXT в качестве контекста для рабочих процессов LLM или агентов. В следующем примере показано, как использовать поле « TEXT » в качестве поля ввода для BM25. Чтобы узнать о концепциях полнотекстового поиска и параметрах запросов, см. раздел «Полнотекстовый поиск».

Шаг 1. Создание коллекции с полем TEXT

В следующем примере создаётся коллекция с полем « TEXT » для исходного контента и полем «sparse vector» для разреженных векторов, сгенерированных BM25. Функция BM25 преобразует токенизированный текст из поля « content » в разреженные векторы, хранящиеся в поле « sparse ».

Для полнотекстового поиска BM25 входное поле TEXT должно иметь значение enable_analyzer=True.

from pymilvus import DataType, Function, FunctionType, MilvusClient

client = MilvusClient(uri="http://localhost:19530")
COLLECTION_NAME = "text_bm25_collection"

if client.has_collection(COLLECTION_NAME):
    client.drop_collection(COLLECTION_NAME)

schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(
    field_name="content",
    datatype=DataType.TEXT,
    enable_analyzer=True,
)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)

bm25_function = Function(
    name="content_bm25",
    input_field_names=["content"],
    output_field_names=["sparse"],
    function_type=FunctionType.BM25,
)
schema.add_function(bm25_function)

Шаг 2: Создание индекса разреженных векторов

Создайте индекс для поля разреженных векторов, сгенерированного функцией BM25. Тип метрики должен быть установлен в значение BM25.

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="sparse",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="BM25",
    params={
        "inverted_index_algo": "DAAT_MAXSCORE",
        "bm25_k1": 1.2,
        "bm25_b": 0.75,
    },
)

client.create_collection(
    collection_name=COLLECTION_NAME,
    schema=schema,
    index_params=index_params,
)

Шаг 3: Вставка данных типа TEXT

Вставьте текст непосредственно в поле « TEXT ». Не указывайте значения для поля « sparse ». Milvus генерирует разреженные векторы внутренне, применяя функцию BM25 к « content ».

data = [
    {
        "id": 1,
        "content": "Milvus stores vector embeddings and scalar fields in collections. It supports vector search, full text search, and metadata filtering for retrieval applications.",
    },
    {
        "id": 2,
        "content": "Long documents are often split into passages before embedding. Store each passage in a TEXT field so search results can return the source text.",
    },
    {
        "id": 3,
        "content": "Operational logs and support tickets often contain long natural-language text. TEXT fields can store these values without a fixed max_length setting.",
    },
]

client.insert(collection_name=COLLECTION_NAME, data=data)
client.load_collection(collection_name=COLLECTION_NAME)

Используйте исходный текст запроса в качестве данных для поиска и выполните поиск по полю разреженных векторов. Milvus преобразует текст запроса в разреженный вектор, ранжирует совпадения с помощью BM25 и возвращает запрошенное поле « TEXT » в поле « output_fields ».

results = client.search(
    collection_name=COLLECTION_NAME,
    data=["how does Milvus store source text for retrieval"],
    anns_field="sparse",
    limit=2,
    output_fields=["content"],
)

Шаг 5: Чтение возвращённых значений TEXT

Каждый результат поиска содержит оценку по алгоритму BM25 и исходное значение из поля « TEXT ».

for hit in results[0]:
    print(f"id: {hit['id']}, score: {hit['distance']}")
    print(hit["entity"]["content"])

Дополнительную информацию о функциях BM25, индексах разреженных векторов и синтаксисе запросов для полнотекстового поиска см. в разделе «Полнотекстовый поиск».