ID ▾
Dapatkan kunci API

Catatan Rapat LLM API: Transkrip ke Ringkasan dalam Python

Untuk mendapatkan catatan rapat LLM API, Anda mengirim transkrip ke endpoint chat completions dengan system prompt pendek dan membaca balasan. Bagian yang menentukan kualitas adalah prompt, bentuk output tetap, dan cara Anda menangani rekaman panjang.

Diperbarui

Meja rapat isometrik dengan gelembung ucapan yang memadat menjadi kartu daftar periksa di atasnya

Poin utama

  • Satu panggilan chat completion mengubah transkrip menjadi catatan; mode JSON memberikan bentuk tetap.
  • Jendela konteks 100.000 token memuat sebagian besar transkrip rapat tanpa pengelompokan.
  • Perintahkan model untuk menulis null untuk pemilik dan tanggal yang hilang, agar tidak membuatnya.
  • Kunci penuh memungkinkan 8 permintaan konkuren, cukup untuk memproses sehari rapat secara paralel.

Pipa dalam empat langkah

  1. Rekam dan transkripsikan. Gunakan alat pengenal suara-ke-teks apa pun. API ini hanya untuk teks dan tidak menerima audio.
  2. Siapkan teks. Tambahkan header dengan judul rapat, tanggal, dan nama peserta. Label pembicara, jika Anda memilikinya, sangat membantu.
  3. Panggil model. Kirim transkrip dengan system prompt yang mendefinisikan bagian yang Anda inginkan.
  4. Simpan dan bagikan hasilnya. Simpan JSON, render sebagai Markdown atau HTML, posting di tempat tim membaca.

Endpoint-nya adalah POST /v1/chat/completions di https://api.whisperapis.com/v1, ID modelnya adalah uncensored, dan SDK OpenAI apa pun berfungsi setelah Anda mengubah URL dasar dan kunci. Jika Anda perlu mengatur pengenal suara terlebih dahulu, dokumentasi quickstart mencakup bagian teks, dan server kompatibel Whisper apa pun dapat menyediakan transkrip.

Dapatkan catatan terstruktur dengan mode JSON

Ringkasan bebas cukup baik untuk dibaca, tetapi alur kerja memerlukan bidang yang dapat disimpan dan difilter. Mode JSON, diaktifkan dengan response_format diatur ke {"type": "json_object"}, membuat model mengembalikan satu objek JSON. Jelaskan kunci-kuncinya dalam prompt sistem, dan sebutkan kata JSON di sana, karena prompt adalah yang menentukan bentuknya.

import json
from openai import OpenAI

client = OpenAI(base_url="https://api.whisperapis.com/v1", api_key="YOUR_KEY")

SYSTEM = """You write meeting notes from raw transcripts.
Use only what the transcript says. If an owner or a date is not stated, write null.
Reply with a JSON object with the keys: summary (string), decisions (array of strings),
action_items (array of objects with task, owner, due), open_questions (array of strings)."""

transcript = open("standup.txt", encoding="utf-8").read()

resp = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": "Transcript:\n\n" + transcript},
    ],
    response_format={"type": "json_object"},
    temperature=0.2,
)

notes = json.loads(resp.choices[0].message.content)
for item in notes["action_items"]:
    print(item["owner"], "->", item["task"], item["due"])

Dua baris dalam prompt itu melakukan sebagian besar pekerjaan. "Gunakan hanya apa yang dikatakan transkrip" mencegah model menambahkan detail yang masuk akal. "Jika pemilik atau tanggal tidak disebutkan, tulis null" memberinya cara legal untuk mengatakan tidak tahu, yang lebih baik daripada nama buatan. Suhu rendah seperti 0,2 mengurangi variasi antar eksekusi, yang Anda inginkan ketika transkrip yang sama mungkin diproses dua kali.

Selalu parse secara defensif. Bungkus json.loads dalam blok try, dan saat gagal coba lagi sekali. Permintaan yang gagal tidak dikenakan biaya, dan satu kali percobaan ulang memperbaiki sebagian besar kesalahan format satu kali.

Stream hasil ke orang yang menunggu

Jika seseorang mengklik tombol dan menunggu catatan, tampilkan teks saat tiba. Atur stream ke true dan API mengirim server-sent events; penggunaan disertakan di akhir stream.

from openai import OpenAI

client = OpenAI(base_url="https://api.whisperapis.com/v1", api_key="YOUR_KEY")
transcript = open("standup.txt", encoding="utf-8").read()

stream = client.chat.completions.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "Write concise meeting notes in Markdown with headings: Summary, Decisions, Actions."},
        {"role": "user", "content": transcript},
    ],
    stream=True,
    temperature=0.3,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Streaming memiliki satu detail operasional: permintaan streaming memegang slot konkurensinya hingga stream berakhir. Kunci penuh memungkinkan 8 sekaligus, kunci uji coba 2. Jika tab browser ditutup dan server Anda terus membaca, slot itu tetap sibuk, jadi batalkan permintaan upstream saat klien terputus.

Untuk pekerjaan batch yang tidak diawasi siapa pun, lewati streaming. Permintaan biasa lebih sederhana dan Anda mendapatkan seluruh jawaban dalam satu objek.

Rapat panjang dan jendela 100k

Jendela konteksnya adalah 100.000 token, menghitung prompt dan balasan bersama-sama. Rapat satu jam kira-kira 9.000 kata, atau sekitar 12.000 token, sehingga bahkan lokakarya sepanjang hari muat dalam satu permintaan. Itu menghilangkan desain peta-dan-reduksi biasa di mana Anda memisahkan transkrip, meringkas setiap bagian, lalu meringkas ringkasan. Setiap tahap desain itu kehilangan detail, dan keputusan yang dibuat pada menit ke-5 dan direvisi pada menit ke-50 mudah dilaporkan secara keliru.

Masih periksa ukuran sebelum mengirim. Pemeriksaan kasar adalah karakter dibagi empat untuk teks bahasa Inggris. Jika Anda mendekati batas, ada dua opsi bersih:

  • Pisahkan pada jeda alami seperti item agenda, ringkas masing-masing, dan kirimkan catatan parsial ke panggilan akhir yang menggabungkannya.
  • Buang konten yang tidak penting, seperti percakapan panjang sebelum rapat dimulai.

Badan permintaan maksimum adalah 8 MB, yang bukan batas praktis untuk teks. Prompt tidak digunakan untuk pelatihan, yang penting jika rekaman mencakup rencana internal atau nama klien.

Detail prompt yang mengubah output

Sebutkan untuk siapa catatan itu

"Catatan untuk insinyur yang melewatkan rapat" mendapatkan detail berbeda daripada "update satu paragraf untuk tim eksekutif". Tulis pembaca ke dalam system prompt.

Berikan daftar peserta kepada model

Speech-to-text sering merusak nama. Baris seperti "Peserta: Priya Nair (PM), Tom Ortiz (backend), Lena Fischer (desain)" memungkinkan model memperbaiki transkrip yang mengatakan "Tom Ortis" dan melampirkan tugas ke orang yang tepat.

Minta keputusan dan tindakan secara terpisah

Keputusan adalah sesuatu yang disepakati oleh kelompok. Tindakan adalah sesuatu yang akan dilakukan oleh satu orang. Ketika keduanya hidup dalam satu daftar, pembaca melewatinya. Kunci yang terpisah membuat pembedaan menjadi eksplisit, dan model mengikutinya secara konsisten.

Simpan hal sensitif di dalamnya

Rapat nyata mengandung bahasa kasar, keluhan tentang orang bernama, kekhawatiran hukum, dan perselisihan panas. Model di sini disesuaikan untuk menjawab tanpa penolakan konten untuk penggunaan dewasa yang sah, jadi ia meringkas apa yang dikatakan daripada menolak. Anda masih memiliki output, jadi tinjau catatan sebelum dikirim ke orang yang tidak ada di ruangan.

Menjalankan sehari penuh rapat

Tim yang merekam enam rapat sehari dapat memprosesnya secara paralel. Dengan 8 permintaan konkuren, kirim hingga delapan sekaligus; kumpulan pekerja kecil dengan semafor melakukan pekerjaan itu. Batas laju per menit untuk kunci penuh adalah 300 permintaan, yang tidak akan dicapai oleh alur kerja rapat.

Node bekerja dengan cara yang sama seperti Python. Berikut adalah versi non-streaming:

import OpenAI from "openai";
import { readFileSync } from "node:fs";

const client = new OpenAI({
  baseURL: "https://api.whisperapis.com/v1",
  apiKey: process.env.API_KEY,
});

const transcript = readFileSync("standup.txt", "utf8");

const resp = await client.chat.completions.create({
  model: "uncensored",
  messages: [
    { role: "system", content: "Summarize the meeting in five bullets, then list action items with owners." },
    { role: "user", content: transcript },
  ],
  temperature: 0.2,
});

console.log(resp.choices[0].message.content);

Jika Anda menerima HTTP 429, baca kode kesalahan. concurrency berarti terlalu banyak permintaan sekaligus, jadi kurangi ukuran pool. rate_limited berarti terlalu banyak per menit. 429 dengan header Retry-After: 5 menandakan kelebihan beban sementara; tunggu lima detik dan coba lagi.

Memeriksa catatan sebelum mempercayainya

Catatan yang dihasilkan dibaca dengan percaya diri bahkan saat salah, jadi buat beberapa pemeriksaan murah ke dalam pipeline daripada mengandalkan manusia untuk memperhatikan.

  • Periksa kutipan. Minta kutipan pendukung singkat untuk setiap item tindakan, lalu cari kutipan tersebut dalam transkrip. Kutipan yang tidak muncul menandakan item tersebut dibuat-buat.
  • Pemeriksaan pemilik. Bandingkan setiap pemilik dengan daftar peserta Anda dan tandai nama yang tidak ada di dalamnya.
  • Cek kosong. Rapat tanpa keputusan mungkin terjadi, tetapi hasil dengan semua array kosong pada transkrip 40 menit biasanya berarti input terpotong atau file yang salah.
  • Cek panjang. Catatan yang lebih panjang dari sekitar seperlima transkrip bukan catatan; perketat prompt atau atur max_tokens.

Catat header respons X-Request-Id di samping setiap hasil yang disimpan. Ketika seseorang mengatakan item tindakan salah, pengenal itu memungkinkan Anda menemukan permintaan dan membandingkannya dengan transkrip. Menyimpan transkrip asli di samping catatan itu murah dan menyelesaikan sebagian besar perselisihan dengan cepat.

Biaya dan uji coba pertama

Harganya adalah $0,15 per juta token input dan $0,50 per juta token output. Rapat satu jam dengan transkrip 12.000 token dan seperangkat catatan 800 token biayanya $0,0018 untuk input dan $0,0004 untuk output, sehingga $0,0022 secara total. Pada tingkat itu $1 mencakup sekitar 454 rapat seperti itu. Lihat halaman harga untuk top-up, yang dimulai dari $20 dan dapat dibayar dengan kartu atau kripto.

Untuk mencobanya, daftar dan buka halaman kunci API. Uji coba satu klik sebesar $0,50 tersedia sekali per orang, berlaku selama 7 hari, tanpa kartu. Jalankan skrip Python di atas pada satu transkrip nyata, baca JSON, dan sesuaikan prompt hingga item tindakan sesuai dengan apa yang terjadi dalam rapat. Kemudian loop ke sisanya.

Tanya jawab

Bisakah saya mengirim rekaman audio secara langsung?

Tidak. API hanya menerima teks. Transkripsikan rekaman dengan alat pengenal suara-ke-teks terlebih dahulu, lalu kirimkan transkripnya.

Bagaimana saya membuat format output konsisten?

Gunakan mode JSON dengan prompt sistem yang menyebutkan setiap kunci, dan atur suhu rendah. Parse hasilnya dalam blok try dan coba lagi sekali jika gagal.

Berapa panjang transkrip yang muat dalam satu permintaan?

Jendela konteks adalah 100.000 token untuk prompt ditambah balasan. Itu mencakup lokakarya sehari penuh dalam kebanyakan kasus.

Apakah transkrip saya digunakan untuk pelatihan?

Tidak, prompt tidak digunakan untuk pelatihan.

Berapa biaya per rapat?

Rapat satu jam dengan transkrip 12.000 token dan ringkasan 800 token biayanya sekitar $0,0022 pada harga $0,15 dan $0,50 per juta token input dan output.

Kunci Anda hanya selangkah lagi dari satu formulir

Buat akun, salin kunci, ubah URL dasar. Itu saja seluruh proses pengaturannya.

Dapatkan kunci API