全部产品
Search
文档中心

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

更新时间:Dec 04, 2025

Pencarian manual tradisional untuk topik kompleks memakan waktu, dan model yang menggabungkan pencarian web sering kesulitan melakukan analisis mendalam serta sistematis. Qwen-Deep-Research mengotomatiskan proses ini dengan merancang langkah-langkah penelitian, melakukan beberapa putaran pencarian mendalam, mengintegrasikan informasi, serta menghasilkan laporan penelitian terstruktur.

Penting

Dokumen ini hanya berlaku untuk wilayah China (Beijing). Untuk menggunakan model ini, Anda harus menggunakan API key dari wilayah China (Beijing).

Mulai

Anda harus mendapatkan API key dan menyetel API key sebagai variabel lingkungan. Jika Anda menggunakan SDK untuk melakukan panggilan, Anda juga harus menginstal DashScope SDK.

Model ini menggunakan alur kerja dua langkah: pertanyaan lanjutan untuk mengklarifikasi cakupan penelitian, dan penelitian mendalam untuk melakukan pencarian serta menghasilkan laporan.

Saat ini, model ini hanya mendukung DashScope SDK. Java DashScope SDK dan API kompatibel OpenAI tidak didukung.
import os
import dashscope

# Konfigurasikan API key
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Model Studio API key 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 streaming output
            stream=True
            # Untuk menggunakan output inkremental, tambahkan parameter incremental_output=True
        )
        
        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 balasan 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/en/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', {})

            # Mendeteksi perubahan fase
            if phase != current_phase:
                if current_phase and phase_content:
                    # Menampilkan deskripsi penyelesaian berbeda berdasarkan nama fase dan nama langkah
                    if step_name == "Step 1: Model follow-up question for confirmation" and current_phase == "answer":
                        print(f"\n Fase pertanyaan lanjutan model selesai")
                    else:
                        print(f"\n Fase {current_phase} selesai")
                current_phase = phase
                phase_content = ""
                keepalive_shown = False  # Mengatur ulang bendera prompt KeepAlive

                # Menampilkan deskripsi berbeda berdasarkan nama fase dan nama langkah
                if step_name == "Step 1: Model follow-up question for confirmation" and phase == "answer":
                    print(f"\n Memasuki fase pertanyaan lanjutan model")
                else:
                    print(f"\n Memasuki fase {phase}")
                    
            # Memproses informasi referensi untuk 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', 'Tidak ada judul')}")
                            if ref.get('url'):
                                print(f"        URL: {ref['url']}")
                            if ref.get('description'):
                                print(f"        Deskripsi: {ref['description'][:100]}...")
                            print()

            # Memproses informasi khusus untuk fase WebResearch
            if phase == "WebResearch":
                if extra.get('deep_research', {}).get('research'):
                    research_info = extra['deep_research']['research']

                    # Memproses status streamingQueries
                    if status == "streamingQueries":
                        if 'researchGoal' in research_info:
                            goal = research_info['researchGoal']
                            if goal:
                                research_goal += goal
                                print(f"\n   Tujuan penelitian: {goal}", end='', flush=True)

                    # Memproses status streamingWebResult
                    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', 'Tidak ada judul')}")
                                    print(f"        Deskripsi: {site.get('description', 'Tidak ada deskripsi')[:100]}...")
                                    print(f"        URL: {site.get('url', 'Tidak ada tautan')}")
                                    if site.get('favicon'):
                                        print(f"        Ikon: {site['favicon']}")
                                    print()

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

            # Mengumpulkan dan menampilkan konten
            if content:
                phase_content += content
                # Menampilkan konten secara real-time
                print(content, end='', flush=True)

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

                # Menampilkan deskripsi status
                if status == "streamingQueries":
                    print("   → Menghasilkan tujuan penelitian 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 adalah 'finished', tampilkan penggunaan token
            if status == "finished":
                if hasattr(response, 'usage') and response.usage:
                    usage = response.usage
                    print(f"\n    Statistik penggunaan 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":
                # Tampilkan prompt hanya 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 follow-up question for confirmation" and current_phase == "answer":
            print(f"\n Fase pertanyaan lanjutan model 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 modifikasi langsung variabel API_KEY dalam kode.")
        return
    
    print("Pengguna memulai percakapan: Teliti penerapan artificial intelligence dalam pendidikan")
    
    # Step 1: Model follow-up question for confirmation
    # Model menganalisis pertanyaan pengguna dan mengajukan pertanyaan lanjutan untuk mengklarifikasi arah penelitian.
    messages = [{'role': 'user', 'content': 'Teliti penerapan artificial intelligence dalam pendidikan'}]
    step1_content = call_deep_research_model(messages, "Step 1: Model follow-up question for confirmation")

    # Step 2: Deep research
    # Berdasarkan konten pertanyaan lanjutan pada Langkah 1, model menjalankan proses penelitian lengkap.
    messages = [
        {'role': 'user', 'content': 'Teliti penerapan artificial intelligence dalam pendidikan'},
        {'role': 'assistant', 'content': step1_content},  # Berisi pertanyaan lanjutan model
        {'role': 'user', 'content': 'Saya terutama tertarik pada pembelajaran personalisasi dan penilaian cerdas.'}
    ]
    
    call_deep_research_model(messages, "Step 2: Deep research")
    print("\n Penelitian selesai!")

if __name__ == "__main__":
    main()
echo "Step 1: Model follow-up question for 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 applications 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 applications of artificial intelligence in education", 
                "role": "user"
            },
            {
                "content": "Which specific application scenarios of artificial intelligence in education would you like to focus on?", 
                "role": "assistant"
            },
            {
                "content": "I am mainly interested in personalized learning.", 
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

Ketersediaan model

Model

Jendela konteks (Token)

Input maksimum (Token)

Output maksimum (Token)

qwen-deep-research

1.000.000

997.952

32.768

Kemampuan inti

Model ini menggunakan bidang phase dan status untuk menunjukkan status alur kerjanya. Bidang phase menunjukkan tugas inti saat ini, sedangkan bidang status menunjukkan progres tugas tersebut.

Pertanyaan Lanjutan dan Pembuatan Laporan (phase: "answer")

Model menganalisis pertanyaan awal pengguna dan mengajukan pertanyaan lanjutan untuk mengonfirmasi cakupan penelitian. Fase ini digunakan kembali saat laporan akhir dihasilkan.

Perubahan status:

  • typing: Menghasilkan konten teks.

  • finished: Generasi teks selesai.

Perencanaan Penelitian (phase: "ResearchPlanning")

Fase ini membuat kerangka penelitian berdasarkan kebutuhan pengguna.

Perubahan status:

  • typing: Menghasilkan rencana penelitian.

  • finished: Rencana penelitian selesai.

Pencarian Web (phase: "WebResearch")

Pada fase ini, model melakukan pencarian dan memproses informasi.

Perubahan status:

  • streamingQueries: Menghasilkan kueri pencarian.

  • streamingWebResult: Melakukan pencarian web dan menganalisis konten halaman.

  • WebResultFinished: Pencarian web dan ekstraksi informasi selesai.

Koneksi Persisten (phase: "KeepAlive")

Pesan ini dikirim di antara tugas-tugas berdurasi panjang untuk mempertahankan koneksi. Fase ini tidak berisi konten bisnis dan dapat diabaikan.

Informasi penagihan

Model

Harga input (per seribu token)

Harga output (per seribu token)

Kuota gratis

qwen-deep-research

$0,007742

$0,023367

Tidak ada kuota gratis

Metode Penagihan: Penagihan didasarkan pada jumlah total token input dan output. Token input mencakup konten pesan pengguna dan prompt sistem bawaan model. Token output mencakup seluruh konten yang dihasilkan, seperti pertanyaan lanjutan, rencana penelitian, tujuan penelitian, kueri pencarian, dan laporan penelitian akhir.

Siap produksi

Menangani keluaran streaming

Model ini hanya mendukung streaming output (stream=True). Saat memproses respons, Anda harus mengurai bidang phase dan status untuk menentukan fase saat ini dan status penyelesaiannya.

Menangani kesalahan

Periksa kode status respons dan tangani error apa pun untuk status non-200. Pada tahap awal respons streaming, beberapa chunk respons mungkin hanya berisi metadata. Chunk berikutnya berisi konten aktual.

Memantau Konsumsi Token

Saat status bernilai finished, Anda dapat mengambil statistik konsumsi token dari response.usage. Statistik ini mencakup jumlah token input, token output, dan ID permintaan.

Mengelola Koneksi

Model mungkin mengirim respons fase KeepAlive di antara tugas-tugas berdurasi panjang untuk mempertahankan koneksi. Anda dapat mengabaikan konten fase ini dan melanjutkan pemrosesan respons berikutnya.

FAQ

  • Mengapa bidang output kosong pada beberapa chunk respons?

    Pada tahap awal respons streaming, beberapa chunk respons mungkin hanya berisi metadata. Chunk berikutnya berisi konten aktual.

  • Bagaimana cara menentukan apakah suatu fase telah selesai?

    Fase dianggap selesai ketika bidang status berubah menjadi "finished".

  • Apakah model ini mendukung panggilan API kompatibel OpenAI?

    Tidak, model ini saat ini tidak mendukung panggilan API kompatibel OpenAI.

  • Bagaimana perhitungan jumlah token input dan output?

    Token input mencakup konten pesan yang dikirim pengguna dan prompt sistem bawaan model. Token output mencakup seluruh konten yang dihasilkan model selama proses penelitian, seperti pertanyaan lanjutan, rencana penelitian, tujuan penelitian, kueri pencarian, dan laporan penelitian akhir.

Referensi API

Untuk parameter input dan output Qwen-Deep-Research, lihat Referensi API Qwen-Deep-Research.

Kode error

Jika panggilan gagal, lihat Pesan error untuk troubleshooting.

Pembatasan laju

Untuk informasi tentang pembatasan laju, lihat Batas laju.