ملاحظات اجتماعات LLM API: من النص إلى الملخص في Python
للحصول على ملاحظات اجتماعات LLM API، أرسل النص إلى نقطة النهاية chat completions مع موجّه نظام قصير واقرأ الرد. العناصر التي تحدد الجودة هي الموجّه، شكل المخرجات الثابت، وكيفية التعامل مع التسجيلات الطويلة.
تم التحديث

نقاط رئيسية
- مكالمة إكمال دردشة واحدة تحول النص إلى ملاحظات؛ وضع JSON يمنحك شكلاً ثابتاً.
- نافذة بسعة 100,000 رمز تستوعب معظم نصوص الاجتماعات دون تقسيم.
- أخبر النموذج بكتابة null للمالكين والتواريخ المفقودة، حتى لا يخترعها.
- المفتاح الكامل يسمح بـ 8 طلبات متزامنة، وهو ما يكفي لمعالجة يوم من الاجتماعات بالتوازي.
خطوات المسار الأربعة
- سجّل وحوّل الكلام إلى نص. استخدم أي أداة تحويل الكلام إلى نص. هذه الـ API للنصوص فقط ولا تقبل الصوت.
- حضّر النص. أضف ترويسة بعنوان الاجتماع والتاريخ وأسماء الحضور. تسميات المتحدثين، إن وجدت، تساعد كثيراً.
- استدعِ النموذج. أرسل النص مع موجّه نظام يحدد الأقسام المطلوبة.
- احفظ النتيجة وشاركها. احفظ ملف JSON، أو اعرضه بصيغة Markdown أو HTML، وانشره في المكان الذي يطلع عليه فريقك.
نقطة النهاية هي POST /v1/chat/completions على https://api.whisperapis.com/v1، ومعرف النموذج هو uncensored، وأي SDK متوافق مع OpenAI يعمل بعد تغيير عنوان URL الأساسي ومفتاح API. إذا كنت بحاجة إلى إعداد تحويل الكلام إلى نص أولاً، فإن دليل البدء السريع يغطي الجانب النصي، وأي خادم متوافق مع Whisper يمكنه توفير النص المنقَل.
احصل على ملاحظات منظمة بوضع JSON
الملخصات الحرة مناسبة للقراءة، لكن خط الأنابيب يحتاج حقولاً يمكنه تخزينها وتصفيتها. وضع JSON، الذي يُفعّل بضبط response_format على {"type": "json_object"}، يجعل النموذج يعيد كائن 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 تقلل التباين بين التشغيلات، وهو ما تريده عندما قد يُعالج النص المنقول نفسه مرتين.
قم دائماً بالتحليل بشكل دفاعي. لفّ json.loads داخل كتلة try، وأعد المحاولة مرة واحدة عند الفشل. الطلبات الفاشلة لا تُحسب تكلفة، ومحاولة إعادة واحدة تصلح معظم أخطاء التنسيق العرضية.
قم ببث النتيجة إلى الشخص الذي ينتظر
إذا ضغط شخص ما على زر وانتظر الملاحظات، اعرض النص أثناء وصوله. اضبط stream على true وترسل الواجهة أحداثًا مرسلة من الخادم (SSE); يُدرج الاستخدام في نهاية البث.
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 رمز، مع احتساب الموجّه والرد معاً. اجتماع مدته ساعة يتكون من حوالي 9,000 كلمة، أو حوالي 12,000 رمز، لذا حتى ورشة العمل التي تمتد طوال اليوم تتسع ضمن نافذة السياق في طلب واحد. هذا يلغي نمط الخريطة والاختزال المعتاد حيث تقسم النص المنقَل، تلخص كل جزء، ثم تلخص الملخصات. كل مرحلة من هذا النمط تفقد التفاصيل، ومن السهل الإبلاغ بشكل خاطئ عن قرار اتخذ في الدقيقة 5 وتم تعديله في الدقيقة 50.
لا تزال تتحقق من الحجم قبل الإرسال. فحص خشن هو تقسيم الأحرف على أربعة للنص الإنجليزي. إذا كنت قريبًا من الحد، فهناك خياران نظيفان:
- اقسم عند الفواصل الطبيعية مثل بنود جدول الأعمال، لخص كل منها، وانقل الملاحظات الجزئية إلى استدعاء نهائي يدمجها.
- تخلص من المحتوى الذي لا يهم، مثل فترات طويلة من المحادثات الجانبية قبل بدء الاجتماع.
الحد الأقصى لجسم الطلب هو 8 MB، وهو ليس حدًا عمليًا للنص. لا تُستخدم الموجّهات في التدريب، وهو أمر مهم إذا كانت التسجيلات تتضمن خططًا داخلية أو أسماء عملاء.
تفاصيل الموجّه التي تغير المخرجات
حدد لمن الملاحظات
"ملاحظات لمهندس فات عليه الاجتماع" تحصل على تفاصيل مختلفة عن "تحديث فقرة واحدة لفريق الإدارة". أدرج وصف القارئ في موجّه النظام.
أعط النموذج قائمة الحضور
غالبًا ما تشوّش تقنية تحويل الكلام إلى نص الأسماء. سطر مثل "الحضور: بريانا ناير (مديرة مشروع)، توم أورتيز (تطوير الواجهات الخلفية)، لينا فيشر (تصميم)" يسمح للنموذج بإصلاح سجل مكتوب فيه "توم أورتيس" وإسناد المهام إلى الشخص الصحيح.
اطلب القرارات والإجراءات بشكل منفصل
القرار هو ما اتفقت عليه المجموعة. الإجراء هو ما سيقوم به شخص واحد. عندما يوجد كلاهما في قائمة واحدة، يتخطاها القراء. المفاتيح المنفصلة تجعل التمييز صريحًا، ويتبعها النموذج بشكل متسق.
احتفظ بالمواد الحساسة
الاجتماعات الحقيقية تحتوي على لغة مباشرة، وشكاوى حول أشخاص محددين، ومخاوف قانونية، ونزاعات ساخنة. النموذج هنا مضبوط للإجابة بدون رفضات محتوى للاستخدام القانوني للبالغين، لذا يلخص ما قيل بدلاً من الرفض. أنت لا تزال تملك المخرجات، لذا راجع الملاحظات قبل إرسالها إلى الأشخاص الذين لم يكونوا في الغرفة.
إجراء يوم كامل من الاجتماعات
فريق يسجل ستة اجتماعات في اليوم يمكنه معالجتها بالتوازي. مع 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 يعني طلبات كثيرة جداً في الدقيقة. استجابة 429 مع Retry-After: 5 تشير إلى حمل زائد مؤقت؛ انتظر خمس ثوانٍ وحاول مرة أخرى.
التحقق من الملاحظات قبل الوثوق بها
تُقرأ الملاحظات المُنشأة بثقة حتى عندما تكون خاطئة، لذا أضف بعض عمليات التحقق الرخيصة إلى خط الأنابيب بدلاً من الاعتماد على شخص يلاحظ الأخطاء.
- فحص الاقتباس. اطلب اقتباساً داعماً قصيراً مع كل بند عمل، ثم ابحث عنه في النص المنقَل. اقتباس غير موجود هو علامة على أن البند مختلق.
- التحقق من المالك. قارن كل مالك بقائمة الحضور وعلّم الأسماء غير الموجودة فيها.
- التحقق من الفراغ. من الممكن أن يكون الاجتماع بلا قرارات، لكن نتيجة تحتوي على مصفوفات فارغة في نص مدته 40 دقيقة تعني عادةً أن النص الأصلي مُقتطع أو أن الملف غير الصحيح مُستخدم.
- فحص الطول. الملاحظات الأطول من حوالي خمس النص المحوّل ليست ملاحظات؛ شدد الموجّه أو اضبط
max_tokens.
سجّل رأس البيانات X-Request-Id بجانب كل نتيجة محفوظة. عندما يقول شخص ما أن بند العمل خاطئ، يسمح لك هذا المعرف بالعثور على الطلب ومقارنته مع النص المحوّل. الاحتفاظ بالنص المحوّل الأصلي بجانب الملاحظات رخيص الثمن ويحل معظم النزاعات بسرعة.
التكلفة واختبار أولي
السعر هو $0.15 لكل مليون رمز مدخل و$0.50 لكل مليون رمز مخرج. تكلفة اجتماع مدته ساعة مع نص مدته 12000 رمز ومجموعة ملاحظات مدتها 800 رمز هي $0.0018 للإدخال و$0.0004 للإخراج، أي $0.0022 في المجموع. بمعدل ذلك، يغطي $1 حوالي 454 اجتماعاً من هذا النوع. انظر صفحة التسعير للشحنات، التي تبدأ من $20 ويمكن دفعها بالبطاقة أو العملات المشفرة.
للتجربة، سجّل وانقر على صفحة مفتاح API. تتوفر تجربة بنقرة واحدة بقيمة $0.50 مرة واحدة لكل شخص، صالحة لمدة 7 أيام، دون الحاجة إلى بطاقة. شغّل نص Python أعلاه على نص مسجل حقيقي، اقرأ الـ JSON، وعدّل الـ prompt حتى تتطابق بنود الإجراء مع ما حدث في الاجتماع. ثم كرر العملية على باقي النصوص.
المزيد من الأدلة
أسئلة وأجوبة
هل يمكنني إرسال تسجيلات صوتية مباشرة؟
لا. الـ API يقبل النص فقط. حوّل التسجيل إلى نص باستخدام أداة تحويل الكلام إلى نص أولاً، ثم أرسل النص المحوّل.
كيف أجعل تنسيق المخرجات متسقًا؟
استخدم وضع JSON مع موجّه نظام يحدد كل مفتاح، واضبط درجة حرارة منخفضة. قم بتحليل النتيجة في كتلة try وأعد المحاولة مرة واحدة عند الفشل.
كم يبلغ طول النص الذي يتسع لطلب واحد؟
تتسع نافذة السياق لـ 100,000 رمز إجمالاً، بما في ذلك النص الموجه والرد. وهذا يغطي ورشة عمل ليوم كامل في معظم الحالات.
هل تُستخدم نصوصي في التدريب؟
لا، لا تُستخدم الموجّهات في التدريب.
كم يكلف الاجتماع الواحد؟
يبلغ تكلفة اجتماع مدته ساعة مع نص محادثة مكون من 12,000 رمز وملخص مكون من 800 رمز حوالي $0.0022 عند سعر $0.15 و $0.50 لكل مليون رمز مدخل ومخرج.
مفتاحك على بُعد نموذج تعبئة واحد
أنشئ حساباً، وانسخ المفتاح، ثم غيّر نقطة النهاية (base URL). هذه هي الإعدادات الكاملة.