إنشاء مساعِد كتابة باستخدام الذكاء الاصطناعي (AI) باستخدام Wordcraft

نحب القصص. قد يكون سرد القصص والقيام بأشكال أخرى من الكتابة الإبداعية أمرًا صعبًا ومجزيًا. ومع ذلك، قد يبدو إنشاء قصصك الخاصة من صفحة فارغة أمرًا شاقًا وحتى مربكًا في بعض الأحيان. يمكن أن تكون النماذج التوليدية للذكاء الاصطناعي (AI) أداة رائعة لمساعدتك في تجاوز الصفحة الفارغة وبناء السرد.

يشرح لك هذا الدليل التوجيهي طريقة تطوير Wordcraft، وهي أداة لكتابة القصص مستندة إلى الذكاء الاصطناعي (AI) أنشأها فريق أبحاث الأشخاص والذكاء الاصطناعي من Google. يستخدم تطبيق الويب هذا واجهة Gemini API لمساعدتك في إنشاء القصص، شيئًا فشيئًا من خلال إنشاء الأفكار، وكتابة أجزاء من قصصك، ومراجعة المحتوى لإضافة المزيد من التفاصيل. يمكنك تعديل Wordcraft لتتناسب إلى حد كبير مع أسلوبك في الكتابة، وإنشاء عناصر تحكم جديدة في الكتابة لدعم سير العمل بشكل أفضل.

للحصول على نظرة عامة عبر الفيديو عن المشروع وكيفية تمديده، بما في ذلك إحصاءات من المسؤولين عن إنشائه، يمكنك الاطّلاع على مقالة مساعد الكتابة بالذكاء الاصطناعي (AI) - Build with Google AI. خلاف ذلك، يمكنك البدء في تمديد المشروع باتباع الإرشادات أدناه.

إعداد المشروع

ترشدك هذه التعليمات خلال إعداد مشروع Wordcraft للتطوير والاختبار. تحتاج إلى تثبيت البرنامج الأساسي، ونسخ المشروع من مستودع الرموز، ثم تشغيل تثبيت التكوين، وتعيين بعض متغيرات البيئة. يمكنك اختبار الإعداد لديك عن طريق تشغيل المشروع بعد إكمال هذه الخطوات.

تثبيت المتطلبات الأساسية

يستخدم مشروع Wordcraft Node وnpm لإدارة الحزم وتشغيل التطبيق. تعليمات التثبيت التالية مخصَّصة لجهاز مضيف يعمل بنظام التشغيل Linux.

لتثبيت البرنامج المطلوب:

نسخ المشروع وإعداده

نزِّل رمز المشروع واستخدِم أمر التثبيت npm لتنزيل التبعيات المطلوبة وإعداد المشروع. تحتاج إلى برنامج التحكم في المصدر git لاسترداد رمز المصدر للمشروع.
لتنزيل رمز المشروع وإعداده:

  1. استنسِخ مستودع git باستخدام الأمر التالي.
    git clone https://github.com/PAIR-code/wordcraft
    
  2. انتقِل إلى الدليل الجذري لمشروع Wordcraft.
    cd wordcraft/
    
  3. شغِّل الأمر install لتنزيل الاعتماديات وإعداد المشروع:
    npm install
    

ضبط متغيرات البيئة

اضبط المتغيرات البيئية المطلوبة للسماح بتشغيل مشروع رمز Wordcraft، وتحديداً مفتاح واجهة برمجة تطبيقات Google Gemini. تعليمات التثبيت التالية مخصصة لجهاز مضيف يعمل بنظام التشغيل Linux.

لضبط متغيرات البيئة:

  1. احصل على مفتاح واجهة برمجة تطبيقات Google Gemini وانسخ سلسلة المفتاح.
  2. انتقِل إلى الدليل الجذري لمشروع Wordcraft.
    cd wordcraft/
    
  3. ضبط مفتاح واجهة برمجة التطبيقات كمتغيّر للبيئة على مضيفي نظام التشغيل Linux، استخدِم الأوامر التالية.
    touch .env
    echo "API_KEY="<YOUR_API_KEY>"" > .env
    

اختبار الإعداد

من المفترض أن تكون قادرًا الآن على اختبار إعداد مشروعك عن طريق تشغيل Wordcraft على جهازك. هذه الخطوة اختيارية، ولكننا ننصح بها.

شاشة بدء Wordcraft

لاختبار التثبيت والإعداد:

  1. انتقِل إلى الدليل الجذري لمشروع Wordcraft.
    cd wordcraft/
    
  2. إدارة المشروع في وضع التطوير:
    npm run dev
    
  3. في متصفّح الويب، انتقِل إلى واجهة مستخدم Wordcraft. ويظهر العنوان المحدَّد في مخرجات الأمر السابق، على سبيل المثال:
    http://localhost:3000/
    
    .

تعديل نص نموذج الطلب

واجهة مستخدم أوامر Wordcraft تنشئ Wordcraft طلبات لنموذج الذكاء الاصطناعي التوليدي باستخدام مجموعة من الأمثلة لكل عملية للمساعدة في الكتابة، مثل الطلبات start new story وgenerate text. توجه الأمثلة النموذج التوليدي في إنشاء نص لقصتك، ومن خلال تعديل الأمثلة الخاصة بعملية ما، يمكنك تغيير الناتج لاتباع نمط أو أسلوب كتابة مختلف. يعد هذا النهج طريقة بسيطة لجعل Wordcraft يكتب بالطريقة التي تريدها.

يوضح المثال التالي تعديلاً لأمثلة new_story في Wordcraft. الهدف من هذا التعديل هو توجيه النموذج التوليدي للذكاء الاصطناعي (AI) لكتابة مقدّمات القصص باستخدام أسلوب مونولوج داخلي واستخدام أسلوب أكثر ملاءمة للرواية الغامضة. من خلال كتابة بعض الأمثلة على هذا النوع من مقدمة القصة، يمكنك جعل النموذج التوليدي يتبع النمط العام، ولكن أنشئ مقدمة لموضوع مختلف.

لتعديل أمثلة القصص الجديدة في Wordcraft:

  1. افتح ملف wordcraft/app/context/json/new_story.json.
  2. يمكنك تعديل الأمثلة مع الحفاظ على البنية العامة لملف JSON. في ما يلي مثال على تعديل مقدمة عن قصة غامضة باستخدام نمط مونولوج داخلي.
    [
      {
        "topic": "scientist disappears and their research into a new technology is gone",
        "target": "I got the call from the chief early Tuesday morning, before I'd even had a second sip of coffee. Terrible timing. Something about a researcher disappearing from the local university. Unusual for the research lab to ask for assistance, so I headed over to main lab building."
      },
      {
        "topic": "a young woman wakes up with no memory",
        "target": "An unfamiliar ceiling with harsh, white lights greeted my eyes as I opened them. I looked around. White walls, medical equipment, a hospital? Wait. Where am I? How did I get here?!"
      },
      {
        "topic": "old man tries to recall an important task as his memories gradually fade away",
        "target": "What was I supposed to do today? Feels like it was important. I stared into the kitchen cabinet full of mismatched mugs, mirroring my own confusion. What was it? Like someone is...in danger? A chill shot down my spine, but the details skittered off and hid in some dark corner of my head."
      },
      {
        "topic": "billionaire is found dead in a hotel room",
        "target": "People meet their end every day, some naturally, some unnaturally. After 17 years of working as a homicide detective in Seattle, I'd seen a lot more of the unnatural variety than most. Comes with the job, along with a hard-learned sense of what side of the line any given incident sat on. This...was murder."
      },
      {
        "topic": "retired covert operative gets dragged back into an old mission",
        "target": "Steam rose gently off the cup of Earl Grey sitting in front of me as I sat at the cafe, pedestrians and light traffic rolling by. The city was slowly waking up around me and my perfect Paris morning routine was shaping up nicely. Then I noticed that old familiar and unwelcome tingling on the back of my neck. I was being watched."
      }
    ]
  3. احفظ التغييرات في الملف "new_story.json".

لاختبار عملية القصة الجديدة المعدَّلة:

  1. انتقِل إلى الدليل الجذري لمشروع Wordcraft.
    cd wordcraft/
    
  2. تشغيل المشروع في وضع التطوير. إذا كان التطبيق قيد التشغيل، قد تحتاج إلى إيقافه وإعادة تشغيله.
    npm run dev
    
  3. في متصفّح الويب، انتقِل إلى واجهة مستخدم Wordcraft. ويظهر العنوان المحدَّد في مخرجات الأمر السابق، على سبيل المثال:
    http://localhost:3000/
    
    .
  4. انتقِل إلى القائمة الرئيسية في Wordcraft واختَر بدء قصة جديدة.
  5. عدِّل الطلب الجديد للقصة أو غيِّره لما تريد، ثم انقر على بدء قصة جديدة.

يمكنك تعديل جميع عناصر التحكم الحالية في كتابة القصة في Wordcraft باستخدام هذا الأسلوب. يمكنك تجربة تغيير عناصر التحكّم الأخرى في القصة من خلال تعديل الأمثلة في دليل wordcraft/app/context/json/.

إنشاء عنصر تحكّم جديد في الكتابة

Wordcraft تقدّم واجهة المستخدم الخاصة بالشخصيات تم تصميم تطبيق Wordcraft كي يكون قابلاً للتوسيع حتى تتمكن من إضافة عناصر تحكّم جديدة في الكتابة لمساعدتك، على غرار أزرار إنشاء النص أو إعادة كتابة الجملة في علامة التبويب "عناصر التحكّم" على الجانب الأيسر من التطبيق. يتطلب إجراء هذه التعديلات المزيد من الجهد، ولكنه يتيح لك تشكيل ميزات Wordcraft لتناسب سير العمل وأهدافك.

يؤدي التعديل في المثال التالي إلى إنشاء عنصر تحكّم جديد في الأحرف في Wordcraft. يمكنك استخدامها لتقديم شخصية جديدة إلى القصة مع وصف سمات تلك الشخصية. ويشبه عنصر التحكّم هذا عناصر التحكّم الأخرى في Wordcraft، مثل عنصر التحكّم بدء قصة جديدة الذي تمت مناقشته سابقًا. يمكنك إنشاء ملف JSON مع بعض الأمثلة حول الطريقة التي تريد أن يتم بها تقديم الأحرف. تشمل باقي التغييرات وظائف إدارة الطلبات باستخدام واجهة المستخدم والذكاء الاصطناعي (AI).

إنشاء أمثلة

اكتب بعض الأمثلة حول الطريقة التي تريد أن يتّبعها النموذج التوليدي لتقديم الأحرف. على سبيل المثال، هل تريد وصفها كراوٍ، أم تريد تقديمها من خلال تجربة الشخصية الرئيسية؟ تستخدم الأمثلة التالية المنهج الأخير حيث يتم تقديم شخصيات جديدة من منظور الشخصية الرئيسية. يمكنك إضافة هذه الأمثلة باستخدام ملف JSON جديد:

لإضافة أمثلة لعنصر التحكّم الجديد:

  1. أنشئ ملف wordcraft/app/context/json/new_character.json.
  2. أنشئ الأمثلة في ملف JSON. في هذا المثال، يتضمّن كل مثال حقل وصف character يمثّل نص الطلب، والحقل target الذي يعرض النتائج المتوقَّعة.
    [
      {
        "character": "A character who is helpful and modest.",
        "target": "\"You lost, buddy?\" came a voice from behind me. Turning, I discovered a man dressed in a simple but presentable outfit. Small signs of age and loose threads hinted that these clothes, and the man himself, had seen better days."
      },
      {
        "character": "A character who is attractive and devious.",
        "target": "Stepping out of the alley a little too quickly, I collided with something solidly muscular and surprisingly delicately scented. \"Sorry.\" I managed, regaining my balance. \"Easy there, buddy, you're gonna hurt yourself,\" came the reply from a man with an almost feline grace, further reinforced by a stare that reminded me of a hunting cat assessing its potential prey."
      },
      {
        "character": "A character who is old and hesitant.",
        "target": "\"Excuse me. Do you know the way to the train station from here?\" I looked up from my phone to see a elderly woman in a threadbare coat, purse clutched with two hands in front of her. \"I-I'm supposed to meet my nephew there. Do... do you think you can help me?\""
      },
      {
        "character": "A character who is intelligent and aloof.",
        "target": "Bookish. That was my immediate reaction to this person I now saw in front of me. \"You're finally here. Did you read the notes I sent you?\" The voice sat squarely in between feminine and masculine intonation. \"No, of course you didn't.\" Dismissing my answer before I'd even formulated one. Annoyance immediately flushed through me."
      },
      {
        "character": "A character who is clumsy and energetic.",
        "target": "\"Whoa!\" was the only warning I had before someone slammed into my back, almost knocking me off my feet. \"I'm so sorry! WOOO! These skates are a RUSH!\" The apology came from a rather loud redhead wearing rollerblades, dark glasses and a very beefy-looking pair of headphones. That explained the volume of the apology."
      }
    ]
  3. احفظ التغييرات في ملف new_character.json.

بعد إنشاء الأمثلة، عدِّل ملفَّي app/context/schema.ts وindex.ts ليعكس محتوى طلب التحكّم في الحرف الجديد.

لإضافة أمثلة إلى ملف schema.ts:

  • عدِّل ملف wordcraft/app/context/schema.ts ليشمل بنية البيانات كمثال للحرف الجديد.
    export const newStorySchema = z.object({
      topic: z.string(),
      target: z.string(),
    });
    
    // add the following:
    export const newCharacterSchema = z.object({
      character: z.string(),
      target: z.string(),
    });

تحديد نوع العملية المرتبط بهذه الأمثلة الجديدة. يساعد هذا النوع الجديد على ربط أمثلة الطلبات بواجهة المستخدم وبرمز إنشاء الطلبات، والذي يمكنك تعديله في الخطوات اللاحقة.

لإنشاء نوع عملية جديد

  • عدِّل ملف wordcraft/app/core/shared/types.ts لإضافة نوع العملية الجديد للحرف.
    export const enum OperationType {
      ...
      NEW_CHARACTER = 'NEW_CHARACTER', // add to list of types
      ...
    }

لتسجيل الأمثلة في ملف index.ts:

  1. في ملف wordcraft/app/context/index.ts، استورِد المخطط الجديد.
    import {
      continueSchema,
      ...
      newCharacterSchema // add new schema
    } from './schema';
    
  2. استورِد ملف JSON الجديد باسم "newCharacterJson".
    import newCharacterJson from './json/new_character.json';
    
  3. عليك تسجيل محتوى نموذج الأحرف الجديدة في سياق التطبيق.
    export class WordcraftContext {
      constructor() {
      ...
        this.registerExamples(
          OperationType.NEW_CHARACTER,
          newCharacterSchema,
          newCharacterJson
        );
      ...
    }
  4. تصدير نوع NewCharacterExample
    export type NewCharacterExample = z.infer<typeof newCharacterSchema>;
    

إنشاء واجهة مستخدم

بعد إنشاء أمثلة إنشاء المحتوى وتسجيلها، يمكنك إنشاء واجهة مستخدم لعنصر التحكّم الجديد. يتمثل الجزء الأكبر من العمل لهذه المرحلة في إنشاء فئة عمليات جديدة ثم تسجيل تلك الفئة باستخدام الرمز الرئيسي لتطبيق Wordcraft.

لإنشاء عملية جديدة:

  1. في دليل wordcraft/app/core/operations/، أنشِئ فئة عمليات جديدة باستخدام إحدى فئات العمليات الحالية كنموذج. بالنسبة إلى عنصر التحكّم الجديد في الأحرف، يمكنك إنشاء نسخة من الفئة new_story_operation.ts وإعادة تسميتها إلى new_character_operation.ts.
  2. أدخِل اسمًا جديدًا للفئة، وحدِّد وقت ظهور عنصر التحكّم في واجهة المستخدم من خلال تحديد قيمة OperationSite واحدة على الأقل.
    export class NewCharacterOperation extends ChoiceOperation {
      static override isAvailable(operationSite: OperationSite) {
        return (
          operationSite === OperationSite.END_OF_SECTION ||
          operationSite === OperationSite.EMPTY_SECTION
        );
      }
    
  3. اضبط السمة id للعملية.
      static override id = OperationType.NEW_CHARACTER;
    
  4. عدِّل الدالتين get وrun لإظهار قيم معلَمات المخطط. يعالج هذا الرمز عملية الحصول على نص الطلب من واجهة المستخدم لاستخدامه في الطلب الذي قدّمه الذكاء الاصطناعي (AI).
      private get character(): string {
        return NewCharacterOperation.controls.character.value;
      }
    
      async run() {
        const params = { character: this.character };
        const choices = await this.getModel().newCharacter(params);
    
        this.setChoices(choices);
      }
    
  5. عدِّل نص واجهة المستخدم وأوصافها.
      static override getButtonLabel() {
        return 'introduce character';
      }
    
      static override getDescription() {
        return 'Introduce a new character at the cursor.';
      }
    
      static override controls = {
        character: new TextareaControl({
          prefix: 'prompt',
          description: 'A prompt to introduce a new character.',
          value: 'A new character.',
        }),
      };
    

لتسجيل العملية الجديدة في تطبيق Wordcraft:

  1. في ملف wordcraft/app/core/operations/index.ts، أضِف عملية استيراد للعملية الجديدة.
    import {NewCharacterOperation} from './new_character_operation';
    
  2. في ملف index.ts نفسه، أضِف عملية تصدير لصف NewCharacterOperation.
    export {
      ...
      NewCharacterOperation, // add this class
      ...
    };
  3. في ملف wordcraft/app/main.ts، سجِّل العملية الجديدة.
    const operationsService = wordcraftCore.getService(OperationsService);
    operationsService.registerOperations(
      ...
      Operations.NewCharacterOperation, // add new operation
      ...
    );
    

إنشاء عملية معالجة للطلبات

المرحلة الأخيرة من عملية إنشاء عنصر التحكّم الجديد، عليك إنشاء الرمز البرمجي الذي يعالج الطلبات لإنشاء نموذج الذكاء الاصطناعي التوليدي ويعالج الاستجابة. يتمثل الجزء الرئيسي من العمل في تصميم معالج للمطالبات في دليل wordcraft/app/models/gemini/prompts/ يأخذ البيانات من واجهة المستخدم ويجمع مطالبة ليتم تمريرها إلى النموذج التوليدي.

لتحديد واجهة لمَعلمات الطلب:

  • في ملف wordcraft/app/core/shared/interfaces.ts، أضِف واجهة للمعلَمات الجديدة التي تطلب منك العمليات.
    export interface NewCharacterPromptParams {
      character: string;
    }
    

لتحديد معالج مطالبة للعملية الجديدة:

  1. في دليل wordcraft/app/models/gemini/prompts/، أنشِئ فئة جديدة لمعالِج الطلبات باستخدام إحدى فئات العمليات الحالية كنموذج. بالنسبة إلى عنصر التحكّم الجديد في الأحرف، يمكنك إنشاء نسخة من الفئة new_story.ts وإعادة تسميتها إلى new_character.ts كنقطة بداية.
  2. حدِّد دالة معالِج الطلبات واستورد الفئة NewCharacterExample.
    import { NewCharacterPromptParams } from '@core/shared/interfaces';
    import { NewCharacterExample, WordcraftContext } from '../../../context';
    import { OperationType } from '@core/shared/types';
    import { GeminiModel } from '..';
    
    export function makePromptHandler(model: GeminiModel, context: WordcraftContext) {
      ...
    }
    
  3. أنشِئ دالة generatePrompt() للحصول على إدخال واجهة المستخدم الخاص بطلب نموذج الذكاء الاصطناعي (AI).
      function generatePrompt(character: string) {
        const prefix = "Here's a character description: ";
        const suffix = "Introduce this character in the story.";
    
        if (character.trim() === '') {
          return 'Introduce a new character to the story.';
        } else {
          return `${prefix}${model.wrap(character)}\n${suffix}`;
        }
      }
  4. أنشِئ دالة getPromptContext() لتجميع إدخالات واجهة المستخدم مع نماذج الردود وإنشاء الطلب الكامل.
      function getPromptContext() {
        const examples = context.getExampleData(
          OperationType.NEW_CHARACTER
        );
        let promptContext = model.getPromptPreamble();
        examples.forEach((example) => {
          const { character, target } = example;
          const prompt = generatePrompt(character);
          promptContext += `${prompt} ${model.wrap(target)}\n\n`;
        });
        return promptContext;
      }

لدمج معالج مطالبة الأحرف الجديد:

  1. في ملف wordcraft/app/models/gemini/index.ts، استورِد معالج الطلب لعملية الحرف الجديد.
    import {makePromptHandler as newCharacter} from './prompts/new_character';
  2. أضِف تعريف إلغاء لمعالج الطلب newCharacter.
      override newCharacter = this.makePromptHandler(newCharacter);

لتسجيل معلَمات المطالبة باستخدام تعريف النموذج:

  1. في ملف wordcraft/app/models/model.ts، أضِف عملية استيراد لواجهة NewCharacterPromptParams الجديدة.
    import {
      ...
      NewCharacterPromptParams,
      ...
    } from '@core/shared/interfaces';
  2. أضِف معلَمات طلب newCharacter إلى فئة النموذج.
      async newCharacter(params: NewCharacterPromptParams): Promise<ModelResults> {
        throw new Error('Not yet implemented');
      }

اختبار عنصر التحكّم الجديد في الكتابة

من المفترض أن يكون عنصر التحكّم الجديد جاهزًا للاختبار في واجهة Wordcraft. تأكد من التحقق من التعليمات البرمجية الخاصة بك لتجميع الأخطاء قبل المتابعة.

لاختبار عنصر التحكّم الجديد في الشخصيات:

  1. انتقِل إلى الدليل الجذري لمشروع Wordcraft.
    cd wordcraft/
    
  2. تشغيل المشروع في وضع التطوير:`
    npm run dev
    
  3. في متصفّح الويب، انتقِل إلى واجهة مستخدم Wordcraft. ويظهر العنوان المحدَّد في مخرجات الأمر السابق، على سبيل المثال:
    http://localhost:3000/
    
    .
  4. في تطبيق Wordcraft، أنشِئ قصة جديدة أو افتح قصة حالية.
  5. في منطقة تعديل القصة، حرِّك المؤشر إلى نهاية القصة. ضمن علامة تبويب "عناصر التحكم" على اليسار، ينبغي أن يظهر عنصر التحكم التعريف بالشخصية.
  6. في حقل التعريف بالشخصية، اكتب وصفًا موجزًا للشخصية الجديدة، ثم انقر على زر تقديم الشخصية.

مراجع إضافية

لمزيد من المعلومات حول مشروع Wordcraft، يُرجى مراجعة مستودع الرموز. يمكنك الاطّلاع على التغييرات الموضّحة في هذا الدليل التوجيهي في طلب السحب هذا.

تطبيقات الإنتاج

إذا كنت تخطط لنشر إصدار مخصّص من Wordcraft لجمهور كبير، يُرجى العِلم أنّ استخدامك لواجهة Google Gemini API قد يخضع لقيود على المعدّل وقيود الاستخدام الأخرى. إذا كنت تفكر في إنشاء تطبيق إنتاج باستخدام واجهة برمجة تطبيقات Gemini مثل docs Agent، راجِع خدمات Google Cloud Vertex AI لزيادة قابلية توسّع تطبيقك وموثوقيته.