LLM API Toplantı Notları: Python ile Transkriptten Özet
LLM API toplantı notları almak için, kısa bir sistem istemi ile transkripti bir chat completions uç noktasına gönderirsiniz ve yanıtı okursunuz. Kaliteyi belirleyen parçalar istem, sabit bir çıktı şekli ve uzun kayıtları nasıl işlediğinizdir.
güncellendi

Temel noktalar
- Tek bir chat completion çağrısı transkripti notlara dönüştürür; JSON modu size sabit bir şekil verir.
- 100.000 token'lık bir pencere, çoğu toplantı transkriptini parçalara ayırmadan sığdırır.
- Eksik sahipler ve tarihler için modele null yazmasını söyleyin, böylece bunları uydurmasın.
- Tam bir anahtar 8 eşzamanlı istek yapmanızı sağlar; bu, bir gün toplantılarını paralel olarak işlemek için yeterlidir.
Dört adımlı iş akışı
- Kaydedin ve transkript haline getirin. Herhangi bir konuşmadan metne dönüştürme aracı kullanın. Bu API yalnızca metin alır ve ses dosyası kabul etmez.
- Metni hazırlayın. Toplantı başlığı, tarihi ve katılımcı isimlerini içeren bir üst bilgi ekleyin. Konuşmacı etiketleri, varsa, çok yardımcı olur.
- Modeli çağırın. İstediğiniz bölümleri tanımlayan bir sistem istemi ile transkripti gönderin.
- Sonucu kaydedin ve paylaşın. JSON'u kaydedin, Markdown veya HTML olarak işleyin, ekibin okuyacağı yere yayınlayın.
Uç nokta POST /v1/chat/completions, Base URL https://api.whisperapis.com/v1, model ID'si uncensored şeklindedir ve Base URL ile anahtarı değiştirdikten sonra herhangi bir OpenAI SDK çalışır. Önce konuşmadan metne dönüştürme kurulumu yapmanız gerekirse, hızlı başlangıç dokümanları metin kısmını kapsar ve herhangi bir Whisper uyumlu sunucu transkript sağlayabilir.
JSON modu ile yapılandırılmış notlar alın
Serbest biçimli özetler okuma için uygundur, ancak bir iş akışı saklayabileceği ve filtreleyebileceği alanlar ister. response_format, {"type": "json_object"} olarak ayarlandığında etkinleştirilen JSON modu, modelin tek bir JSON nesnesi döndürmesini sağlar. Anahtarları sistem isteminde tanımlayın ve orada JSON kelimesini belirtin, çünkü şekli belirleyen istemdir.
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"])O istemde iki satır işin çoğunu yapar. "Yalnızca transkriptte ne söylenmişse onu kullan" modelin makul detaylar eklemesini engeller. "Bir sahip veya tarih belirtilmemişse null yaz" modelin bilmediğini belirtmesi için geçerli bir yol sunar; bu, uydurma bir isimden daha iyidir. 0.2 gibi düşük bir sıcaklık, aynı transkript iki kez işlenirse çalışmalar arasındaki varyasyonu azaltır.
Her zaman savunmacı ayrıştırma yapın. json.loads'i bir try bloğuna sarın ve başarısızlık durumunda bir kez yeniden deneyin. Başarısız istekler ücretlendirilmez ve tek bir yeniden deneme çoğu tek seferlik biçimlendirme hatalarını düzeltir.
Sonucu bekleyen kişiye akış olarak gönderin
Birisi bir düğmeye tıklar ve notları beklerse, metni geldiği gibi gösterin. stream değerini true olarak ayarlayın ve API sunucu tarafından gönderilen olaylar gönderir; kullanım akışın sonunda dahil edilir.
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)Akışın bir işlemsel detayı vardır: akışlı bir istek, akış bitene kadar eşzamanlılık slotunu tutar. Tam bir anahtar aynı anda 8'e izin verir, deneme anahtarı 2'ye. Bir tarayıcı sekmesi kapanır ve sunucunuz okumaya devam ederse, bu slot meşgul kalır; istemci bağlantısı kesildiğinde üst istek iptal edilmelidir.
Kimse izlemediği toplu işler için akışı atlayın. Düz bir istek daha basittir ve tüm cevabı tek bir nesne olarak alırsınız.
Uzun toplantılar ve 100k pencere
Bağlam penceresi 100.000 token'dır; istem ve yanıt birlikte sayılır. Bir saatlik toplantı yaklaşık 9.000 kelime veya yaklaşık 12.000 token'dır, bu nedenle tüm gün süren bir atölye bile tek bir istekte sığar. Bu, transkripti bölme, her kısmı özetleme ve sonra özetleri özetleme gibi geleneksel haritalama ve azaltma tasarımını ortadan kaldırır. Bu tasarımın her aşaması ayrıntı kaybına yol açar; 5. dakikada alınan bir karar ve 50. dakikada yapılan bir değişiklik kolayca yanlış aktarılabilir.
Yine de göndermeden önce boyutu kontrol edin. İngilizce metin için kaba bir kontrol karakterlerin dört bölünmesidir. Sınıra yakınsanız, iki temiz seçeneğiniz var:
- Doğal duraklarda (gündem maddeleri gibi) bölün, her birini özetleyin ve kısmi notları birleştirmek için son çağrıya aktarın.
- Toplantı başlamadan önceki uzun sohbetler gibi önemli olmayan içeriği atın.
Maksimum istek gövdesi 8 MB'tır; bu, metin için pratik bir sınır değildir. İstemler eğitim için kullanılmaz; bu, kayıtlar iç planlar veya müşteri adları içeriyorsa önemlidir.
Çıktıyı değiştiren istem detayları
Notların kime ait olduğunu söyleyin
"Toplantıya katılamayan bir mühendis için notlar", "yönetici ekibi için bir paragraflık güncelleme"den farklı detaylar alır. Okuyucuyu sistem istemine yazın.
Modeli katılımcı listesine verin
Konuşmadan metne dönüştürme sıklıkla isimleri bozar. "Katılımcılar: Priya Nair (PM), Tom Ortiz (backend), Lena Fischer (tasarım)" gibi bir satır, "Tom Ortis" diyen bir transkripti onarmaya ve görevleri doğru kişiye bağlamaya olanak tanır.
Kararları ve eylemleri ayrı olarak isteyin
Bir karar, grubun üzerinde anlaştığı bir şeydir. Bir eylem, bir kişinin yapacağı bir şeydir. İkisi tek bir listede olduğunda, okuyucular atlar. Ayrı anahtarlar ayrımı açık hale getirir ve model buna tutarlı şekilde uyar.
Hassas bilgileri içinde tutun
Gerçek toplantılar sert dil, isimli insanlardan şikayetler, hukuki endişeler ve kızgın tartışmalar içerir. Burada model, yasal yetişkin kullanımı için içerik reddi olmadan cevap verecek şekilde ayarlanmıştır, bu yüzden reddetmek yerine söylenenleri özetler. Çıktı hala size ait olduğu için, odada olmayan kişilere gitmeden önce notları gözden geçirin.
Bir günün tüm toplantılarını çalıştırma
Günde altı toplantı kaydeden bir ekip, bunları eşzamanlı olarak işleyebilir. 8 eşzamanlı istek ile aynı anda sekize kadar gönderin; semafor ile küçük bir işçi havuzu işi halleder. Tam bir anahtar için dakikadaki hız limiti 300 istektir; bu bir toplantı iş akışı tarafından aşılmaz.
Node, Python ile aynı şekilde çalışır. İşte akış olmayan sürüm:
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);HTTP 429 alırsanız, hata kodunu okuyun. concurrency aynı anda çok fazla istek olduğu anlamına gelir, bu nedenle havuz boyutunu düşürün. rate_limited dakika başına çok fazla olduğu anlamına gelir. Retry-After: 5 başlığı ile bir 429 geçici aşırı yükü işaret eder; beş saniye bekleyin ve tekrar deneyin.
Notlara güvenmeden önce kontrol etme
Üretilen notlar yanlış olsalar bile güvenle okunur; bu nedenle insanın fark etmesine güvenmek yerine iş akışına birkaç ucuz kontrol ekleyin.
- Alıntı kontrolü. Her eylem öğesi için kısa bir destekleyici alıntı isteyin, ardından transkriptte arayın. Görünmeyen bir alıntı, öğenin uydurulduğunun bir işaretidir.
- Sahip kontrolü. Her sahibi katılımcı listenizle karşılaştırın ve listede olmayan isimleri işaretleyin.
- Boşluk kontrolü. Kararsız bir toplantı mümkündür ancak 40 dakikalık bir transkript için tüm diziler boş olan bir sonuç, genellikle girdinin kesildiğini veya yanlış dosya kullanıldığını gösterir.
- Uzunluk kontrolü. Transkriptin yaklaşık beşte birinden uzun olan notlar not değildir; istemi sıkılaştırın veya
max_tokensayarlayın.
Her kaydedilen sonucun yanına X-Request-Id yanıt başlığını günlüğe kaydedin. Bir eylem maddesinin yanlış olduğunu söylediğinde, bu tanımlayıcı isteği bulmanızı ve transkript ile karşılaştırmanızı sağlar. Orijinal transkripti notların yanında tutmak ucuzdur ve çoğu anlaşmazlığı hızla çözer.
Maliyet ve ilk test
Fiyat milyon başına girdi token için $0,15 ve milyon başına çıktı token için $0,50'dir. 12.000 token'lık bir transkript ve 800 token'lık bir not seti içeren bir saatlik toplantı, girdi için $0,0018 ve çıktı için $0,0004 tutarındadır, yani toplam $0,0022. Bu oranda $1 yaklaşık 454 böyle toplantıyı karşılar. Bakiye yüklemeleri için fiyatlama sayfasına bakın, $20'den başlar ve kart veya kripto ile ödenebilir.
Denemek için kaydolun ve API anahtarı sayfasını açın. Kişi başı bir kez geçerli, 7 gün boyunca geçerli, kart gerekmeden tek tıkla $0,50 deneme kredisi mevcuttur. Yukarıdaki Python betiğini gerçek bir transkript üzerinde çalıştırın, JSON'u okuyun ve eylem maddeleri toplantıda olanlarla eşleşene kadar istemi ayarlayın. Ardından kalanlar için döngüye girin.
Daha fazla kılavuz
Sorular ve cevaplar
Ses kayıtlarını doğrudan gönderebilir miyim?
Hayır. API yalnızca metin alır. Kaydı bir konuşmadan metne dönüştürme aracıyla transkript haline getirin, ardından metni gönderin.
Çıktı formatını nasıl tutarlı hale getiririm?
Her anahtarı adlandıran bir sistem istemi ile JSON modunu kullanın ve düşük bir temperature parametresi ayarlayın. Sonucu bir try bloğunda ayrıştırın ve başarısızlık durumunda bir kez yeniden deneyin.
Bir istekte bir transkript ne kadar uzun olabilir?
Bağlam penceresi, istem ve yanıt için 100.000 token'dır. Bu, çoğu durumda tam gün süren bir atölye çalışmasını kapsar.
Transkriptlerim eğitim için kullanılıyor mu?
Hayır, istemler eğitim için kullanılmaz.
Toplantı başına maliyet ne kadar?
12.000 token'lık bir transkript ve 800 token'lık bir özet içeren bir saatlik toplantı, milyon başına girdi ve çıktı token'lar için sırasıyla $0,15 ve $0,50 fiyatla yaklaşık $0,0022 tutarındadır.
Anahtarınız tek bir formun uzağında
Bir hesap oluşturun, anahtarı kopyalayın, base URL'yi değiştirin. Tüm kurulum bu kadar.