全部产品
Search
文档中心

Alibaba Cloud Model Studio:structured output

更新时间:Dec 14, 2025

Saat melakukan tugas ekstraksi informasi atau generasi data terstruktur, model bahasa besar (LLM) mungkin mengembalikan teks tambahan, seperti ```json, yang dapat menyebabkan kegagalan pada proses parsing downstream. Anda dapat mengaktifkan structured output untuk memastikan LLM mengembalikan string JSON standar. Dengan mode JSON Schema, Anda juga dapat mengontrol secara tepat struktur dan tipe output, sehingga menghilangkan kebutuhan validasi atau retry tambahan.

Cara menggunakan

Structured output mendukung dua mode: JSON Object dan JSON Schema.

  • Mode JSON Object: Memastikan output berupa string JSON standar, tetapi tidak menjamin struktur tertentu. Untuk menggunakan mode ini:

    1. Atur parameter response_format: Di dalam badan permintaan, atur parameter response_format menjadi {"type": "json_object"}.

    2. Sertakan kata kunci JSON dalam prompt: Pesan sistem atau pesan pengguna harus mengandung kata kunci "JSON" (tidak case-sensitive). Jika tidak, model akan mengembalikan error berikut: 'messages' must contain the word 'json' in some form, to use 'response_format' of type 'json_object'.

  • Mode JSON Schema: Memastikan output sesuai dengan struktur yang ditentukan. Untuk menggunakan mode ini, atur parameter response_format menjadi {"type": "json_schema", "json_schema": {...}, "strict": true}.

    Prompt tidak perlu menyertakan kata kunci JSON.

Perbandingan fitur:

Fitur

Mode Objek JSON

Mode JSON Schema

Menghasilkan JSON yang valid

Ya

Ya

Mengikuti skema secara ketat

Tidak

Ya

Model yang didukung

Sebagian besar model Qwen

Hanya beberapa model seri qwen-plus

response_format parameter

{"type": "json_object"}

{"type": "json_schema", "json_schema": {...}, "strict": true}

Persyaratan prompt

Harus menyertakan "JSON"

Instruksi eksplisit direkomendasikan

Skenario

Output JSON fleksibel

Validasi struktur presisi

Model yang didukung

JSON Object

  • Model generasi teks

    • Seri Qwen-Max: qwen3-max, qwen3-max-2025-09-23, qwen3-max-preview (mode non-thinking), qwen-max, qwen-max-latest, qwen-max-2025-01-25, dan model snapshot versi selanjutnya

    • Seri Qwen-Plus (mode non-thinking): qwen-plus, qwen-plus-latest, qwen-plus-2025-01-25, dan model snapshot versi selanjutnya

    • Seri Qwen-Flash (mode non-thinking): qwen-flash, qwen-flash-2025-07-28, dan model snapshot versi selanjutnya

    • Seri Qwen-Turbo (mode non-thinking): qwen-turbo, qwen-turbo-latest, qwen-turbo-2024-11-01, dan model snapshot versi selanjutnya

    • Seri Qwen-Coder: qwen3-coder-plus, qwen3-coder-plus-2025-07-22, qwen3-coder-flash, dan qwen3-coder-flash-2025-07-28

    • Seri Qwen-Long: qwen-long-latest, dan qwen-long-2025-01-25

  • Model generasi teks open source

    • Qwen3 (mode non-thinking)

    • Qwen3-Coder

    • Model teks seri Qwen2.5 (tidak termasuk model math dan coder)

  • Model multimodal

    • Seri Qwen3-VL-Plus (mode non-thinking): qwen3-vl-plus, qwen3-vl-plus-2025-09-23, dan model snapshot versi selanjutnya

    • Seri Qwen3-VL-Flash (mode non-thinking): qwen3-vl-flash, qwen3-vl-flash-2025-10-15, dan model snapshot versi selanjutnya

    • Seri QwenVL-Max: qwen-vl-max (tidak termasuk versi latest dan snapshot)

    • Seri QwenVL-Plus: qwen-vl-plus (tidak termasuk versi latest dan snapshot)

  • Model multimodal open source

    • Qwen3-VL (mode non-thinking)

Catatan

Model dalam mode thinking saat ini tidak mendukung structured output.

JSON Schema

Fitur ini didukung oleh model qwen-plus, qwen-plus-latest, qwen-plus-2025-07-28, dan model snapshot versi selanjutnya di wilayah China (Beijing).

Dukungan untuk lebih banyak model sedang diperluas secara bertahap.

Untuk informasi lebih lanjut tentang context windows, harga, dan versi snapshot, lihat Daftar model.

Memulai

Bagian ini menggunakan contoh sederhana ekstraksi informasi dari profil pribadi untuk menunjukkan cara menggunakan structured output.

Anda harus mendapatkan Kunci API dan mengatur Kunci API sebagai Variabel lingkungan. Jika Anda menggunakan OpenAI SDK atau DashScope SDK untuk melakukan panggilan, Anda juga harus menginstal SDK.

Kompatibel dengan OpenAI

Python

from openai import OpenAI
import os

client = OpenAI(
    # Kunci API untuk wilayah Singapura dan Beijing berbeda. Jika Anda belum mengatur variabel lingkungan, ganti baris berikut dengan Kunci API Anda: api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # URL dasar berikut untuk wilayah Singapura. Untuk wilayah Beijing, gunakan https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen-flash",
    messages=[
        {
            "role": "system",
            "content": "Ekstrak nama dan usia pengguna, lalu kembalikan informasinya dalam format JSON."
        },
        {
            "role": "user",
            "content": "Halo semuanya, nama saya Alex Brown. Saya berusia 34 tahun. Email saya alexbrown@example.com. Saya suka bermain basket dan bepergian.", 
        },
    ],
    response_format={"type": "json_object"}
)

json_string = completion.choices[0].message.content
print(json_string)

Hasil pengembalian

{
  "name": "Liu Wu",
  "age": 34
}

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Anda: apiKey: "sk-xxx"
    apiKey: process.env.DASHSCOPE_API_KEY,
    // URL dasar berikut untuk wilayah Singapura. Untuk menggunakan model di wilayah Beijing, ganti URL dasar dengan: https://dashscope.aliyuncs.com/compatible-mode/v1
    baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
});

const completion = await openai.chat.completions.create({
    model: "qwen-flash",
    messages: [
        {
            role: "system",
            content: "Ekstrak informasi nama dan usia pengguna, lalu kembalikan dalam format JSON."
        },
        {
            role: "user",
            content: "Halo semuanya, nama saya Alex Brown, saya berusia 34 tahun, dan email saya alexbrown@example.com. Saya suka bermain basket dan bepergian."
        }
    ],
    response_format: {
        type: "json_object"
    }
});

const jsonString = completion.choices[0].message.content;
console.log(jsonString);

Hasil pengembalian

{
  "Name": "Liu Wu",
  "Age": 34
}

curl

# ======= Penting =======
# Kunci API untuk wilayah Singapura dan China (Beijing) berbeda. Untuk informasi lebih lanjut tentang cara mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dengan: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
# === Hapus komentar ini sebelum eksekusi ===
curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen-plus",
    "messages": [
        {
            "role": "system",
            "content": "Anda perlu mengekstrak nama (string), usia (string), dan email (string). Keluarkan string JSON. Jangan keluarkan konten lain.\nContoh:\nQ: Nama saya John Doe, saya berusia 25 tahun, dan email saya johndoe@example.com\nA:{\"name\":\"John Doe\",\"age\":\"25 years old\",\"email\":\"johndoe@example.com\"}\nQ: Nama saya Jane Smith, saya berusia 30 tahun, dan email saya janesmith@example.com\nA:{\"name\":\"Jane Smith\",\"age\":\"30 years old\",\"email\":\"janesmith@example.com\"}\nQ: Nama saya Peter Jones, email saya peterjones@example.com, dan saya berusia 40 tahun\nA:{\"name\":\"Peter Jones\",\"age\":\"40 years old\",\"email\":\"peterjones@example.com\"}"
        },
        {
            "role": "user", 
            "content": "Halo semuanya, nama saya Alex Brown, dan saya berusia 34 tahun. Email saya alexbrown@example.com"
        }
    ],
    "response_format": {
        "type": "json_object"
    }
}'

Hasil pengembalian

{
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "{\"name\":\"Liu Wu\",\"age\":\"34 years old\""}"
            },
            "finish_reason": "stop",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 207,
        "completion_tokens": 20,
        "total_tokens": 227,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "created": 1756455080,
    "system_fingerprint": null,
    "model": "qwen-plus",
    "id": "chatcmpl-624b665b-fb93-99e7-9ebd-bb6d86d314d2"
}

DashScope

Python

import os
import dashscope
# URL berikut untuk wilayah Singapura. Untuk menggunakan model di wilayah Beijing, ganti URL dengan https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages=[
    {
        "role": "system",
        "content": "Ekstrak nama dan usia pengguna, lalu kembalikan informasinya dalam format JSON."
    },
    {
        "role": "user",
        "content": "Halo semuanya, nama saya Alex Brown. Saya berusia 34 tahun. Email saya alexbrown@example.com. Saya suka bermain basket dan bepergian.", 
    },
]
response = dashscope.Generation.call(
    # Untuk menggunakan model di wilayah China (Beijing), Anda harus menggunakan Kunci API khusus wilayah tersebut. Anda dapat memperoleh Kunci API dari: https://bailian.console.alibabacloud.com/?tab=model#/api-key
    # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qwen-flash", 
    messages=messages,
    result_format='message',
    response_format={'type': 'json_object'}
    )
json_string = response.output.choices[0].message.content
print(json_string)

Hasil pengembalian

{
  "name": "Liu Wu",
  "age": 34
}

Java

Versi DashScope Java SDK harus 2.18.4 atau lebih baru.

// Versi DashScope Java SDK harus 2.18.4 atau lebih baru.

import java.util.Arrays;
import java.lang.System;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.common.ResponseFormat;
import com.alibaba.dashscope.protocol.Protocol;

public class Main {
    public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
        // Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dengan: https://dashscope.aliyuncs.com/api/v1
        Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("Ekstrak nama dan usia, lalu kembalikan informasinya dalam format JSON.")
                .build();
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content("Halo semuanya, nama saya Alex Brown, saya berusia 34 tahun, email saya alexbrown@example.com, dan saya suka bermain basket serta bepergian.")
                .build();
        ResponseFormat jsonMode = ResponseFormat.builder().type("json_object").build();
        GenerationParam param = GenerationParam.builder()
                // Jika Anda menggunakan model di wilayah China (Beijing), Anda harus menggunakan Kunci API khusus wilayah tersebut. Untuk mendapatkan Kunci API, kunjungi https://bailian.console.alibabacloud.com/?tab=model#/api-key
                // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: .apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-flash")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .responseFormat(jsonMode)
                .build();
        return gen.call(param);
    }

    public static void main(String[] args) {
        try {
            GenerationResult result = callWithMessage();
            System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            // Gunakan framework logging untuk mencatat informasi pengecualian.
            System.err.println("Terjadi kesalahan saat memanggil layanan generasi: " + e.getMessage());
        }
    }
}

Hasil pengembalian

{
  "name": "Alex Brown",
  "age": 34
}

curl

# ======= Penting =======
# Kunci API untuk wilayah Singapura dan China (Beijing) berbeda. Untuk informasi lebih lanjut tentang cara mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dengan: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
# === Hapus komentar ini sebelum eksekusi ===

curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen-flash",
    "input": {
        "messages": [
            {
                "role": "system",
                "content": "Ekstrak nama dan usia, lalu kembalikan informasinya dalam format JSON."
            },
            {
                "role": "user", 
                "content": "Halo semuanya, nama saya Alex Brown, saya berusia 34 tahun, email saya alexbrown@example.com, dan saya suka bermain basket serta bepergian."
            }
        ]
    },
    "parameters": {
        "result_format": "message",
        "response_format": {
            "type": "json_object"
        }
    }
}'

Hasil pengembalian

{
    "output": {
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": "{\n  \"Name\": \"Liu Wu\",\n  \"Age\": 34\n}"
                }
            }
        ]
    },
    "usage": {
        "total_tokens": 72,
        "output_tokens": 18,
        "input_tokens": 54,
        "cached_tokens": 0
    },
    "request_id": "xxx-xxx-xxx-xxx-xxx"
}

Pemrosesan data citra dan video

Selain teks, model multimodal mendukung structured output untuk data citra dan video. Fitur ini memungkinkan ekstraksi informasi visual, lokalisasi, dan deteksi event.

Untuk batasan file citra dan video, lihat Pemahaman visual.

Kompatibel dengan OpenAI

Python

import os
from openai import OpenAI

client = OpenAI(
    # Kunci API untuk wilayah Singapura dan China (Beijing) berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # Berikut adalah URL dasar untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dasar dengan: https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
)

completion = client.chat.completions.create(
    model="qwen3-vl-plus",
    messages=[
        {
            "role": "system",
            "content": [{"type": "text", "text": "Anda adalah asisten yang membantu."}],
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg"
                    },
                },
                {"type": "text", "text": "Ekstrak informasi tiket (termasuk travel_date, trains, seat_num, arrival_site, dan price) dan informasi faktur (termasuk invoice_code dan invoice_number) dari citra. Keluarkan objek JSON yang berisi array tiket dan faktur."},
            ],
        },
    ],
    response_format={"type": "json_object"}
)
json_string = completion.choices[0].message.content
print(json_string)

Hasil pengembalian

{
  "ticket": [
    {
      "travel_date": "2013-06-29",
      "trains": "Serial Number",
      "seat_num": "371",
      "arrival_site": "Development Zone",
      "price": "8.00"
    }
  ],
  "invoice": [
    {
      "invoice_code": "221021325353",
      "invoice_number": "10283819"
    }
  ]
}

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
  // Kunci API untuk wilayah Singapura dan China (Beijing) berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
  // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: apiKey: "sk-xxx"
  apiKey: process.env.DASHSCOPE_API_KEY,
  // Berikut adalah URL dasar untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dasar dengan https://dashscope.aliyuncs.com/compatible-mode/v1
  baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
});

async function main() {
  const response = await openai.chat.completions.create({
    model: "qwen3-vl-plus",
    messages: [{
        role: "system",
        content: [{
          type: "text",
          text: "Anda adalah asisten yang membantu."
        }]
      },
      {
        role: "user",
        content: [{
            type: "image_url",
            image_url: {
              "url": "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg"
            }
          },
          {
            type: "text",
            text: "Ekstrak informasi tiket (termasuk travel_date, trains, seat_num, arrival_site, dan price) dan informasi faktur (sebagai array, termasuk invoice_code dan invoice_number) dari citra. Keluarkan objek JSON yang berisi array tiket dan faktur."
          }
        ]
      }
    ],
    response_format: {type: "json_object"}
  });
  console.log(response.choices[0].message.content);
}

main()

Hasil pengembalian

{
  "ticket": [
    {
      "travel_date": "2013-06-29",
      "trains": "Serial Number",
      "seat_num": "371",
      "arrival_site": "Development Zone",
      "price": "8.00"
    }
  ],
  "invoice": [
    {
      "invoice_code": "221021325353",
      "invoice_number": "10283819"
    }
  ]
}

curl

# ======= Penting =======
# Berikut adalah URL dasar untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dasar dengan: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
# Kunci API untuk wilayah Singapura dan China (Beijing) berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# === Hapus komentar ini sebelum eksekusi ===

curl --location 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
  "model": "qwen3-vl-plus",
  "messages": [
  {"role":"system",
  "content":[
    {"type": "text", "text": "Anda adalah asisten yang membantu."}]},
  {
    "role": "user",
    "content": [
      {"type": "image_url", "image_url": {"url": "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg"}},
      {"type": "text", "text": "Ekstrak informasi tiket (termasuk travel_date, trains, seat_num, arrival_site, dan price) dan informasi faktur (sebagai array, termasuk invoice_code dan invoice_number) dari citra. Keluarkan objek JSON yang berisi array tiket dan faktur."}
    ]
  }],
  "response_format":{"type": "json_object"}
}'

Hasil pengembalian

{
  "choices": [{
    "message": {
      "content": "{\n  \"ticket\": [\n    {\n      \"travel_date\": \"2013-06-29\",\n      \"trains\": \"Serial Number\",\n      \"seat_num\": \"371\",\n      \"arrival_site\": \"Development Zone\",\n      \"price\": \"8.00\"\n    }\n  ],\n  \"invoice\": [\n    {\n      \"invoice_code\": \"221021325353\",\n      \"invoice_number\": \"10283819\"\n    }\n  ]\n}",
      "role": "assistant"
    },
    "finish_reason": "stop",
    "index": 0,
    "logprobs": null
  }],
  "object": "chat.completion",
  "usage": {
    "prompt_tokens": 486,
    "completion_tokens": 112,
    "total_tokens": 598,
    "prompt_tokens_details": {
      "cached_tokens": 0
    }
  },
  "created": 1755767481,
  "system_fingerprint": null,
  "model": "qwen3-vl-plus",
  "id": "chatcmpl-33249829-e9f3-9cbc-93e4-0536b3d7d713"
}

DashScope

Python

import os
import dashscope

# Berikut adalah URL dasar untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dasar dengan: https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [
{
    "role": "system",
    "content": [
    {"text": "Anda adalah asisten yang membantu."}]
},
{
    "role": "user",
    "content": [
    {"image": "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg"},
    {"text": "Ekstrak informasi tiket (termasuk travel_date, trains, seat_num, arrival_site, dan price) dan informasi faktur (sebagai array, termasuk invoice_code dan invoice_number) dari citra. Keluarkan objek JSON yang berisi array tiket dan faktur."}]
}]
response = dashscope.MultiModalConversation.call(
    #Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: api_key ="sk-xxx"
    api_key = os.getenv('DASHSCOPE_API_KEY'),
    model = 'qwen3-vl-plus',
    messages = messages,
    response_format={'type': 'json_object'}
)
json_string = response.output.choices[0].message.content[0]["text"]
print(json_string)

Hasil pengembalian

{
  "ticket": [
    {
      "travel_date": "2013-06-29",
      "trains": "Serial Number",
      "seat_num": "371",
      "arrival_site": "Development Zone",
      "price": "8.00"
    }
  ],
  "invoice": [
    {
      "invoice_code": "221021325353",
      "invoice_number": "10283819"
    }
  ]
}

Java

// Versi DashScope Java SDK harus 2.21.4 atau lebih baru.

import java.util.Arrays;
import java.util.Collections;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.common.ResponseFormat;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    
    // Berikut adalah URL dasar untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dasar dengan: https://dashscope.aliyuncs.com/api/v1
    static {
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage systemMessage = MultiModalMessage.builder().role(Role.SYSTEM.getValue())
                .content(Arrays.asList(
                        Collections.singletonMap("text", "Anda adalah asisten yang membantu."))).build();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        Collections.singletonMap("image", "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg"),
                        Collections.singletonMap("text", "Ekstrak informasi tiket (termasuk travel_date, trains, seat_num, arrival_site, dan price) dan informasi faktur (sebagai array, termasuk invoice_code dan invoice_number) dari citra. Keluarkan objek JSON yang berisi array tiket dan faktur."))).build();
        ResponseFormat jsonMode = ResponseFormat.builder().type("json_object").build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: .apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3-vl-plus")
                .messages(Arrays.asList(systemMessage, userMessage))
                .responseFormat(jsonMode)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
    }
}

Hasil pengembalian

{
  "ticket": [
    {
      "travel_date": "2013-06-29",
      "trains": "Serial Number",
      "seat_num": "371",
      "arrival_site": "Development Zone",
      "price": "8.00"
    }
  ],
  "invoice": [
    {
      "invoice_code": "221021325353",
      "invoice_number": "10283819"
    }
  ]
}

curl

# ======= Penting =======
# Berikut adalah URL dasar untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dasar dengan: https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation
# Kunci API untuk wilayah Singapura dan China (Beijing) berbeda. Untuk mendapatkan Kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# === Hapus komentar ini sebelum eksekusi ===

curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen3-vl-plus",
    "input":{
        "messages":[
            {"role": "system",
         "content": [
           {"text": "Anda adalah asisten yang membantu."}]},
            {
             "role": "user",
             "content": [
               {"image": "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg"},
               {"text": "Ekstrak informasi tiket (termasuk travel_date, trains, seat_num, arrival_site, dan price) dan informasi faktur (sebagai array, termasuk invoice_code dan invoice_number) dari citra. Keluarkan objek JSON yang berisi array tiket dan faktur."}
                ]
            }
        ]
    },
    "parameters": {
        "response_format": {"type": "json_object"}
    }
}'

Hasil pengembalian

{
  "output": {
    "choices": [
      {
        "message": {
          "content": [
            {
              "text": "{\n  \"ticket\": [\n    {\n      \"travel_date\": \"2013-06-29\",\n      \"trains\": \"Serial Number\",\n      \"seat_num\": \"371\",\n      \"arrival_site\": \"Development Zone\",\n      \"price\": \"8.00\"\n    }\n  ],\n  \"invoice\": [\n    {\n      \"invoice_code\": \"221021325353\",\n      \"invoice_number\": \"10283819\"\n    }\n  ]\n}"
            }
          ],
          "role": "assistant"
        },
        "finish_reason": "stop"
      }
    ]
  },
  "usage": {
    "total_tokens": 598,
    "input_tokens_details": {
      "image_tokens": 418,
      "text_tokens": 68
    },
    "output_tokens": 112,
    "input_tokens": 486,
    "output_tokens_details": {
      "text_tokens": 112
    },
    "image_tokens": 418
  },
  "request_id": "b129dce1-0d5d-4772-b8b5-bd3a1d5cde63"
}

Optimalkan prompt

Prompt yang samar, seperti "kembalikan informasi pengguna," dapat menyebabkan model menghasilkan hasil yang tidak terduga. Untuk menghindarinya, jelaskan skema yang diharapkan dalam prompt Anda. Sertakan tipe field, apakah field tersebut wajib, persyaratan format seperti format tanggal, dan berikan contoh.

Kompatibel dengan OpenAI

Python

from openai import OpenAI
import os
import json
import textwrap  # Digunakan untuk menangani indentasi string multi-baris dan meningkatkan keterbacaan kode.

# Pra-definisikan contoh respons untuk menunjukkan format output yang diharapkan model.
# Contoh 1: Respons lengkap yang mencakup hobi.
example1_response = json.dumps(
    {
        "info": {"name": "John Doe", "age": "25 years old", "email": "johndoe@example.com"},
        "hobby": ["singing"]
    },
    ensure_ascii=False
)
# Contoh 2: Respons yang mencakup beberapa hobi.
example2_response = json.dumps(
    {
        "info": {"name": "Jane Smith", "age": "30 years old", "email": "janesmith@example.com"},
        "hobby": ["dancing", "swimming"]
    },
    ensure_ascii=False
)
# Contoh 3: Respons yang tidak mencakup field hobby (hobby opsional).
example3_response = json.dumps(
    {
        "info": {"name": "Peter Jones", "age": "28 years old", "email": "peterjones@example.com"}
    },
    ensure_ascii=False
)
# Contoh 4: Respons yang tidak mencakup field hobby.
example4_response = json.dumps(
    {
        "info": {"name": "Emily White", "age": "35 years old", "email": "emilywhite@example.com"}
    },
    ensure_ascii=False
)

# Inisialisasi klien OpenAI dan konfigurasikan Kunci API serta URL dasar.
client = OpenAI(
    # Kunci API untuk wilayah Singapura dan Beijing berbeda. Untuk mendapatkan Kunci API, kunjungi: https://www.alibabacloud.com/help/en/model-studio/get-api-key
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

# Fungsi dedent menghapus spasi awal umum dari setiap baris dalam string.
# Ini memungkinkan Anda mengindentasi string dengan rapi di kode, dan spasi tambahan tidak akan disertakan saat runtime.
system_prompt = textwrap.dedent(f"""\
    Ekstrak informasi pribadi dari input pengguna dan keluarkan dalam format JSON Schema yang ditentukan:

    [Persyaratan Format Output]
    Output harus mengikuti struktur JSON di bawah ini secara ketat:
    {{
      "info": {{
        "name": "String. Wajib. Nama.",
        "age": "String. Wajib. Formatnya 'angka years old', contohnya '25 years old'.",
        "email": "String. Wajib. Format email standar, contohnya 'user@example.com'."
      }},
      "hobby": ["Array string. Opsional. Berisi semua hobi. Jika tidak ada hobi yang disebutkan, field ini harus dihilangkan dari output."]
    }}

    [Aturan Ekstraksi Field]
    1. name: Identifikasi nama dari teks. Field ini wajib.
    2. age: Identifikasi informasi usia dan ubah ke format 'angka years old'. Field ini wajib.
    3. email: Identifikasi alamat email dan pertahankan format aslinya. Field ini wajib.
    4. hobby: Identifikasi hobi dan keluarkan sebagai array string. Jika tidak ada hobi yang disebutkan, hilangkan field hobby sepenuhnya.

    [Contoh Referensi]
    Contoh 1 (termasuk hobi):
    Q: Nama saya John Doe, saya berusia 25 tahun, email saya johndoe@example.com, dan saya suka menyanyi.
    A: {example1_response}

    Contoh 2 (termasuk beberapa hobi):
    Q: Nama saya Jane Smith, saya berusia 30 tahun, email saya janesmith@example.com, dan saya suka menari dan berenang.
    A: {example2_response}

    Contoh 3 (tidak termasuk hobi):
    Q: Nama saya Peter Jones, saya berusia 28 tahun, dan email saya peterjones@example.com.
    A: {example3_response}

    Contoh 4 (tidak termasuk hobi):
    Q: Saya Emily White, berusia 35 tahun. Email saya emilywhite@example.com.
    A: {example4_response}

    Ikuti secara ketat format dan aturan di atas untuk mengekstrak informasi dan mengeluarkan JSON. Jika pengguna tidak menyebutkan hobi apa pun, jangan sertakan field hobby dalam output.\
""")

# Panggil API LLM untuk mengekstrak informasi.
completion = client.chat.completions.create(
    model="qwen-plus",  # Tentukan model yang digunakan, yaitu qwen-plus.
    messages=[
        {
            "role": "system",
            "content": system_prompt  # Gunakan prompt sistem yang didefinisikan di atas.
        },
        {
            "role": "user",
            "content": "Hai semuanya, nama saya Alex Brown. Saya berusia 34 tahun, email saya alexbrown@example.com, dan saya suka bermain basket serta bepergian.", 
        },
    ],
    response_format={"type": "json_object"},  # Tentukan format respons sebagai JSON untuk memastikan output terstruktur.
)

# Ekstrak dan cetak hasil JSON yang dihasilkan model.
json_string = completion.choices[0].message.content
print(json_string)

Hasil pengembalian

{
  "info": {
    "name": "Liu Wu",
    "age": "34",
    "email": "liuwu@example.com"
  },
  "hobby": ["basketball", "travel"]  
}

Node.js

import OpenAI from "openai";

// Pra-definisikan respons contoh untuk menunjukkan format output yang diharapkan model.
// Contoh 1: Respons lengkap yang berisi semua field.
const example1Response = JSON.stringify({
    info: { name: "John Doe", age: "25 years old", email: "johndoe@example.com" },
    hobby: ["singing"]
}, null, 2);

// Contoh 2: Respons yang berisi beberapa hobi.
const example2Response = JSON.stringify({
    info: { name: "Jane Smith", age: "30 years old", email: "janesmith@example.com" },
    hobby: ["dancing", "swimming"]
}, null, 2);

// Contoh 3: Respons tanpa field hobby. Field hobby opsional.
const example3Response = JSON.stringify({
    info: { name: "Peter Jones", age: "28 years old", email: "peterjones@example.com" }
}, null, 2);

// Contoh 4: Respons lain tanpa field hobby.
const example4Response = JSON.stringify({
    info: { name: "Emily White", age: "35 years old", email: "emilywhite@example.com" }
}, null, 2);

// Inisialisasi konfigurasi klien OpenAI.
const openai = new OpenAI({
    // Kunci API untuk wilayah Singapura dan Beijing berbeda.
    // Jika variabel lingkungan belum dikonfigurasi, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: apiKey: "sk-xxx",
    apiKey: process.env.DASHSCOPE_API_KEY,
    // Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah Beijing, ganti URL dengan: https://dashscope.aliyuncs.com/compatible-mode/v1
    baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
});

// Buat permintaan penyelesaian chat. Gunakan prompt terstruktur untuk meningkatkan akurasi output.
const completion = await openai.chat.completions.create({
    model: "qwen-plus",
    messages: [
        {
            role: "system",
            content: `Silakan ekstrak informasi pribadi dari input pengguna dan keluarkan dalam format JSON Schema yang ditentukan.

[Persyaratan Format Output]
Output harus mengikuti struktur JSON di bawah ini secara ketat:
{
  "info": {
    "name": "Tipe string, field wajib, nama",
    "age": "Tipe string, field wajib, format: '[angka] years old', contohnya '25 years old'",
    "email": "Tipe string, field wajib, format email standar, contohnya 'user@example.com'"
  },
  "hobby": ["Tipe array string, opsional. Berisi semua hobi pengguna. Hilangkan field ini jika tidak ada hobi yang disebutkan."]
}

[Aturan Ekstraksi Field]
1. name: Identifikasi nama dari teks dan ekstrak. Field ini wajib.
2. age: Identifikasi informasi usia, ubah ke format '[angka] years old', dan ekstrak. Field ini wajib.
3. email: Identifikasi alamat email, pertahankan format aslinya, dan ekstrak. Field ini wajib.
4. hobby: Identifikasi hobi dan keluarkan sebagai array string. Jika tidak ada informasi hobi yang disebutkan, hilangkan field hobby sepenuhnya dari output.

[Contoh Referensi]
Contoh 1 (dengan hobi):
Q: Nama saya John Doe, saya berusia 25 tahun, email saya johndoe@example.com, dan hobi saya menyanyi.
A: ${example1Response}

Contoh 2 (dengan beberapa hobi):
Q: Nama saya Jane Smith, saya berusia 30 tahun, email saya janesmith@example.com, dan saya biasanya suka menari dan berenang.
A: ${example2Response}

Contoh 3 (tanpa hobi):
Q: Nama saya Peter Jones, saya berusia 28 tahun, dan email saya peterjones@example.com.
A: ${example3Response}

Contoh 4 (tanpa hobi):
Q: Saya Emily White, berusia 35 tahun, dan email saya emilywhite@example.com.
A: ${example4Response}

Ikuti secara ketat format dan aturan di atas untuk mengekstrak informasi dan mengeluarkan JSON. Jika pengguna tidak menyebutkan hobi apa pun, jangan sertakan field hobby dalam output.`
        },
        {
            role: "user",
            content: "Halo semuanya, nama saya Alex Brown, saya berusia 34 tahun, email saya alexbrown@example.com, dan saya biasanya suka bermain basket serta bepergian."
        }
    ],
    response_format: {
        type: "json_object"
    }
});

// Ekstrak dan cetak hasil JSON yang dihasilkan model.
const jsonString = completion.choices[0].message.content;
console.log(jsonString);

Hasil pengembalian

{
  "info": {
    "name": "Liu Wu",
    "age": "34 years old",
    "email": "liuwu@example.com"
  },
  "hobby": [
    "Playing basketball",
    "Traveling"
  ]
}

DashScope

Python

import os
import json
import dashscope
# Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dengan: https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

# Pra-definisikan respons contoh untuk menunjukkan format output yang diharapkan model.
example1_response = json.dumps(
    {
        "info": {"name": "John Doe", "age": "25 years old", "email": "johndoe@example.com"},
        "hobby": ["singing"]
    },
    ensure_ascii=False
)
example2_response = json.dumps(
    {
        "info": {"name": "Jane Smith", "age": "30 years old", "email": "janesmith@example.com"},
        "hobby": ["dancing", "swimming"]
    },
    ensure_ascii=False
)
example3_response = json.dumps(
    {
        "info": {"name": "Peter Jones", "age": "40 years old", "email": "peterjones@example.com"},
        "hobby": ["Rap", "basketball"]
    },
    ensure_ascii=False
)

messages=[
        {
            "role": "system",
            "content": f"""Silakan ekstrak informasi pribadi dari input pengguna dan keluarkan dalam format JSON Schema yang ditentukan:

[Persyaratan Format Output]
Output harus mengikuti struktur JSON di bawah ini secara ketat:
{{
  "info": {{
    "name": "string, wajib, nama pengguna",
    "age": "string, wajib, dalam format 'angka years old', contohnya '25 years old'",
    "email": "string, wajib, dalam format email standar, contohnya 'user@example.com'"
  }},
  "hobby": ["array string, opsional, berisi semua hobi pengguna. Jika tidak ada hobi yang disebutkan, hilangkan field ini sepenuhnya."]
}}

[Aturan Ekstraksi Field]
1. name: Identifikasi nama pengguna dari teks. Field ini wajib.
2. age: Identifikasi informasi usia dan ubah ke format "angka years old". Field ini wajib.
3. email: Identifikasi alamat email dan pertahankan format aslinya. Field ini wajib.
4. hobby: Identifikasi hobi pengguna dan keluarkan sebagai array string. Jika tidak ada informasi hobi yang disebutkan, hilangkan field hobby sepenuhnya.

[Contoh Referensi]
Contoh 1 (termasuk hobi):
Q: Nama saya John Doe, saya berusia 25 tahun, email saya johndoe@example.com, dan hobi saya menyanyi.
A: {example1_response}

Contoh 2 (termasuk beberapa hobi):
Q: Nama saya Jane Smith, saya berusia 30 tahun, email saya janesmith@example.com, dan saya suka menari dan berenang.
A: {example2_response}

Contoh 3 (termasuk beberapa hobi):
Q: Email saya peterjones@example.com, saya berusia 40 tahun, nama saya Peter Jones, dan saya bisa rap serta bermain basket.
A: {example3_response}

Silakan ikuti secara ketat format dan aturan di atas untuk mengekstrak informasi dan mengeluarkan JSON. Jika pengguna tidak menyebutkan hobi apa pun, jangan sertakan field hobby dalam output."""
        },
        {
            "role": "user",
            "content": "Halo semuanya, nama saya Alex Brown, saya berusia 34 tahun, email saya alexbrown@example.com, dan saya suka bermain basket serta bepergian.", 
        },
    ]
response = dashscope.Generation.call(
    # Jika Anda menggunakan model di wilayah China (Beijing), Anda harus menggunakan Kunci API untuk wilayah China (Beijing). Dapatkan di: https://bailian.console.alibabacloud.com/?tab=model#/api-key
    # Jika variabel lingkungan belum dikonfigurasi, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qwen-plus", 
    messages=messages,
    result_format='message',
    response_format={'type': 'json_object'}
    )
json_string = response.output.choices[0].message.content
print(json_string)

Hasil pengembalian

{
  "info": {
    "name": "Liu Wu",
    "age": "34 years old",
    "email": "liuwu@example.com"
  },
  "hobby": [
    "Playing basketball",
    "Traveling"
  ]
}

Java

import java.util.Arrays;
import java.lang.System;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.common.ResponseFormat;
import com.alibaba.dashscope.protocol.Protocol;

public class Main {
    public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException {
        // Berikut adalah URL untuk wilayah Singapura. Jika Anda menggunakan model di wilayah China (Beijing), ganti URL dengan: https://dashscope.aliyuncs.com/api/v1
        Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("""
                Ekstrak informasi pribadi dari input pengguna dan keluarkan dalam format skema JSON yang ditentukan:

[Persyaratan Format Output]
Output harus mengikuti struktur JSON berikut secara ketat:
{
  "info": {
    "name": "String, wajib, nama",
    "age": "String, wajib, formatnya 'angka + years old', contohnya '25 years old'",
    "email": "String, wajib, format email standar, contohnya 'user@example.com'"
  },
  "hobby": ["Array string, opsional, berisi semua hobi pengguna. Jika tidak disebutkan, jangan sertakan field ini dalam output."]
}

[Aturan Ekstraksi Field]
1. name: Identifikasi nama dari teks. Ini adalah field wajib.
2. age: Identifikasi usia dan ubah ke format 'angka + years old'. Ini adalah field wajib.
3. email: Identifikasi alamat email dan pertahankan format aslinya. Ini adalah field wajib.
4. hobby: Identifikasi hobi pengguna dan keluarkan sebagai array string. Jika tidak ada hobi yang disebutkan, hilangkan field hobby sepenuhnya.

[Contoh Referensi]
Contoh 1 (dengan hobi):
Q: Nama saya John Doe, saya berusia 25 tahun, email saya johndoe@example.com, dan hobi saya menyanyi.
A:{"info":{"name":"John Doe","age":"25 years old","email":"johndoe@example.com"},"hobby":["singing"]}

Contoh 2 (dengan beberapa hobi):
Q: Nama saya Jane Smith, saya berusia 30 tahun, email saya janesmith@example.com, dan saya suka menari dan berenang.
A:{"info":{"name":"Jane Smith","age":"30 years old","email":"janesmith@example.com"},"hobby":["dancing","swimming"]}

Contoh 3 (tanpa hobi):
Q: Nama saya David Wilson, email saya davidwilson@example.com, dan saya berusia 40 tahun.
A:{"info":{"name":"David Wilson","age":"40 years old","email":"davidwilson@example.com"}}""")
                .build();
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content("Halo semuanya, nama saya Alex Brown, saya berusia 34 tahun, email saya alexbrown@example.com, dan saya suka bermain basket serta bepergian.")
                .build();
        ResponseFormat jsonMode = ResponseFormat.builder().type("json_object").build();
        GenerationParam param = GenerationParam.builder()
                // Jika Anda menggunakan model di wilayah China (Beijing), Anda harus menggunakan Kunci API untuk wilayah tersebut. Untuk mendapatkan Kunci API, kunjungi https://bailian.console.alibabacloud.com/?tab=model#/api-key
                // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: .apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .responseFormat(jsonMode)
                .build();
        return gen.call(param);
    }
    public static void main(String[] args) {
        try {
            GenerationResult result = callWithMessage();
            System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            // Gunakan framework logging untuk mencatat informasi pengecualian.
            System.err.println("Terjadi kesalahan saat memanggil layanan generasi: " + e.getMessage());
        }
    }
}

Hasil pengembalian

{
  "info": {
    "name": "Liu Wu",
    "age": "34",
    "email": "liuwu@example.com"
  },
  "hobby": [
    "Playing basketball",
    "Traveling"
  ]
}

Dapatkan output dalam format tertentu

Mengatur response_format type menjadi json_object mengembalikan string JSON standar, tetapi struktur kontennya mungkin tidak sesuai harapan Anda. Pendekatan ini cocok untuk skenario sederhana. Untuk skenario kompleks yang memerlukan batasan tipe ketat, seperti parsing otomatis dan interoperabilitas API, Anda dapat mengatur type menjadi json_schema untuk memaksa model mengeluarkan konten yang secara ketat sesuai dengan format tertentu. Format dan contoh response_format ditunjukkan di bawah ini:

Format

Contoh

{
  "type": "json_schema",
  "json_schema": {
    "name": "schema_name",       // Nama skema
    "strict": true,              // Direkomendasikan diatur true untuk kepatuhan format ketat
    "schema": {
      "type": "object",
      "properties": {...},       // Mendefinisikan struktur field, lihat contoh di kanan
      "required": [...],         // Daftar field wajib
      "additionalProperties": false  // Direkomendasikan diatur false agar hanya mengeluarkan field yang ditentukan
    }
  }
}
{
  "type": "json_schema",
  "json_schema": {
    "name": "user_info",
    "strict": true,
    "schema": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "Nama pengguna"
        },
        "age": {
          "type": "integer",
          "description": "Usia pengguna"
        },
        "email": {
          "type": "string",
          "description": "Alamat email"
        }
      },
      "required": ["name", "age"],
      "additionalProperties": false
    }
  }
}

Contoh di atas memaksa model mengeluarkan objek JSON yang mencakup dua field wajib, name dan age, serta field opsional email.

Fitur ini hanya didukung oleh model berikut di wilayah China (Beijing): qwen-plus-latest, qwen-plus-2025-12-01, qwen-plus-2025-09-11, dan qwen-plus-2025-07-28.
Model di wilayah Singapura saat ini tidak didukung.

Cara menggunakan

Metode parse OpenAI SDK memungkinkan Anda langsung meneruskan kelas Pydantic Python atau objek Zod Node.js. SDK secara otomatis mengonversinya menjadi JSON Schema, sehingga Anda tidak perlu menulis JSON kompleks secara manual. Untuk DashScope SDK, Anda harus membangun JSON Schema secara manual mengikuti format yang dijelaskan di atas.

Kompatibel dengan OpenAI

from pydantic import BaseModel, Field
from openai import OpenAI
import os

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

class UserInfo(BaseModel):
    name: str = Field(description="Nama pengguna")
    age: int = Field(description="Usia pengguna, dalam tahun")

completion = client.chat.completions.parse(
    model="qwen-plus",
    messages=[
        {"role": "system", "content": "Ekstrak informasi nama dan usia."},
        {"role": "user", "content": "Nama saya John Doe, dan saya berusia 25 tahun."},
    ],
    response_format=UserInfo,
)

result = completion.choices[0].message.parsed
print(f"Nama: {result.name}, Usia: {result.age}")
import OpenAI from "openai";
import { zodResponseFormat } from "openai/helpers/zod";
import { z } from "zod";

const openai = new OpenAI(
    {
        apiKey: process.env.DASHSCOPE_API_KEY,
        baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
    }
);

const UserInfo = z.object({
  name: z.string().describe("Nama pengguna"),
  age: z.number().int().describe("Usia pengguna dalam tahun"),
});

const completion = await openai.chat.completions.parse({
  model: "qwen-plus",
  messages: [
    { role: "system", content: "Ekstrak informasi nama dan usia." },
    { role: "user", content: "Nama saya Alex Brown, dan saya berusia 25 tahun." },
  ],
  response_format: zodResponseFormat(UserInfo, "user_info"),
});

const userInfo = completion.choices[0].message.parsed;
console.log(`Nama: ${userInfo.name}`);
console.log(`Usia: ${userInfo.age}`);

Menjalankan kode menghasilkan output berikut:

Nama: Liu Wu, Usia: 25

DashScope

SDK Java saat ini tidak didukung.
import os
import dashscope
import json

messages = [
    {
        "role": "user",
        "content": "Nama saya Liu Wu, dan saya berusia 25 tahun.",
    },
]
response = dashscope.Generation.call(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    model="qwen-plus",
    messages=messages,
    result_format="message",
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "user_info",
            "schema": {
                "properties": {
                    "name": {"title": "Nama", "type": "string"},
                    "age": {"title": "Usia", "type": "integer"},
                },
                "required": ["name", "age"],
                "title": "UserInfo",
                "type": "object",
            },
        },
        "strict": True,
    },
)
json_object = json.loads(response.output.choices[0].message.content)
print(f"Nama: {json_object['name']}, Usia: {json_object['age']}")

Menjalankan kode menghasilkan output berikut:

Nama: Liu Wu, Usia: 25

Panduan konfigurasi

Saat menggunakan JSON Schema, ikuti panduan berikut untuk mendapatkan output terstruktur yang lebih andal:

  • Deklarasikan field wajib

    Cantumkan field wajib dalam array required. Field opsional dapat dihilangkan dari daftar ini. Contohnya:

    {
      "properties": {
        "name": {"type": "string"},
        "age": {"type": "integer"},
        "email": {"type": "string"}
      },
      "required": ["name", "age"]
    }

    Jika input tidak menyediakan informasi email, output tidak akan menyertakan field ini.

  • Implementasikan field opsional

    Selain menghilangkan field dari array required, Anda juga dapat menjadikannya opsional dengan mengizinkan tipe null:

    {
      "properties": {
        "name": {"type": "string"},
        "email": {"type": ["string", "null"]}  // Bisa berupa string atau null
      },
      "required": ["name", "email"]  // Keduanya ada dalam daftar wajib
    }

    Output akan selalu menyertakan field email, tetapi nilainya mungkin null.

  • Konfigurasikan additionalProperties

    Pengaturan ini mengontrol apakah output dapat menyertakan field tambahan yang tidak didefinisikan dalam skema:

    {
      "properties": {"name": {"type": "string"}},
      "required": ["name"],
      "additionalProperties": true  // Mengizinkan field tambahan
    }

    Contohnya, input "Saya Zhang San, berusia 25 tahun" menghasilkan output {"name": "Zhang San", "age": 25}. Output ini menyertakan field age yang tidak secara eksplisit didefinisikan dalam input.

    Nilai

    Perilaku

    Skenario

    false

    Hanya mengeluarkan field yang didefinisikan

    Saat Anda perlu mengontrol struktur secara presisi

    true

    Mengizinkan field tambahan

    Saat Anda perlu menangkap lebih banyak informasi

  • Tipe data yang didukung: string, number, integer, boolean, object, array, dan enum.

Praktik terbaik untuk produksi

  • Validasi

    Jika Anda menggunakan mode JSON Object, validasi output dengan alat sebelum meneruskannya ke aplikasi downstream. Anda dapat menggunakan alat seperti jsonschema (Python), Ajv (JavaScript), atau Everit (Java). Ini memastikan output mematuhi JSON Schema yang ditentukan dan mencegah kegagalan parsing, kehilangan data, atau gangguan logika bisnis akibat field yang hilang, kesalahan tipe, atau format salah. Jika terjadi kegagalan, Anda dapat menggunakan strategi seperti retry atau meminta LLM memperbaiki output.

  • Nonaktifkan max_tokens

    Jangan tentukan max_tokens (parameter yang mengontrol jumlah token output dan default ke batas output maksimum model) saat Anda mengaktifkan structured output. Jika tidak, string JSON yang dikembalikan mungkin tidak lengkap dan menyebabkan kegagalan parsing untuk layanan downstream.

  • Gunakan SDK untuk membantu menghasilkan skema

    Gunakan SDK untuk menghasilkan skema secara otomatis. Ini membantu menghindari kesalahan dari pemeliharaan manual dan memungkinkan validasi dan parsing otomatis.

    from pydantic import BaseModel, Field
    from typing import Optional
    from openai import OpenAI
    import os
    
    client = OpenAI(
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
    class UserInfo(BaseModel):
        name: str = Field(description="Nama pengguna")
        age: int = Field(description="Usia pengguna")
        email: Optional[str] = None  # Field opsional
    
    completion = client.chat.completions.parse(
        model="qwen-plus",
        messages=[
            {"role": "system", "content": "Ekstrak informasi nama dan usia."},
            {"role": "user", "content": "Nama saya Alex Brown, dan saya berusia 25 tahun."},
        ],
        response_format=UserInfo  # Langsung teruskan model Pydantic
    )
    
    result = completion.choices[0].message.parsed  # Hasil parsed yang aman tipe
    print(f"Nama: {result.name}, Usia: {result.age}")
    import { z } from "zod";
    import { zodResponseFormat } from "openai/helpers/zod";
    import OpenAI from "openai";
    
    const client = new OpenAI(
        {
            apiKey: process.env.DASHSCOPE_API_KEY,
            baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
        }
    );
    
    const UserInfo = z.object({
      name: z.string().describe("Nama pengguna"),
      age: z.number().int().describe("Usia pengguna"),
      email: z.string().optional().nullable()  // Field opsional
    });
    
    const completion = await client.chat.completions.parse({
      model: "qwen-plus",
      messages: [
        { role: "system", content: "Ekstrak informasi nama dan usia." },
        { role: "user", content: "Nama saya Alex Brown, dan saya berusia 25 tahun." },
      ],
      response_format: zodResponseFormat(UserInfo, "user_info")
    });
    
    console.log(completion.choices[0].message.parsed);

FAQ

T: Bagaimana model Qwen menghasilkan structured output dalam mode thinking?

J: Mode thinking Qwen saat ini tidak mendukung structured output. Untuk mendapatkan string JSON standar dalam mode thinking, Anda dapat menggunakan model yang mendukung mode JSON untuk memperbaiki output jika parsing JSON gagal.

  1. Memperoleh output dalam mode berpikir

    Panggil model dalam mode thinking untuk mendapatkan output berkualitas tinggi, yang mungkin bukan string JSON standar.

    Saat Anda mengaktifkan mode thinking, jangan atur parameter response_format menjadi {"type": "json_object"}. Jika tidak, akan terjadi kesalahan.
    completion = client.chat.completions.create(
        model="qwen-plus",
        messages=[
            {"role": "system", "content": system_prompt},
            {
                "role": "user",
                "content": "Halo semuanya, nama saya Alex Brown. Saya berusia 34 tahun, email saya alexbrown@example.com, dan saya suka bermain basket serta bepergian.",
            },
        ],
        # Aktifkan mode thinking. Jangan atur parameter response_format menjadi {"type": "json_object"}, atau akan terjadi kesalahan.
        extra_body={"enable_thinking": True},
        # Aktifkan keluaran streaming untuk mode thinking.
        stream=True
    )
    # Ekstrak dan cetak hasil JSON yang dihasilkan model.
    json_string = ""
    for chunk in completion:
        if chunk.choices[0].delta.content is not None:
            json_string += chunk.choices[0].delta.content
  2. Validasi dan perbaiki output

    Coba parse json_string dari langkah sebelumnya:

    • Jika model menghasilkan string JSON standar, Anda dapat meng-parse dan mengembalikannya langsung.

    • Jika model menghasilkan string JSON non-standar, Anda dapat memanggil model yang mendukung structured output untuk memperbaiki formatnya. Kami merekomendasikan memilih model yang cepat dan hemat biaya, seperti qwen-flash dalam mode non-thinking.

    import json
    
    try:
        json_object_from_thinking_model = json.loads(json_string)
        print("String JSON standar dihasilkan.")
    except json.JSONDecodeError:
        print("String JSON non-standar dihasilkan. Memperbaikinya dengan model yang mendukung structured output.")
        completion = client.chat.completions.create(
            model="qwen-flash",
            messages=[
                {
                    "role": "system",
                    "content": "Anda ahli dalam memperbaiki format JSON. Harap perbaiki string JSON yang dimasukkan pengguna ke format standar.",
                },
                {
                    "role": "user",
                    "content": json_string,
                },
            ],
            response_format={"type": "json_object"},
        )
        json_object_from_thinking_model = json.loads(completion.choices[0].message.content)

Kode kesalahan

Jika panggilan gagal, lihat Pesan kesalahan untuk troubleshooting.