Mengotomatisasi penelitian kompleks melalui perencanaan, beberapa putaran pencarian web, dan pembuatan laporan terstruktur, serta mengumpulkan dan mensintesis informasi tanpa upaya manual.
CatatanDokumen 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: langkah pertanyaan lanjutan (model mengklarifikasi cakupan penelitian Anda) dan langkah deep research (model melakukan pencarian, analisis, dan menghasilkan laporan). Pertanyaan lanjutan memungkinkan model memahami secara tepat apa yang harus diteliti sebelum memulai proses penelitian yang panjang.
Saat ini, model tidak mendukung DashScope SDK untuk Java atau panggilan API yang kompatibel dengan OpenAI.
import os
import dashscope
# 以下为华北2(北京)地域的URL,各地域的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'
# Konfigurasikan API key
# Jika tidak disetel, ganti baris berikut dengan Kunci API Model Studio Anda (format: 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 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', {})
# Deteksi perubahan fase
if phase != current_phase:
if current_phase and phase_content:
# Menampilkan 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
# Menampilkan 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}")
# Memproses informasi referensi dalam 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 dalam fase WebResearch
# Catatan: Model qwen-deep-research-2025-12-15 menggunakan status streamingThinking
# alih-alih streamingQueries dan streamingWebResult
if phase == "WebResearch":
if extra.get('deep_research', {}).get('research'):
research_info = extra['deep_research']['research']
# Memproses 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 penelitian: {goal}", end='', flush=True)
# Memproses 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', '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}")
# 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 == "streamingThinking":
print(" → Mendekomposisi tugas penelitian dan meringkas konten web (fase WebResearch)")
elif 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 finished, tampilkan 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 disetel")
print("Setel variabel lingkungan atau modifikasi variabel API_KEY langsung di kode")
return
print("Pengguna memulai percakapan: Teliti penerapan artificial intelligence dalam pendidikan")
# Langkah 1: Konfirmasi kueri model
# Model menganalisis pertanyaan pengguna dan mengajukan pertanyaan klarifikasi untuk menentukan arah penelitian
messages = [{'role': 'user', 'content': 'Teliti penerapan artificial intelligence dalam pendidikan'}]
step1_content = call_deep_research_model(messages, "Step 1: Model query confirmation")
# Langkah 2: Deep research
# Berdasarkan konfirmasi kueri dari Langkah 1, model melakukan proses penelitian lengkap
messages = [
{'role': 'user', 'content': 'Teliti penerapan artificial intelligence dalam pendidikan'},
{'role': 'assistant', 'content': step1_content}, # Menyertakan konten konfirmasi kueri model
{'role': 'user', 'content': 'Saya terutama fokus 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 query confirmation"
# 以下为华北2(北京)地域的URL,各地域的URL不同。
curl --location 'https://{WorkspaceId}.cn-beijing.maas.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": "Teliti penerapan artificial intelligence dalam pendidikan",
"role": "user"
}
]
},
"model": "qwen-deep-research"
}'
echo -e "\n\n"
echo "Step 2: Deep research"
# 以下为华北2(北京)地域的URL,各地域的URL不同。
curl --location 'https://{WorkspaceId}.cn-beijing.maas.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": "Teliti penerapan artificial intelligence dalam pendidikan",
"role": "user"
},
{
"content": "Beritahu saya skenario penerapan spesifik artificial intelligence dalam pendidikan yang ingin Anda fokuskan?",
"role": "assistant"
},
{
"content": "Saya terutama fokus pada pembelajaran personalisasi",
"role": "user"
}
]
},
"model": "qwen-deep-research"
}'
Spesifikasi
Model | Jendela konteks (token) | Input maksimum (token) | Output maksimum (token) |
|---|---|---|---|
qwen-deep-research | 1.000.000 | 997.952 | 32.768 |
qwen-deep-research-2025-12-15 |
Catatanqwen-deep-research: model mainline yang terus diperbarui. qwen-deep-research-2025-12-15: versi snapshot dengan kedalaman, kualitas, dan MCP tool calling yang ditingkatkan. Keduanya mendukung image input dan ditagih secara terpisah.
Kemampuan inti
Lacak kemajuan melalui phase (tugas saat ini) dan status (kemajuan tugas).
Menganalisis kueri Anda, mengajukan pertanyaan klarifikasi untuk menentukan cakupan, dan menghasilkan laporan penelitian akhir.
Nilai status:
typing: Menghasilkan konten teksfinished: Pembuatan konten teks selesai
Membuat kerangka penelitian dari kueri Anda.
Nilai status:
typing: Menghasilkan rencana penelitianfinished: Rencana penelitian selesai
Menjalankan beberapa putaran pencarian web dan analisis konten. WebResultFinished menandakan akhir setiap putaran. finished menandakan akhir fase.
Nilai status:
streamingThinking: Mendekomposisi tugas penelitian dan meringkas konten web (khusus untukqwen-deep-research-2025-12-15, menggantikanstreamingQueriesdanstreamingWebResult)streamingQueries: Menghasilkan kueri pencarian (hanya untukqwen-deep-research)streamingWebResult: Melakukan pencarian web dan menganalisis konten web (hanya untukqwen-deep-research)WebResultFinished: Putaran pencarian selesaifinished: Fase pencarian web selesai
Koneksi keepalive (fase: "KeepAlive")
Mempertahankan koneksi antara tugas-tugas berdurasi panjang. Abaikan fase ini dan lanjutkan pemrosesan.
Image input
Kedua model mendukung image input. Model menganalisis gambar dan memasukkan konten tersebut ke dalam penelitiannya. Gunakan format array untuk bidang content, dengan melewatkan objek image dan text bersamaan.
- Format yang didukung: JPEG, PNG, BMP, WEBP. Maksimal 10 MB per gambar.
- Maksimal 5 gambar per permintaan. Mendukung URL publik dan encoding Base64.
- Format respons identik dengan permintaan teks saja. Model menghasilkan laporan berdasarkan konten gambar.
import os
import dashscope
# 以下为华北2(北京)地域的URL,各地域的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'
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 penelitian mendalam mengenai temuan utamanya"}
]
}
]
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://{WorkspaceId}.cn-beijing.maas.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": "Analisis tren data dalam grafik ini dan lakukan penelitian mendalam mengenai temuan utamanya"}
],
"role": "user"
}
]
},
"model": "qwen-deep-research"
}'
MCP tool calling
CatatanMCP tool calling hanya didukung oleh qwen-deep-research-2025-12-15. qwen-deep-research tidak mendukung fitur ini.
Model Context Protocol (MCP) tool calling memungkinkan qwen-deep-research-2025-12-15 mengambil data dari sumber data privat atau spesifik domain selama fase WebResearch—seperti basis pengetahuan, dokumen internal, atau database proprietary—bersamaan dengan pencarian web standar. Teruskan konfigurasi server MCP melalui parameter research_tools. Format respons identik dengan panggilan standar.
Untuk detail tentang
research_toolsdan spesifikasi alat MCP, lihat Qwen-Deep-Research.
Contoh permintaan
import os
import dashscope
# 以下为华北2(北京)地域的URL,各地域的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'
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 penelitian"
}
]
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://{WorkspaceId}.cn-beijing.maas.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": "Gunakan basis pengetahuan untuk mencari pengumuman pembaruan produk yang baru diterbitkan dan susun menjadi laporan penelitian",
"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
Model | Biaya input (per 1K token) | Biaya output (per 1K 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 |
Penagihan didasarkan pada token input (pesan pengguna dan prompt sistem) dan token output (pertanyaan lanjutan, rencana penelitian, tujuan, kueri pencarian, dan laporan akhir). Kedua model ditagih secara terpisah.
Mulai produksi
Gunakan keluaran streamingModel hanya mendukung keluaran streaming (stream=True). Satu tugas penelitian dapat berjalan selama beberapa menit melalui puluhan siklus pencarian-dan-baca iteratif, yang melebihi timeout permintaan sinkron. Gunakan streaming untuk menjaga koneksi tetap terbuka dan lacak kemajuan melalui bidang phase dan status.
Periksa kode status respons pada setiap chunk. Untuk kode status selain 200, baca bidang code dan message dan tangani sesuai kebutuhan.
Saat status bernilai finished, ambil penggunaan token dari response.usage (token input, token output, dan ID permintaan).
Fase KeepAlive mempertahankan koneksi antara tugas-tugas berdurasi panjang. Abaikan fase ini dan lanjutkan pemrosesan aliran.
FAQ
-
Mengapa bidang output kosong untuk beberapa chunk respons?
Chunk awal hanya membawa metadata. Konten tiba di chunk berikutnya saat model menghasilkannya.
-
Bagaimana cara menentukan apakah suatu fase telah selesai?
Fase selesai ketika
statusberubah menjadifinished. -
Apakah model mendukung panggilan API yang kompatibel dengan OpenAI?
Tidak. Panggilan API yang kompatibel dengan OpenAI tidak didukung.
-
Bagaimana perhitungan token input dan output?
Token input mencakup pesan pengguna dan prompt sistem. Token output mencakup pertanyaan lanjutan, rencana penelitian, tujuan, kueri pencarian, dan laporan akhir.
-
Apa perbedaan antara qwen-deep-research dan qwen-deep-research-2025-12-15?
qwen-deep-research: model mainline yang terus diperbarui.qwen-deep-research-2025-12-15: versi snapshot dengan kedalaman, kualitas, dan dukungan MCP yang ditingkatkan. Keduanya mendukung image input dan ditagih secara terpisah. -
Bagaimana cara melewatkan gambar untuk penelitian?
Gunakan format array untuk
content: lewatkan{"image": "URL"}dan{"text": "deskripsi"}sebagai objek dalam array. Kedua model mendukung image input. -
Bagaimana cara melewati pertanyaan lanjutan dan langsung ke penelitian?
Setel
enable_feedbackkefalsedalamparameters. Model akan melewati pertanyaan lanjutan dan langsung memulai penelitian.
Referensi API
Untuk parameter input dan output, lihat Qwen-Deep-Research.
Kode error
Jika pemanggilan model gagal dan mengembalikan pesan error, lihat Kode error untuk resolusi.
Batas laju
Lihat Batas laju.