All Products
Search
Document Center

Vector Retrieval Service for Milvus:Klasifikasi

Last Updated:Aug 04, 2026

AI_CLASSIFY memilih label yang paling sesuai untuk teks, gambar, atau video dari sekumpulan label kandidat. Fitur ini dapat digunakan untuk routing tiket, moderasi konten, atau penandaan kategori produk. Saat dikonfigurasi sebagai Collection Function, AI_CLASSIFY secara otomatis mengisi bidang klasifikasi selama penulisan data.

Format perintah

Anda dapat memanggil REST API untuk mengklasifikasikan konten secara langsung atau mengonfigurasi Collection Function agar data diklasifikasikan secara otomatis selama penulisan. REST API menyediakan dua endpoint:

  • /v2/vectordb/ai/text_transform — Sertakan "task": "ai_classify" dalam badan permintaan.

  • /v2/vectordb/ai/classify — Bidang task tidak diperlukan.

REST API

REST API

Kirim permintaan berikut untuk mengklasifikasikan konten input:

POST /v2/vectordb/ai/text_transform
Content-Type: application/json

{
  "model_name": "<model name>",
  "task": "ai_classify",
  "texts": ["<text or media URL>"],
  "params": {"labels": ["<label1>", "<label2>"]}
}

Python

Python

Definisikan Collection Function untuk mengklasifikasikan konten secara otomatis selama penulisan data:

schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("content", DataType.VARCHAR, max_length=4096)
schema.add_field("category", DataType.VARCHAR, max_length=64)
schema.add_field("dummy_vector", DataType.FLOAT_VECTOR, dim=2)
schema.add_function(
    Function(
        name="classify_content",
        function_type=texttransform_function_type(),
        input_field_names=["content"],
        output_field_names=["category"],
        params={
            "provider": "aliyun_milvus",
            "model_name": "<model name>",
            "task": "ai_classify",
            "labels": "accounts,inquiries,faults,billing",
            "prompt": "Classify by the topic of the customer's question.",
            "temperature": "0",
            "max_concurrency": "2",
        },
    )
)

Parameter

ParameterDeskripsi
model_nameWajib diisi. Nama model. Untuk gambar dan video, pilih model multimodal yang telah dikonfigurasi (misalnya, qwen3.7-plus).
textsWajib diisi untuk REST API. Konten yang akan diklasifikasikan, atau URL gambar/video.
labelsWajib diisi. Label kandidat, disediakan sebagai array string JSON atau string yang dipisahkan koma. Didukung 2 hingga 20 label.
promptOpsional. Aturan routing tambahan, maksimal 5.000 karakter. ${...} tidak didukung.
media_typeOpsional. Atur ke image atau video untuk menunjukkan bahwa input berupa URL media.
temperature / max_concurrency / timeout_secOpsional. Mengontrol stabilitas model, konkurensi, dan timeout. Klasifikasi video memakan waktu lama. Atur timeout_sec ke 300 atau lebih tinggi untuk menghindari timeout.
provider / taskWajib diisi hanya untuk Collection Function. Nilai tetap: aliyun_milvus dan ai_classify.

Nilai kembalian

data.output.outputs mengembalikan label teks dalam urutan yang sama dengan input, berisi hanya label itu sendiri. Skema tersebut menulis label ke bidang teks target.

Contoh 1: Auto-routing tiket pelanggan (teks)

Sistem layanan pelanggan perlu mengarahkan tiket gangguan dan pertanyaan ke antrian yang berbeda. Saat memanggil endpoint terpadu /v2/vectordb/ai/text_transform, tambahkan parameter task di tingkat teratas permintaan.

REST API

REST API

#!/usr/bin/env bash
set -euo pipefail

MILVUS_REST_BASE_URL="http://c-xxxx.milvus.aliyuncs.com:19530"
MILVUS_AUTH_TOKEN="<yourUsername>:<yourPassword>"

post_json() {
  local path="$1"
  local body="$2"
  curl -X POST \
    "$MILVUS_REST_BASE_URL$path" \
    -H "Authorization: Bearer $MILVUS_AUTH_TOKEN" \
    -H "Content-Type: application/json" \
    -d "$body"
}

BODY=$(cat <<'JSON'
{
  "model_name": "qwen3.7-max",
  "task": "ai_classify",
  "texts": [
    "Cannot log in to the Milvus console; verification code error keeps appearing.",
    "How do I enable public network access for a Serverless Milvus instance?"
  ],
  "params": {
    "labels": ["accounts", "inquiries", "faults", "billing"],
    "prompt": "Classify by the topic of the customer's question.",
    "temperature": 0,
    "max_concurrency": 2
  }
}
JSON
)
RESPONSE_BODY="$(post_json "/v2/vectordb/ai/text_transform" "$BODY")"
if command -v jq >/dev/null 2>&1; then
  echo "$RESPONSE_BODY" | jq .
  [ "$(echo "$RESPONSE_BODY" | jq -r '.code // -1')" = "0" ] || exit 1
else
  echo "$RESPONSE_BODY"
fi

Python

Python

from __future__ import annotations

from typing import Any

from pymilvus import DataType, Function, FunctionType, MilvusClient

MILVUS_URI = "http://c-xxxx.milvus.aliyuncs.com:19530"
MILVUS_TOKEN = "<yourUsername>:<yourPassword>"

DUMMY_VECTOR_DIM = 2
TEXTTRANSFORM_FUNCTION_TYPE = 9

def texttransform_function_type() -> Any:
    for type_name in ("TEXTTRANSFORM", "TEXT_TRANSFORM", "TextTransform"):
        function_type = getattr(FunctionType, type_name, None)
        if function_type is not None:
            return function_type
    # Alibaba Cloud Milvus provides TEXTTRANSFORM as a managed extension (function type value 9);
    # some pymilvus versions do not include this enum member, while Function(...) validates through FunctionType(...).
    existing = getattr(FunctionType, "_value2member_map_", {}).get(TEXTTRANSFORM_FUNCTION_TYPE)
    if existing is not None:
        return existing
    extension = int.__new__(FunctionType, TEXTTRANSFORM_FUNCTION_TYPE)
    extension._name_ = "TEXTTRANSFORM"
    extension._value_ = TEXTTRANSFORM_FUNCTION_TYPE
    FunctionType._value2member_map_[TEXTTRANSFORM_FUNCTION_TYPE] = extension
    FunctionType._member_map_["TEXTTRANSFORM"] = extension
    return extension

def add_id(schema: Any) -> None:
    schema.add_field("id", DataType.INT64, is_primary=True)

def add_dummy_vector(schema: Any) -> None:
    schema.add_field("dummy_vector", DataType.FLOAT_VECTOR, dim=DUMMY_VECTOR_DIM)

def run_texttransform_example(*, client, collection_name, input_fields, output_field, function_name, function_params, rows) -> None:
    if client.has_collection(collection_name):
        client.drop_collection(collection_name)
    schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)
    add_id(schema)
    for name, data_type, max_length in input_fields:
        field_params = {"max_length": max_length} if max_length is not None else {}
        schema.add_field(name, data_type, **field_params)
    output_name, output_data_type, output_max_length = output_field
    output_params = {"max_length": output_max_length} if output_max_length is not None else {}
    schema.add_field(output_name, output_data_type, **output_params)
    add_dummy_vector(schema)
    schema.add_function(
        Function(
            name=function_name,
            function_type=texttransform_function_type(),
            input_field_names=[name for name, _, _ in input_fields],
            output_field_names=[output_name],
            params=function_params,
        )
    )
    index_params = client.prepare_index_params()
    index_params.add_index(field_name="dummy_vector", index_type="AUTOINDEX", metric_type="COSINE")
    client.create_collection(collection_name=collection_name, schema=schema, index_params=index_params)
    client.insert(collection_name, rows)
    client.flush(collection_name)
    fields = [name for name, _, _ in input_fields] + [output_name]
    for row in client.query(collection_name, filter="", output_fields=fields, limit=len(rows)):
        print(row)

client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)

run_texttransform_example(
    client=client,
    collection_name="simple_ai_classify",
    input_fields=[("content", DataType.VARCHAR, 4096)],
    output_field=("category", DataType.VARCHAR, 64),
    function_name="simple_ai_classify_fn",
    function_params={"provider": "aliyun_milvus", "model_name": "qwen3.7-max", "task": "ai_classify", "labels": "accounts,inquiries,faults,billing", "prompt": "Classify by the topic of the customer's question.", "temperature": "0", "max_concurrency": "2"},
    rows=[{"content": "Cannot log in to the Milvus console; verification code error keeps appearing.", "dummy_vector": [0.1, 0.2]}, {"content": "How do I enable public network access for a Serverless Milvus instance?", "dummy_vector": [0.1, 0.2]}],
)

Hasil yang diharapkan: Setiap input REST mengembalikan satu label kandidat (dalam pengujian: accounts dan inquiries). Bidang category dalam catatan Python menyimpan label kandidat yang sesuai. Masalah login dan kode verifikasi diarahkan ke accounts atau faults, tergantung pada penilaian model.

Contoh 2: Mengklasifikasikan gambar produk (gambar)

Sistem moderasi konten perlu secara otomatis menetapkan gambar ke kategori pakaian, makanan, pemandangan, atau hewan.

REST API

REST API

#!/usr/bin/env bash
set -euo pipefail

MILVUS_REST_BASE_URL="http://c-xxxx.milvus.aliyuncs.com:19530"
MILVUS_AUTH_TOKEN="<yourUsername>:<yourPassword>"

post_json() {
  local path="$1"
  local body="$2"
  curl -X POST \
    "$MILVUS_REST_BASE_URL$path" \
    -H "Authorization: Bearer $MILVUS_AUTH_TOKEN" \
    -H "Content-Type: application/json" \
    -d "$body"
}

BODY=$(cat <<JSON
{"model_name":"qwen3.7-plus","texts":["https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260415/hynnff/wan-video-edit-clothes.webp"],"params":{"media_type":"image","labels":["clothing","food","landscape","animal"],"temperature":0}}
JSON
)
RESPONSE_BODY="$(post_json "/v2/vectordb/ai/classify" "$BODY")"
if command -v jq >/dev/null 2>&1; then
  echo "$RESPONSE_BODY" | jq .
  [ "$(echo "$RESPONSE_BODY" | jq -r '.code // -1')" = "0" ] || exit 1
else
  echo "$RESPONSE_BODY"
fi

Python

Python

from __future__ import annotations

from typing import Any

from pymilvus import DataType, Function, FunctionType, MilvusClient

MILVUS_URI = "http://c-xxxx.milvus.aliyuncs.com:19530"
MILVUS_TOKEN = "<yourUsername>:<yourPassword>"

DUMMY_VECTOR_DIM = 2
TEXTTRANSFORM_FUNCTION_TYPE = 9

def texttransform_function_type() -> Any:
    for type_name in ("TEXTTRANSFORM", "TEXT_TRANSFORM", "TextTransform"):
        function_type = getattr(FunctionType, type_name, None)
        if function_type is not None:
            return function_type
    # Alibaba Cloud Milvus provides TEXTTRANSFORM as a managed extension (function type value 9);
    # some pymilvus versions do not include this enum member, while Function(...) validates through FunctionType(...).
    existing = getattr(FunctionType, "_value2member_map_", {}).get(TEXTTRANSFORM_FUNCTION_TYPE)
    if existing is not None:
        return existing
    extension = int.__new__(FunctionType, TEXTTRANSFORM_FUNCTION_TYPE)
    extension._name_ = "TEXTTRANSFORM"
    extension._value_ = TEXTTRANSFORM_FUNCTION_TYPE
    FunctionType._value2member_map_[TEXTTRANSFORM_FUNCTION_TYPE] = extension
    FunctionType._member_map_["TEXTTRANSFORM"] = extension
    return extension

def add_id(schema: Any) -> None:
    schema.add_field("id", DataType.INT64, is_primary=True)

def add_dummy_vector(schema: Any) -> None:
    schema.add_field("dummy_vector", DataType.FLOAT_VECTOR, dim=DUMMY_VECTOR_DIM)

def run_texttransform_example(*, client, collection_name, input_fields, output_field, function_name, function_params, rows) -> None:
    if client.has_collection(collection_name):
        client.drop_collection(collection_name)
    schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)
    add_id(schema)
    for name, data_type, max_length in input_fields:
        field_params = {"max_length": max_length} if max_length is not None else {}
        schema.add_field(name, data_type, **field_params)
    output_name, output_data_type, output_max_length = output_field
    output_params = {"max_length": output_max_length} if output_max_length is not None else {}
    schema.add_field(output_name, output_data_type, **output_params)
    add_dummy_vector(schema)
    schema.add_function(
        Function(
            name=function_name,
            function_type=texttransform_function_type(),
            input_field_names=[name for name, _, _ in input_fields],
            output_field_names=[output_name],
            params=function_params,
        )
    )
    index_params = client.prepare_index_params()
    index_params.add_index(field_name="dummy_vector", index_type="AUTOINDEX", metric_type="COSINE")
    client.create_collection(collection_name=collection_name, schema=schema, index_params=index_params)
    client.insert(collection_name, rows)
    client.flush(collection_name)
    fields = [name for name, _, _ in input_fields] + [output_name]
    for row in client.query(collection_name, filter="", output_fields=fields, limit=len(rows)):
        print(row)

client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)

run_texttransform_example(
    client=client,
    collection_name="simple_ai_classify_image",
    input_fields=[("image_url", DataType.VARCHAR, 4096)],
    output_field=("category", DataType.VARCHAR, 64),
    function_name="simple_ai_classify_image_fn",
    function_params={"provider": "aliyun_milvus", "model_name": "qwen3.7-plus", "task": "ai_classify", "media_type": "image", "labels": "clothing,food,landscape,animal", "temperature": "0"},
    rows=[{"image_url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260415/hynnff/wan-video-edit-clothes.webp", "dummy_vector": [0.1, 0.2]}],
)

Hasil yang diharapkan: category mengembalikan salah satu dari clothing, food, landscape, atau animal (dalam pengujian: clothing).

Contoh 3: Mengklasifikasikan materi video (video)

Tim operasi video perlu menyaring materi berdasarkan kategori fashion, olahraga, travel, dan animasi. Karena inferensi video memerlukan waktu lama, atur timeout_sec ke 300 atau lebih tinggi.

REST API

REST API

#!/usr/bin/env bash
set -euo pipefail

MILVUS_REST_BASE_URL="http://c-xxxx.milvus.aliyuncs.com:19530"
MILVUS_AUTH_TOKEN="<yourUsername>:<yourPassword>"

post_json() {
  local path="$1"
  local body="$2"
  curl -X POST \
    "$MILVUS_REST_BASE_URL$path" \
    -H "Authorization: Bearer $MILVUS_AUTH_TOKEN" \
    -H "Content-Type: application/json" \
    -d "$body"
}

BODY=$(cat <<JSON
{"model_name":"qwen3.7-plus","texts":["https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260409/dozxak/Wan_Video_Edit_33_1.mp4"],"params":{"media_type":"video","labels":["fashion","sports","travel","animation"],"temperature":0,"timeout_sec":300}}
JSON
)
RESPONSE_BODY="$(post_json "/v2/vectordb/ai/classify" "$BODY")"
if command -v jq >/dev/null 2>&1; then
  echo "$RESPONSE_BODY" | jq .
  [ "$(echo "$RESPONSE_BODY" | jq -r '.code // -1')" = "0" ] || exit 1
else
  echo "$RESPONSE_BODY"
fi

Python

Python

from __future__ import annotations

from typing import Any

from pymilvus import DataType, Function, FunctionType, MilvusClient

MILVUS_URI = "http://c-xxxx.milvus.aliyuncs.com:19530"
MILVUS_TOKEN = "<yourUsername>:<yourPassword>"

DUMMY_VECTOR_DIM = 2
TEXTTRANSFORM_FUNCTION_TYPE = 9

def texttransform_function_type() -> Any:
    for type_name in ("TEXTTRANSFORM", "TEXT_TRANSFORM", "TextTransform"):
        function_type = getattr(FunctionType, type_name, None)
        if function_type is not None:
            return function_type
    # Alibaba Cloud Milvus provides TEXTTRANSFORM as a managed extension (function type value 9);
    # some pymilvus versions do not include this enum member, while Function(...) validates through FunctionType(...).
    existing = getattr(FunctionType, "_value2member_map_", {}).get(TEXTTRANSFORM_FUNCTION_TYPE)
    if existing is not None:
        return existing
    extension = int.__new__(FunctionType, TEXTTRANSFORM_FUNCTION_TYPE)
    extension._name_ = "TEXTTRANSFORM"
    extension._value_ = TEXTTRANSFORM_FUNCTION_TYPE
    FunctionType._value2member_map_[TEXTTRANSFORM_FUNCTION_TYPE] = extension
    FunctionType._member_map_["TEXTTRANSFORM"] = extension
    return extension

def add_id(schema: Any) -> None:
    schema.add_field("id", DataType.INT64, is_primary=True)

def add_dummy_vector(schema: Any) -> None:
    schema.add_field("dummy_vector", DataType.FLOAT_VECTOR, dim=DUMMY_VECTOR_DIM)

def run_texttransform_example(*, client, collection_name, input_fields, output_field, function_name, function_params, rows) -> None:
    if client.has_collection(collection_name):
        client.drop_collection(collection_name)
    schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)
    add_id(schema)
    for name, data_type, max_length in input_fields:
        field_params = {"max_length": max_length} if max_length is not None else {}
        schema.add_field(name, data_type, **field_params)
    output_name, output_data_type, output_max_length = output_field
    output_params = {"max_length": output_max_length} if output_max_length is not None else {}
    schema.add_field(output_name, output_data_type, **output_params)
    add_dummy_vector(schema)
    schema.add_function(
        Function(
            name=function_name,
            function_type=texttransform_function_type(),
            input_field_names=[name for name, _, _ in input_fields],
            output_field_names=[output_name],
            params=function_params,
        )
    )
    index_params = client.prepare_index_params()
    index_params.add_index(field_name="dummy_vector", index_type="AUTOINDEX", metric_type="COSINE")
    client.create_collection(collection_name=collection_name, schema=schema, index_params=index_params)
    client.insert(collection_name, rows)
    client.flush(collection_name)
    fields = [name for name, _, _ in input_fields] + [output_name]
    for row in client.query(collection_name, filter="", output_fields=fields, limit=len(rows)):
        print(row)

client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)

run_texttransform_example(
    client=client,
    collection_name="simple_ai_classify_video",
    input_fields=[("video_url", DataType.VARCHAR, 4096)],
    output_field=("category", DataType.VARCHAR, 64),
    function_name="simple_ai_classify_video_fn",
    function_params={"provider": "aliyun_milvus", "model_name": "qwen3.7-plus", "task": "ai_classify", "media_type": "video", "labels": "fashion,sports,travel,animation", "temperature": "0", "timeout_sec": "300"},
    rows=[{"video_url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260409/dozxak/Wan_Video_Edit_33_1.mp4", "dummy_vector": [0.1, 0.2]}],
)

Hasil yang diharapkan: category mengembalikan salah satu dari fashion, sports, travel, atau animation (dalam pengujian: animation). Jika respons {"code":10001,"message":"request timeout"} dikembalikan, tingkatkan nilai timeout_sec.