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.
Dokumen ini hanya berlaku untuk wilayah China (Beijing). Gunakan API key dari wilayah China (Beijing).
Mulai menggunakan
Prasyarat
Anda telah mendapatkan API key dan menyetel API key sebagai variabel lingkungan.
Untuk menggunakan SDK, instal DashScope SDK.
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 |
| Menghasilkan pertanyaan lanjutan atau laporan akhir |
| Menghasilkan teks |
| Generasi teks selesai | ||
| Membuat kerangka penelitian |
| Menghasilkan rencana penelitian |
| Rencana penelitian selesai | ||
| Pencarian web dan analisis konten |
| Menghasilkan kueri pencarian |
| Menjalankan pencarian web dan menganalisis konten halaman | ||
| Pencarian web dan ekstraksi informasi selesai | ||
| 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
outputkosong 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
statusberubah 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
Kode error
Jika pemanggilan gagal, lihat Pesan error untuk troubleshooting.