Ghi chú cuộc họp LLM API: Chuyển bản ghi lời thành tóm tắt bằng Python Python
Để lấy ghi chú cuộc họp LLM API, bạn gửi bản ghi đến endpoint chat completions với một system prompt ngắn và đọc phản hồi. Các yếu tố quyết định chất lượng là prompt, định dạng đầu ra cố định và cách bạn xử lý các bản ghi dài.
Cập nhật

Điểm chính
- Một lệnh gọi chat completion duy nhất biến bản ghi thành ghi chú; chế độ JSON cung cấp cho bạn một định dạng cố định.
- Cửa sổ 100.000 token chứa hầu hết các bản ghi cuộc họp mà không cần phân đoạn.
- Hãy bảo mô hình ghi null cho những người phụ trách và ngày tháng bị thiếu, để nó không tự tạo ra chúng.
- Một khóa đầy đủ cho phép 8 yêu cầu đồng thời, đủ để xử lý một ngày cuộc họp theo cách song song.
Quy trình gồm bốn bước
- Ghi âm và chuyển đổi văn bản. Hãy dùng bất kỳ công cụ chuyển giọng nói thành văn bản nào. API này chỉ nhận văn bản và không chấp nhận âm thanh.
- Chuẩn bị văn bản. Thêm tiêu đề chứa tên cuộc họp, ngày và tên những người tham dự. Nhãn người nói, nếu bạn có, sẽ giúp ích rất nhiều.
- Gọi mô hình. Gửi bản ghi với một system prompt xác định các phần bạn muốn.
- Lưu và chia sẻ kết quả. Lưu JSON, hiển thị dưới dạng Markdown hoặc HTML, đăng ở nơi nhóm của bạn đọc.
Endpoint là POST /v1/chat/completions trên https://api.whisperapis.com/v1, model ID là uncensored, và bất kỳ SDK OpenAI nào cũng hoạt động sau khi bạn thay đổi đường dẫn cơ sở và khóa. Nếu bạn cần thiết lập chuyển giọng nói thành văn bản trước, tài liệu bắt đầu nhanh sẽ bao gồm phần văn bản và bất kỳ máy chủ tương thích Whisper nào cũng có thể cung cấp bản ghi chép.
Nhận ghi chú có cấu trúc với chế độ JSON
Các bản tóm tắt tự do khá tốt để đọc, nhưng một quy trình xử lý cần các trường dữ liệu mà nó có thể lưu trữ và lọc. Chế độ JSON, được bật bằng cách đặt response_format thành {"type": "json_object"}, khiến mô hình trả về một đối tượng JSON duy nhất. Hãy mô tả các khóa trong prompt hệ thống và đề cập đến từ JSON ở đó, vì prompt chính là thứ xác định cấu trúc.
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"])Hai dòng trong prompt đó thực hiện hầu hết công việc. "Chỉ sử dụng những gì bản chép lời nói" giúp mô hình không thêm các chi tiết hợp lý. "Nếu chủ sở hữu hoặc ngày không được nêu rõ, hãy ghi null" cung cấp cho nó một cách hợp lệ để nói rằng nó không biết, điều này tốt hơn là một cái tên được bịa ra. Nhiệt độ thấp như 0.2 làm giảm sự biến đổi giữa các lần chạy, điều bạn muốn khi cùng một bản chép lời có thể được xử lý hai lần.
Luôn phân tích một cách phòng thủ. Bao bọc json.loads trong một khối try, và khi thất bại hãy thử lại một lần. Các yêu cầu thất bại không bị tính phí, và một lần thử lại sửa chữa hầu hết các lỗi định dạng nhất thời.
Truyền phát kết quả cho người đang chờ
Nếu ai đó nhấp vào nút và chờ ghi chú, hãy hiển thị văn bản khi nó đến. Đặt stream thành true và API gửi các sự kiện do máy chủ gửi; việc sử dụng được bao gồm ở cuối luồng.
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)Truyền phát có một chi tiết hoạt động: một yêu cầu truyền phát giữ slot độ đồng thời của nó cho đến khi luồng kết thúc. Một khóa đầy đủ cho phép 8 cùng lúc, một khóa dùng thử là 2. Nếu một tab trình duyệt đóng và máy chủ của bạn vẫn đang đọc, slot đó vẫn bận, vì vậy hãy hủy yêu cầu upstream khi khách hàng ngắt kết nối.
Đối với các tác vụ hàng loạt mà không ai theo dõi, hãy bỏ qua truyền phát. Một yêu cầu đơn giản đơn giản hơn và bạn nhận được toàn bộ câu trả lời trong một đối tượng.
Các cuộc họp dài và cửa sổ 100k
Cửa sổ ngữ cảnh là 100.000 token, tính cả prompt và phản hồi cùng nhau. Một cuộc họp một giờ là khoảng 9.000 từ, hoặc khoảng 12.000 token, vì vậy ngay cả một hội thảo cả ngày cũng vừa trong một yêu cầu. Điều đó loại bỏ thiết kế map-and-reduce thông thường nơi bạn chia một bản ghi, tóm tắt từng phần và sau đó tóm tắt các bản tóm tắt. Mỗi lần chạy của thiết kế đó làm mất chi tiết, và một quyết định được đưa ra vào phút 5 và được sửa đổi vào phút 50 rất dễ bị báo cáo sai.
Vẫn hãy kiểm tra kích thước trước khi gửi. Một kiểm tra thô là ký tự chia cho bốn đối với văn bản tiếng Anh. Nếu bạn gần giới hạn, có hai tùy chọn sạch sẽ:
- Chia tại các điểm ngắt tự nhiên như các mục chương trình nghị sự, tóm tắt từng phần, và chuyển các ghi chú một phần sang lệnh gọi cuối cùng hợp nhất chúng.
- Loại bỏ nội dung không quan trọng, chẳng hạn như những khoảng thời gian dài trò chuyện nhỏ trước khi cuộc họp bắt đầu.
Kích thước tối đa của thân yêu cầu là 8 MB, đây không phải là giới hạn thực tế đối với văn bản. Các prompt không được sử dụng để huấn luyện, điều này quan trọng nếu các bản ghi bao gồm các kế hoạch nội bộ hoặc tên khách hàng.
Chi tiết prompt thay đổi đầu ra
Nói ghi chú dành cho ai
"Ghi chú cho một kỹ sư đã bỏ lỡ cuộc họp" có chi tiết khác với "bản cập nhật một đoạn văn cho nhóm điều hành". Hãy viết người đọc vào system prompt.
Cung cấp cho mô hình danh sách người tham dự
Chuyển giọng nói thành văn bản thường làm rối tên. Một dòng như "Người tham dự: Priya Nair (PM), Tom Ortiz (backend), Lena Fischer (thiết kế)" cho phép mô hình sửa chữa một bản ghi nói "Tom Ortis" và gắn các nhiệm vụ cho đúng người.
Yêu cầu quyết định và hành động riêng biệt
Một quyết định là điều mà nhóm đã đồng ý. Một hành động là điều mà một người sẽ làm. Khi cả hai sống trong một danh sách, người đọc sẽ bỏ qua nó. Các khóa riêng biệt làm rõ sự khác biệt, và mô hình tuân theo nó một cách nhất quán.
Giữ thông tin nhạy cảm
Các cuộc họp thực sự chứa ngôn ngữ thẳng thắn, phàn nàn về những người được đặt tên, lo lắng pháp lý và các cuộc tranh cãi nảy lửa. Mô hình ở đây được tinh chỉnh để trả lời mà không từ chối nội dung đối với việc sử dụng người lớn hợp pháp, vì vậy nó tóm tắt những gì đã được nói thay vì từ chối. Bạn vẫn sở hữu đầu ra, vì vậy hãy xem xét ghi chú trước khi chúng được gửi đến những người không có trong phòng.
Chạy một ngày đầy đủ các cuộc họp
Một nhóm ghi âm sáu cuộc họp mỗi ngày có thể xử lý chúng theo cách song song. Với 8 yêu cầu đồng thời, hãy gửi tối đa tám cùng lúc; một nhóm công nhân nhỏ với một semaphore sẽ thực hiện công việc. Giới hạn theo phút cho một khóa đầy đủ là 300 yêu cầu, điều mà một pipeline cuộc họp sẽ không đạt tới.
Node hoạt động giống như Python. Đây là phiên bản không truyền phát:
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);Nếu bạn nhận được HTTP 429, hãy đọc mã lỗi. concurrency có nghĩa là quá nhiều yêu cầu cùng lúc, vì vậy hãy giảm kích thước nhóm. rate_limited có nghĩa là quá nhiều mỗi phút. Một lỗi 429 với tiêu đề Retry-After: 5 báo hiệu quá tải tạm thời; hãy đợi năm giây và thử lại.
Kiểm tra ghi chú trước khi tin tưởng chúng
Ghi chú được tạo ra đọc một cách tự tin ngay cả khi chúng sai, vì vậy hãy xây dựng một vài kiểm tra rẻ tiền vào pipeline thay vì dựa vào con người để nhận ra.
- Kiểm tra trích dẫn. Yêu cầu một trích dẫn ngắn hỗ trợ với mỗi mục hành động, sau đó tìm kiếm bản ghi cho nó. Một trích dẫn không xuất hiện là dấu hiệu mục đã được tạo ra.
- Kiểm tra chủ sở hữu. So sánh mọi chủ sở hữu với danh sách người tham dự của bạn và đánh dấu các tên không có trong danh sách đó.
- Kiểm tra mảng rỗng. Một cuộc họp không có quyết định là có thể, nhưng một kết quả có tất cả các mảng trống trên một bản chép lời 40 phút thường có nghĩa là đầu vào đã bị cắt ngắn hoặc tệp sai.
- Kiểm tra độ dài. Ghi chú dài hơn khoảng một phần năm của bản chép lời không phải là ghi chú; hãy điều chỉnh prompt hoặc đặt
max_tokens.
Ghi lại tiêu đề phản hồi X-Request-Id bên cạnh mỗi kết quả đã lưu. Khi ai đó nói rằng một mục hành động không chính xác, định danh đó cho phép bạn tìm yêu cầu và so sánh nó với bản chép lời. Việc giữ bản chép lời gốc bên cạnh ghi chú rất rẻ và giải quyết hầu hết các tranh chấp một cách nhanh chóng.
Chi phí và thử nghiệm đầu tiên
Giá là $0,15 cho mỗi triệu token đầu vào và $0,50 cho mỗi triệu token đầu ra. Một cuộc họp một giờ với bản ghi chép 12.000 token và bộ ghi chú 800 token tốn $0,0018 cho đầu vào và $0,0004 cho đầu ra, tổng cộng là $0,0022. Với tỷ lệ đó, $1 sẽ đủ cho khoảng 454 cuộc họp như vậy. Xem trang giá cả để biết các khoản nạp tiền, bắt đầu từ $20 và có thể thanh toán bằng thẻ hoặc tiền mã hóa.
Để dùng thử, hãy đăng ký và mở trang khóa API. Gói dùng thử một lần nhấp với giá $0,50 có sẵn một lần cho mỗi người, có hiệu lực trong 7 ngày, không cần thẻ. Chạy script Python ở trên với một bản ghi chép thực, đọc JSON và điều chỉnh prompt cho đến khi các mục hành động khớp với những gì đã xảy ra trong cuộc họp. Sau đó lặp lại với những phần còn lại.
Hướng dẫn khác
Hỏi đáp
Tôi có thể gửi bản ghi âm trực tiếp không?
Không. API chỉ nhận văn bản. Bạn hãy chuyển đổi bản ghi âm sang văn bản bằng công cụ chuyển giọng nói thành văn bản trước, rồi gửi bản ghi đó.
Làm thế nào để định dạng đầu ra nhất quán?
Bạn hãy dùng chế độ JSON với một system prompt liệt kê tất cả các khóa, và đặt nhiệt độ thấp. Bạn hãy phân tích kết quả trong một khối try và thử lại một lần khi có lỗi.
Một bản ghi âm dài bao nhiêu thì vừa với một yêu cầu?
Cửa sổ ngữ cảnh là 100.000 token cho prompt và phản hồi. Điều đó bao gồm một buổi hội thảo cả ngày trong hầu hết các trường hợp.
Bản ghi chép của tôi có được sử dụng để huấn luyện không?
Không, các prompt không được dùng để huấn luyện.
Chi phí cho mỗi cuộc họp là bao nhiêu?
Một cuộc họp kéo dài một giờ với bản ghi chép 12.000 token và bản tóm lược 800 token tốn khoảng $0,0022 ở mức giá $0,15 và $0,50 cho mỗi triệu token đầu vào và đầu ra.
Khóa của bạn chỉ cách một bước
Tạo tài khoản, sao chép khóa, thay đổi URL cơ sở. Đó là toàn bộ thiết lập.