全部产品
Search
文档中心

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

更新时间:Jan 27, 2026

Qwen-Deep-Research mengotomatiskan tugas penelitian kompleks dengan merancang langkah-langkah penelitian, melakukan beberapa putaran pencarian web, dan menghasilkan laporan penelitian terstruktur. Layanan ini mampu mengumpulkan dan mensintesis informasi mengenai topik kompleks tanpa intervensi manual.

Catatan

Dokumen ini hanya berlaku untuk wilayah China (Beijing). Gunakan API key dari wilayah China (Beijing).

Mulai menggunakan

Prasyarat

Model ini menggunakan alur kerja dua langkah:

  • Pertanyaan lanjutan: Model menganalisis kueri awal Anda dan mengajukan pertanyaan klarifikasi untuk menentukan cakupan penelitian.

  • Penelitian mendalam: Berdasarkan respons Anda, model melakukan pencarian web, menganalisis konten, dan menghasilkan laporan penelitian terstruktur.

Saat ini, model tidak mendukung DashScope SDK untuk Java maupun API yang kompatibel dengan OpenAI.
import os
import dashscope

# Konfigurasikan 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')

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 kesalahan 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 respons 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', 'No title')}")
                            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', 'No title')}")
                                    print(f"        Deskripsi: {site.get('description', 'No description')[:100]}...")
                                    print(f"        URL: {site.get('url', 'No link')}")
                                    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}")

            # Mengakumulasi 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', 'Unknown')}")

            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 disetel.")
        print("Setel variabel lingkungan atau ubah langsung variabel API_KEY dalam kode.")
        return
    
    print("Pengguna memulai percakapan: Teliti penerapan artificial intelligence dalam pendidikan")
    
    # Langkah 1: Pertanyaan lanjutan model untuk konfirmasi
    # 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")

    # Langkah 2: Penelitian mendalam
    # 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"
}'

Kemampuan inti

Model menggunakan bidang phase dan status untuk menunjukkan progres.

Fase

Fase

Deskripsi fase

Status

Deskripsi status

answer

Menghasilkan pertanyaan lanjutan atau laporan akhir

typing

Menghasilkan teks

finished

Generasi teks selesai

ResearchPlanning

Membuat kerangka penelitian

typing

Menghasilkan rencana penelitian

finished

Rencana penelitian selesai

WebResearch

Pencarian web dan analisis konten

streamingQueries

Menghasilkan kueri pencarian

streamingWebResult

Menjalankan pencarian web dan menganalisis konten halaman

WebResultFinished

Pencarian web dan ekstraksi informasi selesai

KeepAlive

Dikirim di antara tugas berdurasi panjang untuk mempertahankan koneksi. Abaikan fase ini

Spesifikasi

Model

Jendela konteks (Token)

Input maksimum (Token)

Output maksimum (Token)

qwen-deep-research

1.000.000

997.952

32.768

Penagihan

Model

Harga input (per 1K token)

Harga output (per 1K token)

Kuota gratis

qwen-deep-research

$0,007742

$0,023367

Tidak ada kuota gratis

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

Produksi

Menangani keluaran streaming

Model hanya mendukung streaming output (stream=True). Uraikan bidang phase dan status untuk melacak progres.

Menangani error

Periksa kode status respons untuk status selain 200.

Memantau penggunaan token

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

FAQ

  • Mengapa bidang output kosong pada beberapa chunk respons?

    Chunk streaming awal mungkin hanya berisi metadata. Chunk berikutnya berisi konten aktual.

  • Bagaimana cara menentukan apakah suatu fase telah selesai?

    Suatu fase dianggap selesai ketika bidang status berubah menjadi "finished".

  • Apakah model mendukung panggilan API yang kompatibel dengan OpenAI?

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

  • Bagaimana perhitungan token input dan output?

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

Referensi API

Referensi API Qwen-Deep-Research.

Kode error

Jika pemanggilan gagal, lihat Pesan error untuk troubleshooting.