All Products
Search
Document Center

Alibaba Cloud Model Studio:Deep Research (Qwen-Deep-Research)

Last Updated:Mar 11, 2026

Pencarian manual tradisional memakan waktu dan tenaga untuk topik riset yang kompleks. Large Language Models (LLMs) yang dikombinasikan dengan pencarian web sering kali kesulitan melakukan analisis mendalam dan sistematis. Model Deep Research (Qwen-Deep-Research) secara otomatis merancang langkah-langkah penelitian, melakukan beberapa putaran pencarian mendalam serta integrasi informasi, lalu menghasilkan laporan riset terstruktur.

Catatan

Dokumen ini hanya berlaku untuk wilayah Tiongkok daratan (Beijing). Untuk menggunakan model ini, gunakan API key dari wilayah Tiongkok daratan (Beijing).

Memulai

Dapatkan API key dan ekspor API key sebagai Variabel lingkungan. Jika Anda menggunakan SDK untuk melakukan panggilan, instal DashScope SDK.

Model ini menggunakan alur kerja dua langkah: konfirmasi kueri (untuk memperjelas cakupan riset) dan riset mendalam (untuk melakukan pencarian dan menghasilkan laporan). Contoh berikut menunjukkan alur panggilan lengkap, termasuk kedua langkah tersebut.

Saat ini, model hanya dapat dipanggil melalui DashScope SDK. Versi Java dari DashScope SDK tidak didukung, begitu pula panggilan API kompatibel dengan OpenAI.
import os
import dashscope

# Konfigurasikan API key
# Jika variabel lingkungan belum dikonfigurasi, ganti baris berikut dengan Kunci API Model Studio Anda: API_KEY = "sk-xxx"
API_KEY = os.getenv('DASHSCOPE_API_KEY')

def call_deep_research_model(messages, step_name):
    print(f"\n=== {step_name} ===")
    
    try:
        responses = dashscope.Generation.call(
            api_key=API_KEY,
            model="qwen-deep-research",
            messages=messages,
            # Model qwen-deep-research saat ini hanya mendukung keluaran streaming
            stream=True
            # incremental_output=True Tambahkan parameter ini untuk keluaran inkremental
        )
        
        return process_responses(responses, step_name)
        
    except Exception as e:
        print(f"Terjadi error saat memanggil API: {e}")
        return ""


# Menampilkan konten fase
def display_phase_content(phase, content, status):
    if content:
        print(f"\n[{phase}] {status}: {content}")
    else:
        print(f"\n[{phase}] {status}")

# Memproses respons
def process_responses(responses, step_name):
    current_phase = None
    phase_content = ""
    research_goal = ""
    web_sites = []
    references = []
    keepalive_shown = False  # Bendera untuk memeriksa apakah prompt KeepAlive telah ditampilkan

    for response in responses:
        # Periksa kode status respons
        if hasattr(response, 'status_code') and response.status_code != 200:
            print(f"Kode HTTP: {response.status_code}")
            if hasattr(response, 'code'):
                print(f"Kode error: {response.code}")
            if hasattr(response, 'message'):
                print(f"Pesan error: {response.message}")
            print("Untuk informasi lebih lanjut, lihat: https://www.alibabacloud.com/help/zh/model-studio/error-code")
            continue

        if hasattr(response, 'output') and response.output:
            message = response.output.get('message', {})
            phase = message.get('phase')
            content = message.get('content', '')
            status = message.get('status')
            extra = message.get('extra', {})

            # Deteksi perubahan fase
            if phase != current_phase:
                if current_phase and phase_content:
                    # Tampilkan deskripsi penyelesaian berbeda berdasarkan fase dan nama langkah
                    if step_name == "Step 1: Model query confirmation" and current_phase == "answer":
                        print(f"\n Fase konfirmasi kueri selesai")
                    else:
                        print(f"\n Fase {current_phase} selesai")
                current_phase = phase
                phase_content = ""
                keepalive_shown = False  # Reset bendera prompt KeepAlive

                # Tampilkan deskripsi berbeda berdasarkan fase dan nama langkah
                if step_name == "Step 1: Model query confirmation" and phase == "answer":
                    print(f"\n Memasuki fase konfirmasi kueri")
                else:
                    print(f"\n Memasuki fase {phase}")
                    
            # Proses informasi referensi pada fase Answer
            if phase == "answer":
                if extra.get('deep_research', {}).get('references'):
                    new_references = extra['deep_research']['references']
                    if new_references and new_references != references:  # Hindari tampilan duplikat
                        references = new_references
                        print(f"\n   Referensi ({len(references)}):")
                        for i, ref in enumerate(references, 1):
                            print(f"     {i}. {ref.get('title', 'Tanpa judul')}")
                            if ref.get('url'):
                                print(f"        URL: {ref['url']}")
                            if ref.get('description'):
                                print(f"        Deskripsi: {ref['description'][:100]}...")
                            print()

            # Proses informasi khusus pada fase WebResearch
            # Catatan: Model qwen-deep-research-2025-12-15 menggunakan status streamingThinking
            # bukan streamingQueries dan streamingWebResult
            if phase == "WebResearch":
                if extra.get('deep_research', {}).get('research'):
                    research_info = extra['deep_research']['research']

                    # Proses status streamingThinking (model snapshot) atau streamingQueries (model mainline)
                    if status in ("streamingThinking", "streamingQueries"):
                        if 'researchGoal' in research_info:
                            goal = research_info['researchGoal']
                            if goal:
                                research_goal += goal
                                print(f"\n   Tujuan riset: {goal}", end='', flush=True)

                    # Proses status streamingWebResult (model mainline)
                    # Model snapshot menggabungkan status ini menggunakan streamingThinking
                    elif status == "streamingWebResult":
                        if 'webSites' in research_info:
                            sites = research_info['webSites']
                            if sites and sites != web_sites:  # Hindari tampilan duplikat
                                web_sites = sites
                                print(f"\n   Ditemukan {len(sites)} situs web relevan:")
                                for i, site in enumerate(sites, 1):
                                    print(f"     {i}. {site.get('title', 'Tanpa judul')}")
                                    print(f"        Deskripsi: {site.get('description', 'Tanpa deskripsi')[:100]}...")
                                    print(f"        URL: {site.get('url', 'Tanpa tautan')}")
                                    if site.get('favicon'):
                                        print(f"        Ikon: {site['favicon']}")
                                    print()

                    # Proses status WebResultFinished
                    elif status == "WebResultFinished":
                        print(f"\n   Pencarian web selesai. Ditemukan {len(web_sites)} sumber referensi.")
                        if research_goal:
                            print(f"   Tujuan riset: {research_goal}")

            # Akumulasi dan tampilkan konten
            if content:
                phase_content += content
                # Tampilkan konten secara real-time
                print(content, end='', flush=True)

            # Tampilkan perubahan status fase
            if status and status != "typing":
                print(f"\n   Status: {status}")

                # Tampilkan deskripsi status
                if status == "streamingThinking":
                    print("   → Mendekomposisi tugas riset dan meringkas konten web (fase WebResearch)")
                elif status == "streamingQueries":
                    print("   → Menghasilkan tujuan riset dan kueri pencarian (fase WebResearch)")
                elif status == "streamingWebResult":
                    print("   → Melakukan pencarian, membaca halaman web, dan eksekusi kode (fase WebResearch)")
                elif status == "WebResultFinished":
                    print("   → Fase pencarian web selesai (fase WebResearch)")

            # Saat status finished, tampilkan statistik konsumsi token
            if status == "finished":
                if hasattr(response, 'usage') and response.usage:
                    usage = response.usage
                    print(f"\n    Statistik konsumsi token:")
                    print(f"      Token input: {usage.get('input_tokens', 0)}")
                    print(f"      Token output: {usage.get('output_tokens', 0)}")
                    print(f"      ID permintaan: {response.get('request_id', 'Tidak diketahui')}")

            if phase == "KeepAlive":
                # Hanya tampilkan prompt saat pertama kali memasuki fase KeepAlive
                if not keepalive_shown:
                    print("Langkah saat ini selesai. Mempersiapkan langkah berikutnya.")
                    keepalive_shown = True
                continue

    if current_phase and phase_content:
        if step_name == "Step 1: Model query confirmation" and current_phase == "answer":
            print(f"\n Fase konfirmasi kueri selesai")
        else:
            print(f"\n Fase {current_phase} selesai")

    return phase_content

def main():
    # Periksa API key
    if not API_KEY:
        print("Error: Variabel lingkungan DASHSCOPE_API_KEY belum diatur")
        print("Atur variabel lingkungan atau ubah langsung variabel API_KEY dalam kode")
        return
    
    print("Pengguna memulai percakapan: Riset penerapan artificial intelligence dalam pendidikan")
    
    # Langkah 1: Konfirmasi kueri model
    # Model menganalisis pertanyaan pengguna dan mengajukan pertanyaan klarifikasi untuk menentukan arah riset
    messages = [{'role': 'user', 'content': 'Riset penerapan artificial intelligence dalam pendidikan'}]
    step1_content = call_deep_research_model(messages, "Step 1: Model query confirmation")

    # Langkah 2: Riset mendalam
    # Berdasarkan konfirmasi kueri dari Langkah 1, model menjalankan proses riset lengkap
    messages = [
        {'role': 'user', 'content': 'Riset penerapan artificial intelligence dalam pendidikan'},
        {'role': 'assistant', 'content': step1_content},  # Menyertakan konten konfirmasi kueri dari model
        {'role': 'user', 'content': 'Saya terutama fokus pada pembelajaran personalisasi dan penilaian cerdas'}
    ]
    
    call_deep_research_model(messages, "Step 2: Deep research")
    print("\n Riset selesai!")

if __name__ == "__main__":
    main()
echo "Step 1: Model query confirmation"
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": "Research the application of artificial intelligence in education", 
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

echo -e "\n\n" 
echo "Step 2: Deep research"
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": "Research the application of artificial intelligence in education", 
                "role": "user"
            },
            {
                "content": "Tell me which specific application scenarios of artificial intelligence in education you want to focus on?", 
                "role": "assistant"
            },
            {
                "content": "I mainly focus on personalized learning", 
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

Daftar Model

Nama Model

Panjang Konteks (Token)

Input Maks (Token)

Output Maks (Token)

qwen-deep-research

1.000.000

997.952

32.768

qwen-deep-research-2025-12-15

Catatan

qwen-deep-research adalah model mainline yang terus diperbarui dan dioptimalkan. qwen-deep-research-2025-12-15 adalah versi snapshot yang menawarkan kedalaman riset dan kualitas laporan lebih baik, serta mendukung kemampuan MCP tool calling. Kedua model mendukung image input. Keduanya ditagih secara terpisah.

Kemampuan Inti

Model menggunakan bidang phase dan status untuk menampilkan alur kerja. phase menunjukkan tugas inti yang sedang dieksekusi, sedangkan status menunjukkan progres internal dari tugas tersebut.

Konfirmasi Kueri dan Pembuatan Laporan (phase: "answer")

Model menganalisis pertanyaan awal pengguna dan mengajukan pertanyaan klarifikasi untuk mengonfirmasi cakupan riset. Fase ini juga digunakan selama pembuatan laporan akhir.

Perubahan status:

  • typing: Menghasilkan konten teks

  • finished: Pembuatan konten teks selesai

Perencanaan Riset (phase: "ResearchPlanning")

Anda dapat mengembangkan kerangka riset berdasarkan kebutuhan pengguna.

Perubahan status:

  • typing: Menghasilkan rencana riset

  • finished: Rencana riset selesai

Pencarian Web (phase: "WebResearch")

Model melakukan beberapa putaran pencarian dan memproses informasi. Status WebResultFinished dikembalikan di akhir setiap putaran pencarian. Status finished dikembalikan setelah seluruh fase selesai.

Perubahan status:

  • streamingThinking: Mendekomposisi tugas riset dan meringkas konten web (khusus untuk model qwen-deep-research-2025-12-15, menggantikan streamingQueries dan streamingWebResult)

  • streamingQueries: Menghasilkan kueri pencarian (hanya untuk model qwen-deep-research)

  • streamingWebResult: Melakukan pencarian web dan menganalisis konten web (hanya untuk model qwen-deep-research)

  • WebResultFinished: Satu putaran pencarian selesai

  • finished: Fase pencarian web selesai

Koneksi Persisten (phase: "KeepAlive")

Fase ini dikirim selama interval tugas panjang untuk mempertahankan koneksi. Fase ini tidak berisi konten bisnis dan dapat diabaikan.

Image Input

Model Deep Research mendukung pengiriman gambar dalam pesan pengguna. Model memahami konten gambar dan melakukan riset serta analisis mendalam berdasarkan gambar tersebut. Saat mengirim gambar, bidang content harus menggunakan format array, termasuk objek image dan text.

  • Model mendukung format gambar umum, seperti JPEG, PNG, BMP, dan WEBP. Ukuran satu gambar tidak boleh melebihi 10 MB.

  • Satu permintaan dapat menyertakan hingga 5 gambar. URL jaringan publik dan encoding Base64 didukung.

  • Format respons konsisten dengan permintaan teks biasa. Model melakukan riset berdasarkan konten gambar dan mengembalikan laporan.

Contoh Permintaan

import os
import dashscope

API_KEY = os.getenv('DASHSCOPE_API_KEY')

messages = [
    {
        "role": "user",
        "content": [
            {"image": "https://example.aliyuncs.com/example.png"},
            {"text": "Analisis tren data dalam grafik ini dan lakukan riset mendalam terhadap temuan utama"}
        ]
    }
]

responses = dashscope.Generation.call(
    api_key=API_KEY,
    model="qwen-deep-research",
    messages=messages,
    stream=True
)

for response in responses:
    if hasattr(response, 'output') and response.output:
        message = response.output.get('message', {})
        content = message.get('content', '')
        if content:
            print(content, end='', flush=True)
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": [
                    {"image": "https://example.aliyuncs.com/example.png"},
                    {"text": "Analyze the data trends in this chart and conduct in-depth research on key findings"}
                ],
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

MCP Tool Calling

Catatan

MCP tool calling hanya didukung oleh model qwen-deep-research-2025-12-15. Model mainline qwen-deep-research tidak mendukung fitur ini.

Model qwen-deep-research-2025-12-15 mendukung akses ke layanan MCP (Model Context Protocol) melalui parameter research_tools, memungkinkan model memanggil tool eksternal untuk pengambilan informasi selama riset. Format respons konsisten dengan panggilan standar. Model memanggil tool tertentu melalui MCP Server selama fase WebResearch.

research_tools dan spesifikasi tool MCP, lihat Qwen-Deep-Research Deep Research Model.

Contoh Permintaan

import os
import dashscope

API_KEY = os.getenv('DASHSCOPE_API_KEY')

messages = [
    {
        "role": "user",
        "content": "Gunakan basis pengetahuan untuk mencari pengumuman pembaruan produk yang baru diterbitkan dan susun menjadi laporan riset"
    }
]

responses = dashscope.Generation.call(
    api_key=API_KEY,
    model="qwen-deep-research-2025-12-15",
    messages=messages,
    stream=True,
    enable_feedback=False,
    research_tools=[{
        "type": "mcp",
        "server_label": "my-server",
        "server_url": "https://your-mcp-server.example.com/sse",
        "allowed_tools": ["search", "fetch"],
        "authentication": {
            "bearer": "your_jwt_token_here"
        }
    }]
)

for response in responses:
    if hasattr(response, 'output') and response.output:
        message = response.output.get('message', {})
        content = message.get('content', '')
        if content:
            print(content, end='', flush=True)
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": "Use the knowledge base to search for recently published product update announcements and compile them into a research report",
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research-2025-12-15",
    "parameters": {
        "enable_feedback": false,
        "research_tools": [{
            "type": "mcp",
            "server_label": "my-server",
            "server_url": "https://your-mcp-server.example.com/sse",
            "allowed_tools": ["search", "fetch"],
            "authentication": {
                "bearer": "your_jwt_token_here"
            }
        }]
    }
}'

Penagihan

Nama Model

Biaya Input (per 1.000 Token)

Biaya Output (per 1.000 Token)

Kuota Gratis

qwen-deep-research

$0,007742

$0,023367

Tidak ada kuota gratis

qwen-deep-research-2025-12-15

Akan ditentukan

Akan ditentukan

Tidak ada kuota gratis

Metode Penagihan: Penagihan berdasarkan jumlah total token input dan output. Token input mencakup konten pesan pengguna dan prompt sistem bawaan model. Token output mencakup semua konten yang dihasilkan, seperti konfirmasi kueri, rencana riset, tujuan riset, kueri pencarian, dan laporan riset akhir.

Going Live

Pemrosesan Keluaran Streaming

Model hanya mendukung keluaran streaming (stream=True). Saat memproses respons, uraikan dengan benar bidang phase dan status untuk menentukan fase saat ini dan status penyelesaiannya.

Penanganan Error

Periksa kode status respons. Tangani error untuk status non-200. Pada tahap awal respons streaming, beberapa blok respons mungkin hanya berisi metadata. Blok selanjutnya akan berisi konten aktual.

Pemantauan Konsumsi Token

Saat status bernilai finished, ambil statistik konsumsi token melalui response.usage, termasuk token input, token output, dan ID permintaan.

Manajemen Koneksi

Model mungkin mengirim respons fase KeepAlive selama interval tugas panjang untuk mempertahankan koneksi. Abaikan konten fase ini dan lanjutkan memproses respons berikutnya.

FAQ

  • Mengapa output dari beberapa blok respons kosong?

    Pada tahap awal respons streaming, beberapa blok respons mungkin hanya berisi metadata. Blok selanjutnya akan berisi konten aktual.

  • Bagaimana cara menentukan apakah suatu fase telah selesai?

    Saat bidang status bernilai "finished", fase saat ini telah selesai.

  • Apakah model mendukung panggilan API kompatibel dengan OpenAI?

    Saat ini, model tidak mendukung panggilan API kompatibel dengan OpenAI.

  • Bagaimana perhitungan jumlah token input dan output untuk model?

    Token input mencakup konten pesan pengguna dan prompt sistem bawaan model, seperti pertanyaan pengguna, jawaban pengguna, dan prompt sistem. Token output mencakup semua konten yang dihasilkan model sepanjang proses riset, seperti konten konfirmasi kueri, rencana riset, tujuan riset, kueri pencarian, dan laporan riset akhir.

  • Apa perbedaan antara qwen-deep-research dan qwen-deep-research-2025-12-15?

    qwen-deep-research adalah model mainline yang terus diperbarui. qwen-deep-research-2025-12-15 adalah versi snapshot dengan performa lebih baik dan dukungan tambahan untuk kemampuan MCP tool calling. Kedua model mendukung image input. Keduanya ditagih secara terpisah, dan versi snapshot sedikit lebih mahal dibandingkan versi mainline.

  • Bagaimana cara mengirim gambar untuk riset?

    Atur bidang content ke format array, termasuk {"image": "URL Gambar"} dan {"text": "Deskripsi teks"}. Kedua model mendukung image input.

  • Bagaimana cara melewati konfirmasi kueri dan membuat model langsung melanjutkan ke riset?

    Atur enable_feedback ke false dalam parameters untuk melewati fase konfirmasi kueri. Model kemudian akan langsung melanjutkan ke proses riset.

Referensi API

Untuk parameter input dan output model Qwen-Deep-Research, lihat Qwen-Deep-Research Deep Research Model.

Kode Error

Jika panggilan model gagal dan mengembalikan pesan error, lihat Pesan error untuk penyelesaian.

Pembatasan Laju

Untuk kondisi pemicu pembatasan laju model, lihat: Pembatasan Laju.