Wordcraft ile AI yazma asistanı oluşturma

Hikayeleri severiz. Hikaye anlatmak ve başka yaratıcı metinler yapmak zor ve tatmin edici olabilir. Fakat boş bir sayfadan kendi hikayelerinizi oluşturmak bazen korkutucu, hatta bunaltıcı görünebilir. Üretken yapay zeka (AI) modelleri, boş sayfayı aşmanıza ve anlatımınızı oluşturmanıza yardımcı olacak harika bir araç olabilir.

Bu eğiticide, Google İnsanlar ve Yapay Zeka Araştırmaları ekibi tarafından oluşturulan yapay zeka destekli hikaye yazma aracı Wordcraft'ün nasıl genişletileceği gösterilmektedir. Bu web uygulaması, hikayeleri adım adım oluşturmanıza yardımcı olmak için Gemini API'sini kullanır. Bu API'yi kullanarak, fikirler üreterek, hikayelerinizden parçalar yazarak ve daha fazla ayrıntı eklemek amacıyla içeriği düzeltirsiniz. Wordcraft'ı kendi yazma stilinize daha uygun olacak şekilde değiştirebilir ve iş akışınızı daha iyi desteklemek için yeni yazma kontrolleri oluşturabilirsiniz.

Projeye ve projenin kapsamının genişletilmesine dair bir genel bakış videosu için Yapay Zeka Yazma Asistanı - Google AI ile Derleme videosuna göz atın. Aksi takdirde, aşağıdaki talimatları uygulayarak projeyi genişletmeye başlayabilirsiniz.

Proje ayarlama

Bu talimatlar Wordcraft projesini geliştirme ve test etme hazırlama süreçlerinde size yol gösterecektir. Ön koşul yazılımını yüklemeniz, kod deposundan projeyi klonlamanız, yapılandırma yüklemesini çalıştırmanız ve birkaç ortam değişkeni ayarlamanız gerekir. Bu adımları tamamladıktan sonra projeyi çalıştırarak kurulumunuzu test edebilirsiniz.

Ön koşulları yükleme

Wordcraft projesi, paketleri yönetmek ve uygulamayı çalıştırmak için Node ve npm'yi kullanır. Aşağıdaki yükleme talimatları bir Linux ana makine makinesine yöneliktir.

Gerekli yazılımı yüklemek için:

Projeyi klonlama ve yapılandırma

Proje kodunu indirin ve npm yükleme komutunu kullanarak gerekli bağımlılıkları indirip projeyi yapılandırın. Proje kaynak kodunu almak için git kaynak kontrolü yazılımına ihtiyacınız vardır.
Proje kodunu indirmek ve yapılandırmak için:

  1. Aşağıdaki komutu kullanarak git deposunu klonlayın.
    git clone https://github.com/PAIR-code/wordcraft
    
  2. Wordcraft projesi kök dizinine gidin.
    cd wordcraft/
    
  3. Bağımlılıkları indirmek ve projeyi yapılandırmak için yükleme komutunu çalıştırın:
    npm install
    

Ortam değişkenlerini ayarlama

Wordcraft kod projesinin çalışması için gereken ortam değişkenlerini, özellikle de Google Gemini API Anahtarı'nı ayarlayın. Aşağıdaki yükleme talimatları bir Linux ana makine makinesi içindir.

Ortam değişkenlerini ayarlamak için:

  1. Bir Google Gemini API Anahtarı alın ve anahtar dizesini kopyalayın.
  2. Wordcraft projesi kök dizinine gidin.`
    cd wordcraft/
    
  3. API anahtarını ortam değişkeni olarak ayarlayın. Linux ana makinelerinde aşağıdaki komutları kullanın.
    touch .env
    echo "API_KEY="<YOUR_API_KEY>"" > .env
    

Kurulumunuzu test etme

Artık cihazınızda Wordcraft'i çalıştırarak proje kurulumunuzu test edebilirsiniz. Bu adım isteğe bağlıdır, ancak önerilir.

Wordcraft başlangıç ekranı

Yüklemenizi ve kurulumunuzu test etmek için:

  1. Wordcraft projesi kök dizinine gidin.
    cd wordcraft/
    
  2. Geliştirme modunda projeyi proje bazında çalıştırma:
    npm run dev
    
  3. Web tarayıcınızda Wordcraft kullanıcı arayüzüne gidin. İlgili adres, önceki komutun çıkışında gösterilir. Örneğin:
    http://localhost:3000/
    

İstem örnek metnini değiştir

Wordcraft komutları kullanıcı arayüzü Wordcraft, yazma yardımı işlemlerinin her biri için yeni hikaye başlat ve metin oluştur komutları gibi bir dizi örnek kullanarak yapay zeka üretici modeli için istemler oluşturur. Örnekler, hikayeniz için metin oluştururken üretken modele rehberlik eder. Bir işlemin örneklerini değiştirerek, çıkışı farklı bir yazma kalıbı veya stili izleyecek şekilde değiştirebilirsiniz. Bu yaklaşım, Wordcraft'ın istediğiniz şekilde yazmasını sağlamanın basit bir yoludur.

Aşağıdaki örnekte, Wordcraft'taki new_story örneklerinin değiştirilmesi gösterilmektedir. Bu değişikliğin amacı, üretken yapay zeka modelini dahili monolog yaklaşımı ile hikaye tanıtımları yazmaya yönlendirmek ve gizem romanları için daha uygun bir stil kullanmaktır. Bu tür bir hikaye girişi için birkaç örnek yazarak, üretken modelin genel kalıbı izlemesini sağlayabilir ve aynı zamanda farklı bir temaya giriş yapabilirsiniz.

Wordcraft'taki yeni hikaye örneklerini değiştirmek için:

  1. wordcraft/app/context/json/new_story.json dosyasını açın.
  2. JSON dosyasının genel yapısını koruyarak örnekleri değiştirin. Aşağıda, dahili bir monolog tarzı kullanılarak gizemli hikayeye giriş için yapılan bir değişiklik örneği verilmiştir.
    [
      {
        "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" dosyasındaki değişiklikleri kaydedin.

Değiştirilen yeni hikaye işlemini test etmek için:

  1. Wordcraft projesi kök dizinine gidin.
    cd wordcraft/
    
  2. Projeyi geliştirme modunda çalıştırın. Zaten çalışıyorsa uygulamayı durdurup yeniden başlatmanız gerekebilir.
    npm run dev
    
  3. Web tarayıcınızda Wordcraft kullanıcı arayüzüne gidin. İlgili adres, önceki komutun çıkışında gösterilir. Örneğin:
    http://localhost:3000/
    
  4. Wordcraft'ın ana menüsüne gidin ve Start a New Story'yi (Yeni Hikaye Başlat) seçin.
  5. Yeni hikaye istemini güncelleyin veya istediğiniz şekilde değiştirin, ardından Yeni hikaye başlat'ı seçin.

Bu tekniği kullanarak Wordcraft'ta mevcut hikaye yazma kontrollerini değiştirebilirsiniz. wordcraft/app/context/json/ dizinindeki örnekleri güncelleyerek diğer hikaye kontrollerini değiştirmeyi deneyin.

Yeni yazma denetimi oluştur

Wordcraft tanıtım karakter kullanıcı arayüzü Wordcraft uygulaması genişletilecek şekilde tasarlanmıştır. Bu sayede, uygulamanın sağ tarafındaki Denetimler sekmesinde bulunan metin oluştur veya cümleyi yeniden yaz düğmelerine benzer şekilde, size yardımcı olacak yeni yazma kontrolleri ekleyebilirsiniz. Bu değişiklikleri yapmak biraz daha zahmetlidir, ancak Wordcraft'ın özelliklerini iş akışınıza ve hedeflerinize uygun şekilde şekillendirmenize olanak tanır.

Aşağıdaki örnekte yapılan değişiklik, Wordcraft için yeni bir karakter kontrolü oluşturur. Bir karakterin özelliklerini açıklayarak bir hikayeye yeni bir karakteri tanıtmak için bunu kullanabilirsiniz. Bu kontrolün temeli, daha önce ele alınan yeni hikaye başlat kontrolü gibi diğer Wordcraft kontrolleriyle aynıdır. Karakterlerin nasıl sunulmasını istediğinize dair birkaç örnek içeren bir JSON dosyası oluşturacaksınız. Değişikliklerin geri kalanında kullanıcı arayüzü ve yapay zeka istemi yönetim işlevleri eklendi.

Örnek oluşturma

Üretken modelin karakterleri nasıl tanıtmasını istediğinize dair birkaç örnek yazın. Mesela onları bir anlatıcı gibi açıklamak mı yoksa ana karakterinizin deneyimi yoluyla tanıtmak mı istersiniz? Aşağıdaki örneklerde ikinci yaklaşımın kullanıldığı örneklerde, ana karakterin bakış açısından yeni karakterler tanıtılmaktadır. Bu örnekleri yeni bir JSON dosyasıyla eklersiniz:

Yeni kontrole örnekler eklemek için:

  1. Bir wordcraft/app/context/json/new_character.json dosyası oluşturun.
  2. Örnekleri JSON dosyasında oluşturun. Bu örnekte, her örnekte istem metnini temsil eden bir character açıklama alanı ve beklenen çıkışı gösteren target alanı vardır.
    [
      {
        "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 dosyasında yaptığınız değişiklikleri kaydedin.

Örneklerinizi oluşturduktan sonra, app/context/schema.ts ve index.ts dosyalarını bu yeni karakter kontrolünün istem içeriğini yansıtacak şekilde değiştirin.

Örnekleri schema.ts dosyasına eklemek için:

  • wordcraft/app/context/schema.ts dosyasını, yeni karakter örneği veri yapısını içerecek şekilde değiştirin.
    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(),
    });

Bu yeni örneklerle ilişkili bir işlem türü tanımlayın. Bu yeni tür, istem örneklerinin kullanıcı arayüzüne ve daha sonraki adımlarda değiştireceğiniz istem oluşturma koduna bağlamaya yardımcı olur.

Yeni bir işlem türü oluşturmak için

  • Yeni karakter işlemi türünü eklemek için wordcraft/app/core/shared/types.ts dosyasını değiştirin.
    export const enum OperationType {
      ...
      NEW_CHARACTER = 'NEW_CHARACTER', // add to list of types
      ...
    }

index.ts dosyasındaki örnekleri kaydetmek için:

  1. wordcraft/app/context/index.ts dosyasına yeni şemayı içe aktarın.
    import {
      continueSchema,
      ...
      newCharacterSchema // add new schema
    } from './schema';
    
  2. Yeni JSON dosyasını newCharacterJson olarak içe aktarın.
    import newCharacterJson from './json/new_character.json';
    
  3. Yeni karakter örneği içeriğini uygulama bağlamında kaydedin.
    export class WordcraftContext {
      constructor() {
      ...
        this.registerExamples(
          OperationType.NEW_CHARACTER,
          newCharacterSchema,
          newCharacterJson
        );
      ...
    }
  4. Bir NewCharacterExample türünü dışa aktarın.
    export type NewCharacterExample = z.infer<typeof newCharacterSchema>;
    

Kullanıcı arayüzü oluşturma

İçerik oluşturma örneklerini oluşturup kaydettikten sonra yeni denetim için kullanıcı arayüzünü oluşturabilirsiniz. Bu aşamada yapılacak işler, yeni bir işlem sınıfı oluşturmak ve ardından bu sınıfı Wordcraft uygulamasının ana koduyla kaydettirmektir.

Yeni bir işlem oluşturmak için:

  1. wordcraft/app/core/operations/ dizininde, mevcut işlem sınıflarından birini şablon olarak kullanarak yeni bir işlem sınıfı oluşturun. Yeni karakter kontrolü için new_story_operation.ts sınıfının bir kopyasını oluşturup new_character_operation.ts olarak yeniden adlandırabilirsiniz.
  2. Sınıfa yeni bir ad verin ve en az bir OperationSite değeri tanımlayarak kontrolün kullanıcı arayüzünde ne zaman görüneceğini belirtin.
    export class NewCharacterOperation extends ChoiceOperation {
      static override isAvailable(operationSite: OperationSite) {
        return (
          operationSite === OperationSite.END_OF_SECTION ||
          operationSite === OperationSite.EMPTY_SECTION
        );
      }
    
  3. İşlem için id değerini ayarlayın.
      static override id = OperationType.NEW_CHARACTER;
    
  4. get ve run işlevlerini, şema parametrelerinin değerlerini yansıtacak şekilde güncelleyin. Bu kod, AI isteminde kullanılmak üzere kullanıcı arayüzünden istem metninin alınmasını yönetir.
      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. Kullanıcı arayüzü metnini ve açıklamalarını güncelleyin.
      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.',
        }),
      };
    

Yeni işlemi Wordcraft uygulamasına kaydetmek için:

  1. wordcraft/app/core/operations/index.ts dosyasına, yeni işlem için bir içe aktarma ekleyin.
    import {NewCharacterOperation} from './new_character_operation';
    
  2. Aynı index.ts dosyasına, NewCharacterOperation sınıfı için bir dışa aktarma işlemi ekleyin.
    export {
      ...
      NewCharacterOperation, // add this class
      ...
    };
  3. wordcraft/app/main.ts dosyasında yeni işlemi kaydedin.
    const operationsService = wordcraftCore.getService(OperationsService);
    operationsService.registerOperations(
      ...
      Operations.NewCharacterOperation, // add new operation
      ...
    );
    

İstem işleme oluşturma

Yeni kontrolü oluşturmanın son aşamasında, üretken yapay zeka modeli için istem oluşturma ve yanıtı işleyen kodu oluşturursunuz. Çalışmanın ana parçası, wordcraft/app/models/gemini/prompts/ dizininde kullanıcı arayüzünden girdi alan ve üretken modele geçirilecek bir istem derleyen bir istem işleyici oluşturmaktır.

İstem parametrelerine yönelik bir arayüz tanımlamak için:

  • wordcraft/app/core/shared/interfaces.ts dosyasına, parametreleri soran yeni işlemler için bir arayüz ekleyin.
    export interface NewCharacterPromptParams {
      character: string;
    }
    

Yeni işlem için bir istem işleyici tanımlamak üzere:

  1. wordcraft/app/models/gemini/prompts/ dizininde, mevcut işlem sınıflarından birini şablon olarak kullanarak yeni bir istem işleyici sınıfı oluşturun. Yeni karakter kontrolü için new_story.ts sınıfının bir kopyasını oluşturabilir ve başlangıç noktası olarak new_character.ts olarak yeniden adlandırabilirsiniz.
  2. Bir istem işleyici işlevi tanımlayın ve NewCharacterExample sınıfını içe aktarın.
    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. AI modeli istemi için kullanıcı arayüzü girişini almak üzere bir generatePrompt() işlevi oluşturun.
      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. Kullanıcı arayüzü girişini örnek yanıtlarla derlemek ve eksiksiz istemi oluşturmak için bir getPromptContext() işlevi oluşturun.
      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;
      }

Yeni karakter istemi işleyiciyi entegre etmek için:

  1. wordcraft/app/models/gemini/index.ts dosyasında, yeni karakter işlemi için istem işleyicisini içe aktarın.
    import {makePromptHandler as newCharacter} from './prompts/new_character';
  2. newCharacter istem işleyici için bir geçersiz kılma tanımı ekleyin.
      override newCharacter = this.makePromptHandler(newCharacter);

İstem parametrelerini model tanımıyla kaydetmek için:

  1. wordcraft/app/models/model.ts dosyasına, yeni NewCharacterPromptParams arayüzü için bir içe aktarma ekleyin.
    import {
      ...
      NewCharacterPromptParams,
      ...
    } from '@core/shared/interfaces';
  2. newCharacter istem parametrelerini model sınıfına ekleyin.
      async newCharacter(params: NewCharacterPromptParams): Promise<ModelResults> {
        throw new Error('Not yet implemented');
      }

Yeni yazma denetimini test edin

Yeni denetiminiz Wordcraft arayüzünde test edilmeye hazır olmalıdır. Devam etmeden önce kodunuzda derleme hataları olup olmadığını kontrol edin.

Yeni karakter kontrolünü test etmek için:

  1. Wordcraft projesi kök dizinine gidin.`
    cd wordcraft/
    
  2. Projeyi geliştirme modunda çalıştırın:`
    npm run dev
    
  3. Web tarayıcınızda Wordcraft kullanıcı arayüzüne gidin. İlgili adres, önceki komutun çıkışında gösterilir. Örneğin:
    http://localhost:3000/
    
  4. Wordcraft uygulamasında yeni bir hikaye oluşturun veya mevcut bir hikayeyi açın.
  5. Hikaye düzenleme alanında, imlecinizi hikayenin sonuna taşıyın. Sağdaki Denetimler sekmesinde, giriş karakteri denetimi görünür.
  6. Karakter tanıtım alanına yeni karakterin kısa bir açıklamasını yazın ve ardından karakter ekle düğmesini seçin.

Ek kaynaklar

Wordcraft projesi hakkında daha fazla bilgi için kod deposuna bakın. Bu eğiticide açıklanan değişiklikleri bu çeki alma isteğinde görüntüleyebilirsiniz.

Üretim uygulamaları

Özelleştirilmiş bir Wordcraft sürümünü geniş bir kitleye dağıtmayı planlıyorsanız Google Gemini API kullanımınızın hız sınırlamasına ve diğer kullanım kısıtlamalarına tabi olabileceğini unutmayın. Dokümanlar Agent gibi Gemini API ile bir üretim uygulaması derlemeyi düşünüyorsanız uygulamanızın ölçeklenebilirliğini ve güvenilirliğini artırmak için Google Cloud Vertex AI hizmetlerine göz atın.