LLM API 미팅 노트: Python으로 요약하기
LLM API 미팅 노트를 얻으려면 짧은 시스템 프롬프트와 함께 채팅 완료 엔드포인트에 녹취록을 보내고 응답을 읽으세요. 품질을 결정하는 요소는 프롬프트, 고정된 출력 구조 및 긴 녹음 파일 처리 방법입니다.
업데이트

주요 포인트
- 채팅 완료 호출 한 번으로 녹취록을 노트로 변환할 수 있으며, JSON 모드는 고정된 구조를 제공합니다.
- 100,000 토큰의 창은 청크 처리 없이 대부분의 미팅 녹취록을 담을 수 있습니다.
- 누락된 담당자 및 날짜에 대해 모델이 null을 작성하도록 지시하여 모델이 이를 발명하지 않도록 하세요.
- 풀 키는 최대 8개의 동시 요청을 허용하여 하루 미팅을 병렬로 처리하기에 충분합니다.
4단계 파이프라인
- 녹음 및 텍스트 변환 음성 인식 도구를 사용하세요. 이 API는 텍스트 전용이며 음성을 받을 수 없습니다.
- 텍스트 준비 미팅 제목, 날짜 및 참석자 이름이 포함된 헤더를 추가하세요. 화자 라벨이 있으면 큰 도움이 됩니다.
- 모델 호출 원하는 섹션을 정의하는 시스템 프롬프트와 함께 녹취록을 보내세요.
- 결과 저장 및 공유 JSON을 저장하고 Markdown 또는 HTML로 렌더링하여 팀이 확인할 수 있는 곳에 게시하세요.
엔드포인트는 POST /v1/chat/completions (https://api.whisperapis.com/v1)이며, 모델 ID는 uncensored입니다. Base URL과 키를 변경하면 모든 OpenAI SDK를 사용할 수 있습니다. 먼저 음성-텍스트 변환을 설정해야 하는 경우 빠른 시작 가이드에서 텍스트 부분을 다루며, Whisper 호환 서버는 녹취록을 제공할 수 있습니다.
JSON 모드로 구조화된 노트 얻기
자유 형식 요약은 읽기에 적합하지만 파이프라인은 저장하고 필터링할 수 있는 필드를 원합니다. response_format을 {"type": "json_object"}로 설정하여 활성화된 JSON 모드는 모델이 단일 JSON 객체를 반환하도록 합니다. 시스템 프롬프트에서 키를 설명하고 JSON이라는 단어를 사용하세요. 프롬프트가 구조를 정의하기 때문입니다.
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"])해당 프롬프트의 두 줄이 대부분의 역할을 합니다. "전사 내용만 사용하세요"는 모델이 그럴듯한 세부 정보를 추가하지 않도록 합니다. "소유자나 날짜가 명시되지 않은 경우 null을 작성하세요"는 모델이 알지 못한다고 답할 수 있는 합당한 방법을 제공하며, 이는 가짜 이름보다 낫습니다. 0.2와 같은 낮은 temperature는 동일한 전사 내용이 두 번 처리될 때 원하는 실행 간 변동을 줄입니다.
항상 방어적으로 파싱하세요. json.loads를 try 블록으로 감싸고 실패 시 한 번 재시도하세요. 실패한 요청은 요금이 부과되지 않으며, 단일 재시도로 대부분의 일회성 형식 오류가 해결됩니다.
기다리는 사용자에게 스트리밍 결과 제공
누군가가 버튼을 클릭하고 노트를 기다리는 경우 텍스트가 도착하는 대로 표시하세요. stream을 true로 설정하면 API가 서버 전송 이벤트를 보내며, 사용량 정보는 스트림 끝에 포함됩니다.
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)스트리밍에는 하나의 운영상 세부 사항이 있습니다. 스트리밍 요청은 스트림이 끝날 때까지 동시성 슬롯을 보유합니다. 풀 키는 동시에 8개, 체험 키는 2개를 허용합니다. 브라우저 탭이 닫히고 서버가 읽기를 계속하면 해당 슬롯이 사용 중이므로 클라이언트가 연결을 끊을 때 상위 요청을 취소하세요.
누군가 지켜보지 않는 배치 작업의 경우 스트리밍을 건너뛰세요. 일반 요청은 더 간단하며 전체 응답을 하나의 객체로 받습니다.
긴 미팅과 100k 창
컨텍스트 창은 프롬프트와 응답을 합쳐 100,000 토큰입니다. 1시간 미팅은 약 9,000 단어 또는 약 12,000 토큰이며, 따라서 하루 종일 이어지는 워크숍도 한 번의 요청으로 처리할 수 있습니다. 이는 녹취록을 분할하고 각 부분을 요약한 후 요약들을 다시 요약하는 일반적인 맵-리듀스 디자인을 제거합니다. 해당 디자인의 각 패스는 세부 정보를 손실하며, 5분에 내린 결정이 50분에 수정된 경우 잘못 전달하기 쉽습니다.
보내기 전에 크기를 여전히 확인하세요. 영어 텍스트의 경우 문자 수를 4로 나눈 값으로 대략적인 검사를 수행할 수 있습니다. 한계에 가까우면 두 가지 깔끔한 옵션이 있습니다:
- 안건 항목과 같은 자연스러운 분할 지점에서 분할하고 각 부분을 요약한 후 병합하는 최종 호출에 부분 노트를 전달하세요.
- 미팅 시작 전 긴 잡담과 같이 중요하지 않은 콘텐츠를 제거하세요.
최대 요청 본문 크기는 8 MB로, 텍스트에는 실용적인 제한이 아닙니다. 프롬프트는 학습에 사용되지 않으므로 녹음에 내부 계획이나 고객 이름이 포함되어 있다면 중요합니다.
출력을 변경하는 프롬프트 세부 사항
노트 대상자를 명시하세요
미팅에 참석하지 못한 엔지니어를 위한 노트는 "임원진을 위한 1문단 업데이트"와 다른 세부 사항을 얻습니다. 시스템 프롬프트에 독자를 작성하세요.
참석자 목록을 모델에 제공하세요
음성-텍스트 변환은 종종 이름을 왜곡합니다. "참석자: Priya Nair (PM), Tom Ortiz (백엔드), Lena Fischer (디자인)"와 같은 줄은 "Tom Ortis"라고 적힌 녹취록을 수리하고 작업을 올바른 사람에게 연결할 수 있게 합니다.
결정과 액션을 별도로 요청하세요
결정은 그룹이 동의한 사항입니다. 액션은 한 사람이 수행할 작업입니다. 둘이 하나의 목록에 있으면 독자가 읽기를 건너뜁니다. 별도의 키는 구분을 명시적으로 만들고 모델이 이를 일관되게 따르도록 합니다.
민감한 내용을 유지하세요
실제 미팅에는 직설적인 언어, 특정 인물에 대한 불만, 법적 우려 및 격렬한 논쟁이 포함됩니다. 이 모델은 합법적인 성인 사용에 대한 콘텐츠 거부 없이 답변하도록 조정되었으므로, 거절하기보다 말한 내용을 요약합니다. 출력물은 여전히 귀하가 소유하므로, 방에 없었던 사람들에게 전달하기 전에 노트를 검토하세요.
하루 종일 미팅 처리하기
하루에 6번 미팅을 녹음하는 팀은 병렬로 처리할 수 있습니다. 동시 요청 8개로 동시에 최대 8개를 보내세요. 세마포어가 있는 작은 작업자 풀이 작업을 수행합니다. 풀 키의 분당 제한은 300 요청으로, 미팅 파이프라인은 이를 초과하지 않습니다.
Node는 Python과 동일한 방식으로 작동합니다. 다음은 스트리밍이 아닌 버전입니다:
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 응답을 받으면 오류 코드를 읽으세요. concurrency은 동시에 요청이 너무 많음을 의미하므로 풀 크기를 줄이세요. rate_limited은 분당 요청이 너무 많음을 의미합니다. Retry-After: 5 헤더가 있는 429 응답은 임시 과부하를 나타내므로 5초 기다렸다가 다시 시도하세요.
신뢰하기 전에 노트 확인하기
생성된 노트는 잘못되었더라도 자신감 있게 읽히므로, 사람이 알아차리도록 의존하기보다 파이프라인에 몇 가지 저렴한 검사를 구축하세요.
- 인용문 확인 각 액션 아이템에 짧은 지원 인용문을 요청한 후 녹취록에서 검색하세요. 인용문이 나타나지 않으면 해당 항목이 발명되었음을 나타냅니다.
- 담당자 확인 모든 담당자를 참석자 목록과 비교하고 목록에 없는 이름을 플래그 처리하세요.
- 비어 있음 확인 미팅에서 결정이 없는 경우는 가능하지만, 40분 분량의 녹취록에서 모든 배열이 비어 있는 결과는 입력이 잘렸거나 잘못된 파일임을 의미합니다.
- 길이 확인 녹취록의 약 5분의 1보다 긴 노트는 노트가 아닙니다. 프롬프트를 조정하거나
max_tokens을 설정하세요.
각 저장된 결과 옆에 X-Request-Id 응답 헤더를 로그에 기록하세요. 누군가가 할 일을 잘못 기록했다고 말하면 해당 식별자로 요청을 찾아 녹취록과 비교할 수 있습니다. 원본 녹취록을 요약본 옆에 보관하는 것은 저렴하며 대부분의 분쟁을 빠르게 해결합니다.
비용 및 첫 테스트
가격은 입력 토큰 100만 토큰당 $0.15, 출력 토큰 100만 토큰당 $0.50입니다. 12,000 토큰의 녹취록과 800 토큰의 노트가 있는 1시간 분량 회의는 입력에 $0.0018, 출력에 $0.0004가 들어 총 $0.0022가 듭니다. 그 속도로 $1로 약 454회의 회의를 처리할 수 있습니다. 가격 페이지에서 $20부터 시작하는 충전은 카드나 암호화폐로 결제할 수 있습니다.
시도하려면 가입하고 API 키 페이지를 여세요. 1인당 한 번 사용 가능한 $0.50의 원클릭 체험판은 카드 없이 7일 동안 유효합니다. 실제 녹취록 하나에 위의 Python 스크립트를 실행하고 JSON을 읽은 후 액션 아이템이 미팅에서 일어난 일과 일치하도록 프롬프트를 조정하세요. 그런 다음 나머지를 반복하세요.
더 많은 가이드
질문과 답변
음성 녹음을 직접 보낼 수 있나요?
아니요. API는 텍스트만 지원합니다. 먼저 음성 인식 도구로 녹음을 텍스트로 변환한 후 전송하세요.
출력 형식을 일관되게 만드는 방법은 무엇인가요?
모든 키를 명시하는 시스템 프롬프트와 함께 JSON 모드를 사용하고, 낮은 temperature를 설정하세요. try 블록에서 결과를 파싱하고 실패 시 한 번만 재시도하세요.
한 번의 요청에 들어갈 수 있는 분량의 텍스트는 얼마나 되나요?
프롬프트와 응답을 합쳐 컨텍스트 창은 100,000 토큰입니다. 이는 대부분의 경우 하루 종일 진행된 워크숍을 처리할 수 있는 용량입니다.
제 녹취록이 학습에 사용되나요?
아니요, 프롬프트는 학습에 사용되지 않습니다.
미팅당 비용은 얼마인가요?
12,000 토큰의 녹취록과 800 토큰의 요약본이 있는 1시간 분량 회의는 입력 토큰과 출력 토큰이 각각 100만 토큰당 $0.15와 $0.50일 때 약 $0.0022가 듭니다.
키는 양식 하나만 작성하면 받을 수 있습니다
계정을 생성하고 키를 복사한 후 기본 URL을 변경하세요. 설정은 이것으로 끝입니다.