كل الملاحظات

الذكاء الاصطناعي داخل Chrome

نماذج Chrome المدمجة من الداخل — Gemini Nano على جهازك، بلا server ولا API key.

نصائح كل نموذج

أسلوب ملخّص الملخّصات

عند التعامل مع النصوص الطويلة التي تتجاوز حدّ الـ Model، قسّم النصّ إلى أجزاء (chunks)، واقطعه عند حدوده الطبيعيّة: عند الفقرات أو الأقسام، لا في منتصف الجملة — فالجزء لا يرى بقيّة الأجزاء. ثمّ لخّص كلّ جزء وحده، وأخيرًا لخّص الملخّصات كلّها معًا.

رسم توضيحي: تقسيم النص الطويل إلى ثلاثة أجزاء، وتلخيص كل جزء وحده، ثمّ دمج الملخّصات الثلاثة في ملخّص نهائي واحد.
قسّم النص ← لخّص كل جزء ← لخّص الملخّصات.

يمكنك قياس حجم نصّك باستخدام measureInputUsage()، ومعرفة الحدّ الذي يتّسع له الجهاز باستخدام inputQuota.

اختبر فريق Chrome هذا الحلّ على مستند طويل — 110,030 حرفًا — فحصل على ملخّص من 309 أحرف فقط: أقل من 0.3% من الطول الأصلي، وما زال مقروءًا. وإنّما بلغ هذا الحجم لأنّ العمليّة تتكرّر — فكلّما بقيت الملخّصات الجزئيّة مجتمعةً أطول من اللازم، لُخِّصت من جديد، حتى يبقى ملخّص واحد.

بدء الجلسة

لا تبدأ الجلسة فارغة ثم ترسل التعليمات (instructions) مع طلب المستخدم، فتهيئة الجلسة تحتاج وقتًا يُضاف إلى وقت الإجابة، فيبطؤ التنفيذ. أعطِ التعليمات لـ create() منذ البداية، فتُهيَّأ الجلسة على وقتك أنت لا على وقت المستخدم.

لا تفعل
const session = await LanguageModel.create(); // جلسة فارغة — لا شيء مُحمَّل بعد
const review = await session.prompt('You are a code reviewer. Be terse. Review this code:' + code);
افعل
const session = await LanguageModel.create({
  initialPrompts: [{ role: 'system', content: 'You are a code reviewer. Be terse.' }],
});

const review = await session.prompt('Review this code:' + code);

الـ fixed schema للشكل لا للصياغة

الـ fixed schema مفيد للتحكّم في شكل الـ output: أن يعود الرد Array، أو boolean. لكن لا تضع فيه حدًّا لطول النص مثل maxLength: 125 — فالـ model سيضغط المعنى ليتّسع للحدّ، ويرجعلك الناتج بإيموجي وحروف من لغات أخرى. اطلب الطول في التعليمات، أو اقتطع النص في function خارجية.

لا تفعل
"summary": { "type": "string", "maxLength": 125 }   // ✗ drop this
افعل
fitLength(answer.summary, 125)   // length handled after the model answers

نسخ الجلسة أرخص من إنشائها

عند إنشاء جلسة جديدة بالتعليمات نفسها، وبدلًا من استخدام create() ودفع تكلفة التهيئة من جديد، استخدم clone() فيعطيك نسخة بسياقها وتعليماتها جاهزة للعمل. واحتفظ بـ create() للمهام غير المرتبطة التي يعوقها السياق القديم.

// same rules, separate branch — no setup cost
const draft = await session.clone();
const shorter = await draft.prompt('Try a shorter version.');

اكتشف اللغة أولًا

‏نموذج Translator يحتاج إلى sourceLanguage وtargetLanguage معًا. وإذا كنت لا تعرف لغة المصدر، فاكتشفها أولًا باستخدام نموذج LanguageDetector.

const [best] = await detector.detect(text);   // source unknown

const translator = await Translator.create({
  sourceLanguage: best.detectedLanguage,
  targetLanguage: 'en',
});

const translated = await translator.translate(text);

لا تثق بالدرجة المنخفضة

النصوص القصيرة صعبة الاكتشاف — كلمة واحدة أو أحرف قليلة لا تكفي للتمييز بين اللغات. راجِع درجة الثقة، واعتبر الدرجة المنخفضة غير معروفة بدل التخمين.

ابدأ قبل أن يطلب المستخدم

ابدأ الجلسة فور ظهور نيّة المستخدم، لا عند نقره على «إنشاء» — يُحمَّل الـ Model في الخلفية بينما المستخدم ما زال يُعدّ طلبه، فينتهي التحميل قبل أن يطلب.

مساران زمنيان: الانتظار حتى النقر يضع تحميل الـ Model قبل الرد، أما البدء المبكر فيحمّله مسبقًا فيأتي الرد بعد النقر مباشرة.
يبدأ تحميل الـ Model عند مرور المؤشر، فلا يبقى للنقرة ما تنتظره.

أبقِ المستخدم على اطّلاع UX

استخدِم الأنيميشن ومؤشّرات التقدّم بحسب مدى تعقيد المهمة ومدّتها المتوقّعة. واعرض المحتوى الطويل أولًا بأول (streaming): في الملخّصات والمحادثات يظهر النص كلمةً كلمة، وهو شعور طبيعي يقدّم ملاحظات فورية.

يسارًا: صندوق صامت بلا شيء سوى النقاط. يمينًا: الرد نفسه يصل كلمة كلمة مع شريط تقدّم.
الانتظار نفسه، مرة بلا ما يُشاهَد ومرة معه.

سهّل التنقّل بين تعديلات الذكاء الاصطناعي والتراجع عنها UI

اسمح للمستخدمين بالتنقّل بسرعة بين التعديلات التي أجراها الـ Model والتراجع عن أي منها.

جملة فيها كلمتان مُعلَّمتان: كل واحدة تُفحص وتُصحَّح وحدها، وزر التراجع يعيد النص الأصلي كاملًا.
كل تعديل يُفحص ويُطبَّق وحده — وزر واحد يعيد كل شيء.

خزّن نتائج المهام المتكرّرة مؤقتًا

احتفظ بذاكرة تخزين مؤقتة محلية للنتائج — مثل sessionStorage أو IndexedDB — للإدخالات وطلبات البحث المتكرّرة، ووحّد تنسيق الإدخال أولًا حتى يصل الطلب نفسه إلى الذاكرة المؤقتة فعلًا.

حرّر الذاكرة

استدعِ destroy() صراحةً في الجلسات التي لم تعُد بحاجة إليها لإخلاء مساحة في الذاكرة عندما لا تكون الميزة قيد الاستخدام. وإذا كنت تستخدم نمط الاستنساخ، احتفِظ بالجلسة الأساسية وأزِل النسخ.

أفكار

أربعة أمثلة وصلت إلى مستخدمين حقيقيين، مرتّبة على ترتيب النماذج في الأسفل.

محرّر يكتب عناوينه بنفسه

استعملت CyberAgent نموذج LanguageModel لاقتراح العناوين، وكتابة الفقرة التالية، وإعادة صياغة مقطع محدّد — كلّ ذلك داخل محرّر مدوّنة Ameba. وكلّ ميزة زرّ، لا صندوق prompt. ولم يكفِ طلب JSON وحده: فهم يصلحون ردّ الـ Model قبل تحليله.

اقتراحات العناوين تظهر داخل المحرّر، وتحتها أزرار النبرة.
const session = await LanguageModel.create({
  initialPrompts: [{
    role: 'system',
    content: 'Create 3 titles suitable for the blog post content, ' +
             'within 128 characters, and respond in JSON array format.'
  }]
});

const titles = JSON.parse(repairJSON(await session.prompt(draft)));

دراسة الحالة: Chrome for Developers

ألف تقييم في فقرة واحدة

استعملت Miravia نموذج Summarizer لاختصار تقييمات صفحة المنتج، ولكتابة ملخّص جديد كلما غيّر المشتري فلتر النجوم. واستعملته redBus على النحو نفسه لكلّ خطّ سير. وقاست Miravia ارتفاع التحويل في صفحات المنتجات بنسبة 12.4%.

الملخّص يُكتب من جديد كلما تغيّر فلتر التقييم.
const summarizer = await Summarizer.create({
  type: 'tl;dr',
  length: 'short',
  sharedContext:
    'Summarize the given user reviews. Maintain a polite and formal tone.',
});

const summary = await summarizer.summarize(reviewContentList.join('. '));

دراسة الحالة: Chrome for Developers

ملخّص واحد في طرفَي غرفة الأخبار

استعملت Terra نموذج Summarizer داخل نظام إدارة المحتوى، فيلخّص الصحفيّ الخبر بالبرتغاليّة ويعدّله قبل نشره. واستعملته Bright Sites في الطرف الآخر — في متصفّح القارئ على The Standard — حيث يعمل الملخّص بلا اتّصال.

تلخيص الخبر داخل نظام المحتوى قبل نشره.
const options = {
  sharedContext: 'Avoid jargon, use correct grammar, focus on clarity, and ' +
    'ensure the user can grasp the article purpose without needing to open ' +
    'the original content.',
  type: 'teaser',
  format: 'plain-text',
  length: 'long',
};

const summarizer = await Summarizer.create(options);
return await summarizer.summarize(text, { context: options.sharedContext });

دراسة الحالة: Chrome for Developers

إجابة بلغة السائل

تصل Policybazaar أسئلة عملائها بلغات هنديّة كثيرة، فيعرف LanguageDetector لغة السؤال، ثمّ يتولّى Translator الإجابة بها. ويترجم المقالات عند الطلب في نحو ثانيتين لكلّ ألف حرف. وتستعمل JioHotstar النموذجين نفسيهما لإضافة ترجمة للأفلام والمسلسلات التي صدرت بلا ترجمة بلغة المشاهد.

ترجمة تظهر لعمل صدر بلا ترجمة.
const [best] = await detector.detect(message);

const translator = await Translator.create({
  sourceLanguage: best.detectedLanguage,
  targetLanguage,
});

const translatedMessage = await translator.translate(message);

دراسة الحالة: Chrome for Developers

التثبيت والكود

النماذج
التثبيت

1 · التحقق من توافر الـ Model

جوابان، لكلٍّ منهما ما يطلبه منك.


      
  • unavailable — الجهاز أو الإعدادات لا تسمح بتشغيله. أخفِ الميزة وقدّم بديلًا عنها.
  • downloadable — مدعوم لكنه ليس على الجهاز بعد. استدعاء create() يبدأ التنزيل، ولا بدّ أن يأتي بعد نقرة من المستخدم.

2 · التنزيل

استدعاء create لتنزيل الـ Model وعرض نسبة التنزيل.



      

3 · الاستخدام

استدعاء create للـ Model المختار لتهيئته، ثم استخدامه، ثم تحريره.



    
أغسطس 2026