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.
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 |
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 modelqwen-deep-research-2025-12-15, menggantikanstreamingQueriesdanstreamingWebResult) -
streamingQueries: Menghasilkan kueri pencarian (hanya untuk modelqwen-deep-research) -
streamingWebResult: Melakukan pencarian web dan menganalisis konten web (hanya untuk modelqwen-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
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
outputdari 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
statusbernilai "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-researchadalah model mainline yang terus diperbarui.qwen-deep-research-2025-12-15adalah 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
contentke 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_feedbackkefalsedalamparametersuntuk 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.