Lewati ke konten utama

Tutorial Mercury 3: Membangun Asisten Analisis Insiden Real-Time

Pelajari bagaimana Mercury 3 menggunakan generasi berbasis difusi untuk membangun asisten analisis insiden, memvisualisasikan status penyempurnaan, dan membandingkan upaya penalaran rendah vs tinggi.
· 11 mnt Baca

Jelajahi bersama AI

Mercury 3 adalah Large Language Model berbasis difusi dari Inception.ai. Berbeda dengan LLM autoregresif konvensional yang menghasilkan teks satu token demi satu, Mercury menggunakan difusi untuk menyempurnakan beberapa bagian responsnya secara iteratif. Model ini melampaui GPT-6 Luna dan Claude Haiku 5.5, sekaligus berjalan 4–8x lebih cepat pada 1.000+ token per detik di GPU NVIDIA dan mendukung jendela konteks 1 juta token.

Dalam tutorial ini, kita akan membangun asisten analisis insiden kecil yang menerima log aplikasi, informasi deployment, metrik GPU, dan jejak permintaan. Lalu kita gunakan tugas yang sama untuk mengeksplorasi dua sifat Mercury 3:

  • Bagaimana streaming difusi berbeda dari streaming LLM normal

  • Apa yang berubah saat kita meningkatkan reasoning_effort dari rendah ke tinggi?

Sepanjang proses, kita juga akan menjumpai isu penting terkait anggaran token yang berpengaruh saat menggunakan mode penalaran Mercury. Pada akhirnya, Anda akan tahu cara:

  • Memanggil Mercury 3 menggunakan SDK Python Inception.
  • Memahami perbedaan dasar antara generasi berbasis difusi dan autoregresif.
  • Membangun alur kerja analisis dukungan.
  • Melakukan streaming respons secara normal dan dengan difusi diaktifkan.
  • Menginspeksi bagaimana Mercury menulis ulang jawaban di antara status difusi.
  • Menafsirkan penggunaan token penalaran dan latensi dengan benar.

Kode lengkap repository.

Apa Itu Mercury 3?

Tidak seperti LLM autoregresif konvensional yang menghasilkan respons ketat dari kiri ke kanan, Mercury termasuk keluarga model yang menyempurnakan beberapa posisi token selama generasi secara iteratif. Pendekatan Inception ini paling cocok untuk beban kerja sensitif latensi seperti agen, pencarian, dukungan pelanggan, pendidikan, dan aplikasi lain di mana pemanggilan model berulang dapat cepat terakumulasi.

Mercury 3 menggabungkan proses generasi berbasis difusi tersebut dengan kapabilitas yang diharapkan dari model API tujuan umum, termasuk input konteks panjang, kontrol penalaran, pemanggilan alat, keluaran terstruktur, dan endpoint yang kompatibel dengan OpenAI. Model ini juga menyediakan mode streaming diffusing=True yang memungkinkan aplikasi menerima status penyempurnaan teks penuh perantara alih-alih hanya blok keluaran yang dapat ditambahkan saja.

Pada saat penulisan, Mercury 3 mendukung hal-hal berikut:

Properti

Mercury 3

Jendela konteks

1M token

Keluaran maksimum

131.072 token

Upaya penalaran

instant, low, medium, high

Pemanggilan alat

Didukung

Keluaran terstruktur

Didukung

Streaming

Didukung

Streaming difusi

Didukung

Temperatur

0,5–1,0

API

Kompatibel dengan OpenAI

Inception saat ini mencantumkan Mercury 3 dengan harga peluncuran $0,10 per satu juta token input, $0,01 per satu juta token input yang di-cache, dan $0,35 per satu juta token output. Token yang di-cache juga mendapat diskon 90% dari harga input.

Mercury 3 berukuran 40x lebih besar dari Mercury 1 dan jauh lebih cerdas, namun tetap sama cepatnya.

Kualitas Model vs Ukuran Model

Gambar: Kualitas Model vs Ukuran Model(Sumber)

Bagaimana Cara Kerja Mercury 3?

Kebanyakan LLM menghasilkan teks secara autoregresif dari kiri ke kanan, satu token demi satu. Berikut cara LLM tradisional menghasilkan teks:

The
The server
The server is
The server is overloaded

Setiap token baru bergantung pada semua yang dihasilkan sebelumnya.

Mercury menggunakan difusi sebagai gantinya.

Inception mendeskripsikan LLM difusinya sebagai model berbasis Transformer yang secara progresif meningkatkan keluaran dengan memodifikasi banyak token secara paralel. Riset Mercury sebelumnya menggambarkannya sebagai proses generasi dari kasar ke halus alih-alih prediksi token berikutnya yang ketat dari kiri ke kanan. 

Ilustrasi yang disederhanakan mungkin terlihat seperti ini:

Ini hanya contoh konseptual, bukan representasi internal Mercury 3 yang persis.

API Inception dapat mengekspos status perantara ini. Dengan streaming normal, Mercury mengembalikan blok teks yang telah disempurnakan yang dapat ditambahkan ke respons. Dengan diffusing=True, setiap potongan justru berisi versi lengkap jawaban saat ini seiring model menyempurnakannya.

Kita akan melihat perbedaannya sebentar lagi.

Demo: Membangun Asisten Eskalasi Dukungan Real-Time

Sebelum membangun demo, mari pisahkan pengaturan model dari aplikasi dukungan itu sendiri.

Kasus dukungan hanyalah input yang kita gunakan untuk menguji Mercury 3. Kontrol sisi model yang penting adalah anggaran penalaran, anggaran completion, dan mode streaming.

Pengaturan

Nilai yang digunakan

Mengapa penting

Temperatur

0,75

Ditetapkan tetap agar kita tidak mengubah sampling saat membandingkan mode

Upaya penalaran

low, high

Memungkinkan kita membandingkan penggunaan penalaran tersembunyi dan latensi

Anggaran completion

8192

Cukup besar untuk run demo yang diukur

Streaming standar

stream=True

Mengembalikan blok teks yang bisa ditambahkan

Streaming difusi

stream=True, diffusing=True

Mengembalikan status penyempurnaan teks penuh secara berurutan

Prompt

Kasus dukungan tetap

Menjaga tugas tetap konstan saat pengaturan model berubah

Pengulangan

5 per kondisi

Menunjukkan variasi antar-run alih-alih mengandalkan satu permintaan

Ini adalah pengaturan yang bekerja untuk eksperimen ini, bukan pengaturan Mercury 3 yang optimal secara global.

Langkah 1: Prasyarat

Mercury 3 hanya memerlukan beberapa langkah untuk memulai. Untuk mengikuti, Anda memerlukan:

  • Kunci API Inception
  • Python 3
  • Paket inceptionai
  • Kasus dukungan yang disimpan sebagai case_support.json

Mulailah dengan mendaftar ke platform inception dan mendapatkan Kunci API. Klik Get Started dan isi detailnya:

Halaman pendaftaran

Catatan: Pada saat penulisan, Inception menyediakan 100 juta token gratis untuk akun baru guna mencoba API.

Anda dapat memberi nama Kunci API atau cukup lewati langkah ini dan klik Create Key.

Buat Kunci API

Selanjutnya, salin Kunci API dan lakukan panggilan API pertama Anda. 

Salin Kunci API

Langkah 2: Coba Mercury 3

Sebelum menulis kode apa pun, Anda dapat menguji Mercury 3 langsung dari Platform Inception. Setelah membuat kunci API, klik Next dan pilih tombol Run it now pada tab Try It Out.

Coba Mercury 3

Ini berguna untuk menguji prompt dan pengaturan model dengan cepat sebelum memindahkannya ke dalam aplikasi.

Langkah 3: Siapkan lingkungan dan lakukan panggilan API

Untuk sisa tutorial ini, kita akan memanggil Mercury 3 dari Python. Mulailah dengan memasang SDK inception dan mengekspor kunci API sebagai berikut:

!pip install -q inceptionai

Lalu impor paket yang digunakan oleh demo:

import getpass, json, os, time, difflib
from pathlib import Path
from inceptionai import Inception
from IPython.display import clear_output

getpass meminta kunci API tanpa menampilkannya, os menempatkannya di lokasi yang dicari SDK, Path dan json memuat case_support.json dan menserialisasikannya ke dalam prompt, dan time.perf_counter() mencatat kapan setiap respons dan status penyempurnaan tiba.

difflib membandingkan status difusi berturutan dan clear_output() menggantikan keluaran sel sehingga pemutaran ulang terjadi di tempat alih-alih menumpuk ke bawah halaman.

Jika kunci API belum disetel, Anda dapat memintanya secara interaktif:

if not os.environ.get("INCEPTION_API_KEY"):
    os.environ["INCEPTION_API_KEY"] = getpass.getpass(
        "Inception API key: "
    )
client = Inception()
MODEL = "mercury-3"
print("ready")

Inception() membaca kunci API dari environment. Sementara impor lain, seperti time mencatat kapan status penyempurnaan tiba, difflib membantu membandingkan teks perantara, dan clear_output() memungkinkan kita memutar ulang proses difusi di tempat.

Langkah 4: Bangun pesan Model

Kasus dukungan disimpan terpisah di case_support.json. Berkas kasus memuat pesan pelanggan, informasi pesanan, catatan pembayaran, log pemenuhan, kebijakan dukungan, dan prompt yang ingin kita gunakan untuk skenario ini.

Anda dapat membangun sendiri atau menggunakannya apa adanya:

{
  "scenario": "Customer reports two charges for one order",
  "system_prompt": "You are a customer-support escalation assistant.\nUse only the evidence in the supplied case file.\nSeparate what the evidence shows from what you infer.\nDo not state that a refund has been issued unless the case file says so.\nIf the evidence is insufficient to decide, say so explicitly.",
  "task_prompt": "Analyze this customer-support case.\n\nReturn:\n1. The most likely explanation.\n2. Three pieces of evidence from the case file that support it.\n3. Two alternative explanations, and what is still uncertain.\n4. The next three actions for the agent, in priority order.\n\nKeep the answer concise. Write it so the customer could read it.",
  "packet_label": "CASE FILE",
  "customer_message": "I ordered one pair of headphones yesterday evening and my card now shows two charges of $129 each. I have one confirmation email and one tracking number. I only pressed buy once. Please refund the second charge today, I cannot afford to be out $258.",
  "order": {
    "order_id": "ORD-1048",
    "placed_at": "2026-10-28T19:41:08Z",
    "status": "shipped",
    "shipped_at": "2026-10-29T08:12:00Z",
    "item": "wireless headphones",
    "quantity": 1,
    "amount_usd": 129,
    "orders_on_account_that_day": 1
  },
  "payment_records": [
    {
      "entry": 1,
      "at": "2026-10-28T19:41:11Z",
      "amount_usd": 129,
      "status": "completed",
      "authorization_code": "A7X41K",
      "card_last_four": "4417"
    },
    {
      "entry": 2,
      "at": "2026-10-28T19:42:45Z",
      "amount_usd": 129,
      "status": "pending",
      "authorization_code": "B2M09T",
      "card_last_four": "4417"
    }
  ],
  "fulfillment_log": [
    "19:41:12 reserved 1 unit for ORD-1048",
    "19:42:47 reserved 1 unit (no order id attached)",
    "19:58:30 released 1 unreserved unit back to stock",
    "08:12:00 shipped 1 unit against ORD-1048, one tracking number issued"
  ],
  "customer_history": [
    {
      "date": "2026-10-07",
      "contact_reason": "reported two charges for one order",
      "outcome": "both charges settled; agent issued a refund for one of them"
    },
    {
      "date": "2026-06-19",
      "contact_reason": "delivery address change",
      "outcome": "resolved, no payment involved"
    }
  ],
  "support_policy": [
    "A pending card authorization can appear on a customer statement as a second charge.",
    "A pending authorization that is never captured usually disappears within 3-5 business days.",
    "Escalate to the payments team if both charges settle.",
    "Agents may not issue a refund against an authorization that has not settled.",
    "Tell the customer what you have confirmed and what you have not."
  ],
  "available_agent_actions": [
    "explain the pending authorization to the customer",
    "set a follow-up for a named number of business days",
    "escalate to the payments team",
    "issue a refund for a settled charge",
    "request the authorization expiry date from the payment processor"
  ]
}

Sekarang, mari muat berkas JSON:

def load_incident(path: str) -> dict:
    return json.loads(Path(path).read_text())
case = load_incident("case_support.json")

Sebelum mengirimkannya ke Mercury 3, kita pisahkan konfigurasi prompt dari buktinya:

PROMPT_KEYS = (
    "system_prompt",
    "task_prompt",
    "packet_label",
)
def build_messages(case: dict):
    system = case.get("system_prompt", SYSTEM)
    task = case.get("task_prompt", TASK)
    label = case.get(
        "packet_label",
        "INCIDENT PACKET",
    )
    evidence = {
        k: v
        for k, v in case.items()
        if k not in PROMPT_KEYS
    }
    packet = json.dumps(evidence, indent=2)
    return [
        {
            "role": "system",
            "content": system,
        },
        {
            "role": "user",
            "content": (
                f"{task}\n\n"
                f"{label}:\n{packet}"
            ),
        },
    ]

Kunci system_prompt, task_prompt, dan packet_label mengontrol cara kita memberi instruksi kepada Mercury, sehingga dihapus dari bukti sebelum kasus itu sendiri diserialisasi. Kita sekarang dapat menyiapkan pesan akhir:

messages = build_messages(case)

Tidak ada sistem pengambilan atau alat eksternal yang terlibat di sini. Semua yang dibutuhkan Mercury untuk analisis ini disuplai langsung dalam permintaan.

Langkah 5: Lakukan permintaan ke Mercury 3 

Sebelum menguji streaming, mari buat permintaan non-streaming normal. Helper berikut membungkus panggilan API Mercury dan mencatat metadata respons:

def usage_dict(response) -> dict:
    usage = getattr(response, "usage", None)

    if usage is None:
        return {}

    if hasattr(usage, "model_dump"):
        return usage.model_dump()

    return dict(usage)

Sekarang mari definisikan pemanggilan model:

def run_nonstream(
    client,
    messages,
    effort: str,
    max_tokens: int,
):
    start = time.perf_counter()
    response = client.chat.completions.create(
        model=MODEL,
        messages=messages,
        reasoning_effort=effort,
        temperature=0.75,
        max_completion_tokens=max_tokens,
    )
    elapsed = time.perf_counter() - start
    choice = response.choices[0]
    text = choice.message.content or ""
    usage = usage_dict(response)
    return {
        "effort": effort,
        "elapsed_s": elapsed,
        "finish_reason": choice.finish_reason,
        "usage": usage,
        "text": text,
    }

Kontrol utama di sisi model adalah:

reasoning_effort=effort
temperature=0.75
max_completion_tokens=max_tokens

Kita sekarang dapat membuat panggilan baseline:

result = run_nonstream(
    client,
    messages,
    effort="low",
    max_tokens=8192,
)
print(result["text"])

Mercury menerima kasus dukungan lengkap dan mengembalikan analisis yang diminta, termasuk penjelasan paling mungkin, bukti pendukung, penjelasan alternatif, ketidakpastian, dan tindakan berikutnya yang direkomendasikan.

Fungsinya juga mencatat kolom elapsed_s dan usage. Yang pertama mengukur waktu permintaan ujung ke ujung, sedangkan yang lainnya mencakup perhitungan token, termasuk penggunaan token penalaran yang dilaporkan.

Di seluruh run yang digunakan untuk tutorial ini, Mercury secara konsisten mengidentifikasi entri pembayaran kedua sebagai otorisasi tertunda yang paling mungkin alih-alih bukti pesanan kedua yang dikonfirmasi. Namun, kasus ini sengaja tidak memiliki informasi yang cukup untuk mengetahui apakah otorisasi tertunda itu pada akhirnya akan menghilang atau terselesaikan.

Langkah 6: Tambahkan streaming standar

Permintaan normal menunggu Mercury selesai sebelum mengembalikan jawaban penuh. Untuk menerima respons secara bertahap, kita perlu mengaktifkan stream=True. Fungsi streaming standar terlihat seperti ini:

def run_standard_stream(
    client,
    messages,
    effort: str,
    max_tokens: int,
):
    start = time.perf_counter()
    first_output = None
    finish_reason = None
    chunks = []
    stream = client.chat.completions.create(
        model=MODEL,
        messages=messages,
        reasoning_effort=effort,
        temperature=0.75,
        max_completion_tokens=max_tokens,
        stream=True,
    )
    for chunk in stream:
        choices = getattr(
            chunk,
            "choices",
            None,
        ) or []
        if (
            choices
            and getattr(
                choices[0],
                "finish_reason",
                None,
            )
        ):
            finish_reason = choices[0].finish_reason
        content = extract_delta_text(chunk)
        if content:
            now = time.perf_counter()
            if first_output is None:
                first_output = now
            chunks.append(content)
            print(
                content,
                end="",
                flush=True,
            )
    end = time.perf_counter()
    return {
        "time_to_first_output_s": (
            first_output - start
            if first_output
            else None
        ),
        "total_s": end - start,
        "num_chunks": len(chunks),
        "finish_reason": finish_reason,
        "final_text": "".join(chunks),
    }

Perilaku penting di sini adalah chunks.append(content) dalam streaming standar, di mana setiap potongan berisi bagian berikutnya dari respons, sehingga potongan dapat diakumulasikan dan direkonstruksi menjadi jawaban akhir dengan "".join(chunks).

Catatan: Median waktu hingga keluaran pertama yang terlihat adalah 2,903 detik, sedangkan median total latensi adalah 3,375 detik.

Langkah 7: Beralih ke Streaming Difusi

Untuk mengaktifkan streaming difusi, setel parameter berikut ke True:

stream=True
diffusing=True

Panggilan API berbeda dari streaming standar hanya dengan satu argumen tambahan, yaitu diffusing=True. 

def run_diffusion_stream(
    client,
    messages,
    effort: str,
    max_tokens: int,
    live: bool = True,
):
    start = time.perf_counter()
    first_output = None
    finish_reason = None
    states = []
    empty_chunks = 0
    stream = client.chat.completions.create(
        model=MODEL,
        messages=messages,
        reasoning_effort=effort,
        temperature=0.75,
        max_completion_tokens=max_tokens,
        stream=True,
        diffusing=True,
    )
    for chunk in stream:
        choices = getattr(
            chunk,
            "choices",
            None,
        ) or []
        if (
            choices
            and getattr(
                choices[0],
                "finish_reason",
                None,
            )
        ):
            finish_reason = choices[0].finish_reason
        content = extract_delta_text(chunk)
        if not content:
            empty_chunks += 1
            continue
        now = time.perf_counter()
        if first_output is None:
            first_output = now
        states.append({
            "t_s": now - start,
            "text": content,
        })
        if live:
            clear_output(wait=True)
            print(content, flush=True)
    end = time.perf_counter()
    return {
        "time_to_first_output_s": (
            first_output - start
            if first_output
            else None
        ),
        "total_s": end - start,
        "num_refinement_states": len(states),
        "finish_reason": finish_reason,
        "final_text": (
            states[-1]["text"]
            if states
            else ""
        ),
        "states": states,
    }

Dengan streaming standar, potongan ditambahkan. Namun, dengan streaming difusi, potongan non-kosong terbaru mewakili versi lengkap jawaban saat ini. Jadi alih-alih menambahkannya, kita menggantikan yang sebelumnya ditampilkan.

Kita juga menyimpan status yang dikembalikan untuk mengukur jumlah status penyempurnaan dan memeriksa apakah status selanjutnya benar-benar merevisi teks yang muncul sebelumnya.

Di lima run, streaming difusi mengembalikan median 9 status penyempurnaan yang terlihat, dengan rentang 7–12. Median waktu ke status pertama yang terlihat adalah 1,896 detik, dan median total latensi adalah 2,560 detik.

Langkah 8: Bandingkan Streaming Standar dan Difusi

Sekarang setelah kita memahami kedua jalur kode, kita dapat membandingkan perilaku yang diukur.

Metrik

Standar

Difusi

Median chunks/states

6

9

Rentang

5–7

7–12

Median keluaran pertama terlihat

2,903 dtk

1,896 dtk

Median latensi total

3,375 dtk

2,560 dtk

Pada prompt dukungan khusus ini, difusi memiliki median latensi lebih rendah, tetapi rentangnya sangat tumpang tindih. Jadi, kita tidak boleh menyimpulkan bahwa streaming difusi secara inheren lebih cepat.

Run 12 status, transisi demi transisi

Gambar: Run 12 status, transisi demi transisi. Batang cokelat adalah teks yang sudah ditulis Mercury 3 lalu diganti, sedangkan batang biru adalah teks baru melewati akhir sebelumnya. Append murni tidak akan menampilkan batang cokelat sama sekali.

Dalam run saya, status difusi yang dikembalikan merevisi teks yang sebelumnya terlihat alih-alih berperilaku seperti potongan hanya-tambah. Pada run di atas, tidak satu pun dari 11 transisi status merupakan append murni, dan setiap transisi menyimpang dari status sebelumnya dalam 14 karakter pertama.

Langkah 9: Uji anggaran completion

Selanjutnya, mari lihat perilaku Mercury 3 terkait bagaimana token penalaran berinteraksi dengan anggaran completion. Panggilan normal di atas menggunakan max_completion_tokens=8192, tetapi untuk menonjolkan perilaku lebih jelas, kita perlu mengurangi max_completion_tokens menjadi 1600.

Sekarang, jalankan permintaan yang sama sekali pada upaya penalaran rendah dan sekali pada tinggi. Berikut hasil terukurnya:

LOW
completion_tokens: 964
reasoning_tokens:  620
finish_reason:     stop
visible answer:    returned

HIGH
completion_tokens: 1539
reasoning_tokens:  1539
finish_reason:     length
visible answer:    none

Pada tingkat tinggi, seluruh 1.539 token completion dilaporkan sebagai token penalaran. Karena itu, model mencapai batas completion sebelum mengembalikan teks jawaban yang terlihat.

Anggaran completion upaya tinggi pada batas 1.600 dan 8.192 token

Gambar: Anggaran completion upaya tinggi pada batas 1.600 dan 8.192 token 

Pada batas 1.600, seluruh anggaran digunakan untuk penalaran, dan tidak ada yang tersisa untuk dikeluarkan. Pada 8.192, median run upaya tinggi menghabiskan 2.292 token untuk penalaran dan tetap memiliki ruang untuk jawaban 412 token. Batas 8.192 berada di luar tepi kanan skala ini, yang sebabnya hanya baris pertama pada gambar di atas yang menunjukkan garis batas putus-putus.

Sinyal penting dalam permintaan gagal tingkat tinggi adalah response.choices[0].finish_reason, yang mengembalikan length. Ini berarti permintaan mencapai batas maksimum token completion (max_completion_tokens). Anggaran ini mencakup baik token penalaran maupun token keluaran yang terlihat. Pada run ini, Mercury 3 melaporkan semua 1.539 token completion sebagai token penalaran, sehingga permintaan mencapai batas completion sebelum menghasilkan jawaban yang terlihat.

Catatan: Untuk demo ini, max_completion_tokens=8192 sudah cukup untuk run berikutnya, tetapi tidak boleh dianggap sebagai minimum universal.

Langkah 10: Bandingkan Upaya Penalaran Rendah dan Tinggi

Sekarang kembali ke anggaran completion 8192 yang normal dan hanya variasikan reasoning_effort antara rendah dan tinggi. Kita akan menggunakan helper run_nonstream() dari Langkah 5 untuk membuat satu permintaan dengan upaya penalaran rendah dan satu lagi dengan tinggi:

results = []

for effort in ["low", "high"]:
    result = run_nonstream(
        client,
        messages,
        effort=effort,
        max_tokens=8192,
    )
    results.append(result)

    print(
        effort,
        result["elapsed_s"],
        result["usage"],
    )

Untuk hasil yang dilaporkan, saya mengulangi setiap konfigurasi lima kali alih-alih mengandalkan satu permintaan.

Median yang diperoleh:

Metrik

Rendah

Tinggi

Latensi ujung ke ujung

2,936 dtk

8,146 dtk

Token completion

1312

2723

Token penalaran

828

2292

Perkiraan token terlihat

468

412

Porsi penalaran

63%

84%

Median penggunaan penalaran meningkat dari 828 menjadi 2.292 token, sementara median latensi meningkat dari 2,936 menjadi 8,146 detik (sekitar 2,77x).

Median token completion dibagi menjadi penalaran tersembunyi dan jawaban terlihat

Gambar: Ke mana anggaran completion digunakan pada tiap tingkat upaya?

Panjang jawaban yang terlihat tidak banyak berubah:

  • Rendah: median 468 token
  • Tinggi: median 412 token

dan rentang yang diamati saling tumpang tindih:

  • Rendah: 393–494
  • Tinggi: 356–469

Jadi, run ini tidak mendukung klaim bahwa meningkatkan upaya penalaran membuat jawaban yang terlihat menjadi lebih pendek. Rentang latensi juga menunjukkan mengapa satu run saja tidak cukup:

  • Rendah: 1,602–4,993 dtk
  • Tinggi: 4,102–9,068 dtk

Catatan: Permintaan upaya tinggi tercepat ternyata lebih cepat daripada permintaan upaya rendah terlambat.

Semua sepuluh permintaan upaya penalaran diplot menurut latensi

Gambar: Semua sepuluh permintaan upaya penalaran diplot menurut latensi

Jadi, reasoning_effort="high" secara substansial meningkatkan penggunaan token penalaran yang dilaporkan dan latensi dalam eksperimen ini, sementara panjang jawaban yang terlihat tetap secara umum serupa.

Pemikiran Akhir

Ada tiga perilaku praktis Mercury 3:

  • Streaming difusi menggunakan kontrak keluaran yang berbeda. Streaming standar menambahkan teks baru, sedangkan streaming difusi mengembalikan status respons penuh yang berurutan yang harus menggantikan status sebelumnya.

  • Token penalaran berbagi anggaran completion. Nilai max_completion_tokens yang kecil dapat dihabiskan oleh penalaran sebelum Mercury 3 menghasilkan jawaban yang terlihat.

  • Upaya penalaran yang lebih tinggi menukar komputasi tambahan dengan latensi. Dalam run saya, tingkat tinggi menggunakan token penalaran yang jauh lebih banyak dan memakan waktu lebih lama, sebagaimana diharapkan, sementara panjang jawaban yang terlihat tetap secara umum serupa.

Hasil ini berasal dari sejumlah kecil run pada satu kasus dukungan sintetis, jadi hasil ini harus diperlakukan sebagai observasi dari demo ini, bukan klaim kinerja umum tentang Mercury 3.

Aashi Dutt

Penulis

Aashi Dutt

Saya adalah Google Developers Expert di ML (Gen AI), Kaggle 3x Expert, dan Women Techmakers Ambassador dengan pengalaman lebih dari 3 tahun di bidang teknologi. Saya ikut mendirikan startup health-tech pada 2020 dan sedang menempuh studi magister ilmu komputer di Georgia Tech dengan spesialisasi machine learning.

FAQ Mercury 3

Apa perbedaan utama antara streaming standar dan streaming difusi di Mercury 3?

Dengan streaming standar, respons tiba sebagai potongan teks yang ditambahkan satu sama lain. Dengan streaming difusi, API mengekspos revisi berurutan dari respons saat ini, sehingga status terbaru harus menggantikan yang sebelumnya alih-alih ditambahkan.

Apakah reasoning_effort="high" selalu menghasilkan jawaban yang lebih baik?

Tidak. Upaya penalaran yang lebih tinggi memberi Mercury ruang lebih untuk bernalar, tetapi itu tidak menjamin respons yang lebih baik untuk setiap tugas. Dalam demo ini, tingkat tinggi secara signifikan menggunakan lebih banyak token penalaran dan memakan waktu lebih lama, sementara panjang jawaban yang terlihat tetap serupa. Ini juga lebih konsisten dalam menyoroti satu bukti yang hilang, tetapi eksperimennya terlalu kecil untuk membuat klaim kualitas yang lebih luas.

Mengapa Mercury 3 bisa tidak mengembalikan jawaban yang terlihat saat max_completion_tokens terlalu kecil?

Token penalaran dihitung ke anggaran token completion yang sama dengan jawaban yang terlihat. Jika model menghabiskan sebagian besar atau seluruh anggaran tersebut saat bernalar, model dapat mencapai batas completion sebelum menghasilkan keluaran yang terlihat. Dalam kasus itu, memeriksa finish_reason dan penggunaan token penalaran yang dilaporkan membantu menjelaskan apa yang terjadi.

Apakah streaming difusi selalu lebih cepat daripada streaming standar?

Tidak. Dalam demo ini, streaming difusi memiliki median waktu ke keluaran pertama yang terlihat lebih rendah dan median latensi total lebih rendah, tetapi rentangnya tumpang tindih, dan prompt lain menghasilkan urutan sebaliknya. Perbedaan yang lebih andal adalah perilaku streaming, bukan jaminan peningkatan latensi.

Kapan saya harus menggunakan Mercury 3?

Mercury 3 sangat menarik untuk aplikasi yang sensitif terhadap latensi di mana pengguna mendapat manfaat dari respons cepat sementara model tetap melakukan penalaran yang tidak sepele. Tingkat upaya penalaran dan anggaran completion yang tepat bergantung pada tugas, sehingga harus disetel dengan mempertimbangkan baik latensi maupun kualitas jawaban.

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Spaghetti Plot dan Jalur Badai

blogs

Tutorial Korelasi di R