Xây dựng trợ lý soạn thảo bằng AI với Wordcraft

Chúng ta yêu thích những câu chuyện. Kể chuyện và thực hiện các hình thức viết sáng tạo khác có thể thử thách và xứng đáng. Tuy nhiên, việc tự mình xây dựng câu chuyện từ một trang trắng đôi khi có vẻ khó khăn và thậm chí là choáng ngợp. Các mô hình tạo sinh sử dụng trí tuệ nhân tạo (AI) có thể là một công cụ hữu ích giúp bạn vượt qua trang trống và xây dựng câu chuyện của mình.

Hướng dẫn này trình bày cách mở rộng Wordcraft, một công cụ viết truyện dựa trên AI do nhóm nghiên cứu về AI và con người của Google xây dựng. Ứng dụng web này sử dụng API Gemini để giúp bạn xây dựng câu chuyện từng chút một bằng cách tạo ý tưởng, viết các phần trong câu chuyện và chỉnh sửa nội dung để bổ sung thêm thông tin chi tiết. Bạn có thể sửa đổi Wordcraft cho phù hợp hơn với phong cách viết của mình và tạo các chế độ điều khiển mới để hỗ trợ quy trình làm việc.

Để xem video tổng quan về dự án và cách mở rộng dự án, bao gồm cả thông tin chi tiết từ đội ngũ xây dựng dự án, hãy xem bài viết Trợ lý viết bằng AI – Xây dựng bằng AI của Google. Nếu không, bạn có thể bắt đầu mở rộng dự án theo hướng dẫn bên dưới.

Thiết lập dự án

Những hướng dẫn này sẽ chỉ cho bạn cách thiết lập dự án Wordcraft để phát triển và kiểm thử. Bạn cần cài đặt phần mềm điều kiện tiên quyết, sao chép dự án từ kho lưu trữ mã, chạy quá trình cài đặt cấu hình và đặt một vài biến môi trường. Bạn có thể kiểm thử chế độ thiết lập bằng cách chạy dự án sau khi hoàn tất các bước này.

Cài đặt điều kiện tiên quyết

Dự án Wordcraft sử dụng Node và npm để quản lý các gói và chạy ứng dụng. Hướng dẫn cài đặt sau đây dành cho máy chủ Linux.

Cách cài đặt phần mềm được yêu cầu:

Sao chép và định cấu hình dự án

Tải mã dự án xuống và dùng lệnh cài đặt npm để tải các phần phụ thuộc bắt buộc xuống và định cấu hình dự án. Bạn cần phần mềm kiểm soát nguồn git để truy xuất mã nguồn dự án.
Cách tải xuống và định cấu hình mã dự án:

  1. Sao chép kho lưu trữ git bằng lệnh sau.
    git clone https://github.com/PAIR-code/wordcraft
    
  2. Chuyển đến thư mục gốc của dự án Wordcraft.
    cd wordcraft/
    
  3. Chạy lệnh cài đặt để tải các phần phụ thuộc xuống và định cấu hình dự án:
    npm install
    

Đặt các biến môi trường

Đặt các biến môi trường bắt buộc để cho phép chạy dự án mã Wordcraft, cụ thể là Khoá API Google Gemini. Các hướng dẫn cài đặt sau đây dành cho máy chủ Linux.

Cách thiết lập các biến môi trường:

  1. Lấy Khoá API Google Gemini và sao chép chuỗi khoá.
  2. Chuyển đến thư mục gốc của dự án Wordcraft.`
    cd wordcraft/
    
  3. Đặt Khoá API làm biến môi trường. Trên máy chủ Linux, hãy dùng các lệnh sau.
    touch .env
    echo "API_KEY="<YOUR_API_KEY>"" > .env
    

Kiểm tra thông tin thiết lập của bạn

Bây giờ, bạn có thể kiểm thử phần thiết lập dự án bằng cách chạy Wordcraft trên thiết bị của mình. Bước này không bắt buộc nhưng bạn nên thực hiện.

Màn hình bắt đầu của Wordcraft

Cách kiểm tra việc cài đặt và thiết lập:

  1. Chuyển đến thư mục gốc của dự án Wordcraft.
    cd wordcraft/
    
  2. Chạy dự án bằng dự án đó ở chế độ phát triển:
    npm run dev
    
  3. Trong trình duyệt web, hãy chuyển đến giao diện người dùng của Wordcraft. Địa chỉ cụ thể sẽ xuất hiện trong kết quả của lệnh trước đó, ví dụ:
    http://localhost:3000/
    

Sửa đổi văn bản mẫu của câu lệnh

Giao diện người dùng của lệnh trong Wordcraft Wordcraft tạo câu lệnh cho mô hình tạo sinh AI thông qua một bộ ví dụ cho từng thao tác hỗ trợ viết, chẳng hạn như lệnh bắt đầu câu chuyện mới và lệnh tạo văn bản. Các ví dụ này định hướng cho mô hình tạo sinh trong việc tạo văn bản cho câu chuyện của bạn và bằng cách sửa đổi các ví dụ cho một thao tác, bạn có thể thay đổi đầu ra để tuân theo một mẫu hoặc kiểu viết khác. Phương pháp này là một cách đơn giản để Wordcraft viết theo cách bạn muốn.

Ví dụ sau đây cho thấy một bản sửa đổi của các ví dụ về new_story trong Wordcraft. Mục tiêu của lần sửa đổi này là định hướng cho mô hình tạo sinh AI viết phần giới thiệu truyện bằng phương pháp độc thoại nội bộ, đồng thời sử dụng phong cách phù hợp hơn với tiểu thuyết bí ẩn. Bằng cách viết một vài ví dụ về kiểu giới thiệu câu chuyện này, bạn có thể tạo mô hình tạo sinh tuân theo mẫu chung, nhưng tạo phần giới thiệu cho một chủ đề khác.

Cách sửa đổi các ví dụ về câu chuyện mới trong Wordcraft:

  1. Mở tệp wordcraft/app/context/json/new_story.json.
  2. Sửa đổi các ví dụ trong khi vẫn giữ nguyên cấu trúc tổng thể của tệp JSON. Sau đây là một ví dụ về bản sửa đổi cho phần giới thiệu câu chuyện bí ẩn bằng phong cách độc thoại nội bộ.
    [
      {
        "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. Lưu các thay đổi đối với tệp "new_story.json".

Cách kiểm thử thao tác câu chuyện mới đã được sửa đổi:

  1. Chuyển đến thư mục gốc của dự án Wordcraft.
    cd wordcraft/
    
  2. Chạy dự án ở chế độ phát triển. Nếu ứng dụng đang chạy, bạn có thể cần phải dừng ứng dụng đó và khởi động lại.
    npm run dev
    
  3. Trong trình duyệt web, hãy chuyển đến giao diện người dùng của Wordcraft. Địa chỉ cụ thể sẽ xuất hiện trong kết quả của lệnh trước đó, ví dụ:
    http://localhost:3000/
    
  4. Chuyển đến trình đơn chính của Wordcraft rồi chọn Start a New Story (Bắt đầu một câu chuyện mới).
  5. Cập nhật lời nhắc về câu chuyện mới hoặc thay đổi lời nhắc theo ý muốn, sau đó chọn bắt đầu câu chuyện mới.

Bạn có thể sửa đổi tất cả các chế độ điều khiển hiện có liên quan đến việc viết truyện trong Wordcraft bằng kỹ thuật này. Bạn có thể thử thay đổi các chế độ điều khiển khác trong câu chuyện bằng cách cập nhật các ví dụ trong thư mục wordcraft/app/context/json/.

Tạo chế độ điều khiển ghi mới

Wordcraft giới thiệu giao diện người dùng của nhân vật Ứng dụng Wordcraft được thiết kế để mở rộng ra để bạn có thể thêm các chế độ điều khiển mới để viết hỗ trợ, tương tự như nút tạo văn bản hoặc viết lại câu trong thẻ Điều khiển ở bên phải của ứng dụng. Việc thực hiện những sửa đổi này tốn nhiều công sức hơn một chút, nhưng cho phép bạn điều chỉnh các tính năng của Wordcraft cho phù hợp với quy trình làm việc và mục tiêu của mình.

Thao tác sửa đổi ví dụ sau đây sẽ tạo ra một thành phần điều khiển ký tự mới cho Wordcraft. Bạn có thể sử dụng tuỳ chọn này để giới thiệu một nhân vật mới vào một câu chuyện kèm theo nội dung mô tả các đặc điểm của nhân vật đó. Nền tảng của chế độ điều khiển này giống với các chế độ điều khiển khác trong Wordcraft, chẳng hạn như chế độ điều khiển bắt đầu câu chuyện mới đã thảo luận trước đó. Bạn tạo một tệp JSON có một vài ví dụ về cách bạn muốn giới thiệu các ký tự. Những thay đổi còn lại sẽ thêm giao diện người dùng và các chức năng quản lý lời nhắc bằng trí tuệ nhân tạo (AI).

Tạo mẫu

Viết một vài ví dụ về cách bạn muốn mô hình tạo sinh giới thiệu các nhân vật. Ví dụ: bạn muốn mô tả họ như một người đọc hay bạn muốn giới thiệu họ theo trải nghiệm của nhân vật chính? Các ví dụ sau đây sử dụng cách tiếp cận thứ hai, giới thiệu các nhân vật mới theo góc nhìn của nhân vật chính. Bạn thêm các ví dụ sau bằng một tệp JSON mới:

Cách thêm ví dụ cho chế độ điều khiển mới:

  1. Tạo một tệp wordcraft/app/context/json/new_character.json.
  2. Tạo ví dụ trong tệp JSON. Trong ví dụ này, mỗi ví dụ có một trường mô tả character (đại diện cho văn bản lời nhắc) và một trường target (cho thấy kết quả dự kiến).
    [
      {
        "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. Lưu nội dung thay đổi vào tệp new_character.json.

Sau khi tạo ví dụ, hãy sửa đổi các tệp app/context/schema.tsindex.ts để phản ánh nội dung nhắc của chế độ điều khiển ký tự mới này.

Cách thêm ví dụ vào tệp schema.ts:

  • Sửa đổi tệp wordcraft/app/context/schema.ts để bao gồm cấu trúc dữ liệu mẫu ký tự mới.
    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(),
    });

Xác định loại thao tác được liên kết với các ví dụ mới này. Loại mới này giúp kết nối các ví dụ về lời nhắc với giao diện người dùng và mã tạo lời nhắc mà bạn sẽ sửa đổi trong các bước sau.

Để tạo một loại thao tác mới

  • Sửa đổi tệp wordcraft/app/core/shared/types.ts để thêm loại thao tác ký tự mới.
    export const enum OperationType {
      ...
      NEW_CHARACTER = 'NEW_CHARACTER', // add to list of types
      ...
    }

Cách đăng ký ví dụ trong tệp index.ts:

  1. Trong tệp wordcraft/app/context/index.ts, hãy nhập giản đồ mới.
    import {
      continueSchema,
      ...
      newCharacterSchema // add new schema
    } from './schema';
    
  2. Nhập tệp JSON mới dưới dạng newCharacterJson.
    import newCharacterJson from './json/new_character.json';
    
  3. Đăng ký nội dung mẫu nhân vật mới trong ngữ cảnh ứng dụng.
    export class WordcraftContext {
      constructor() {
      ...
        this.registerExamples(
          OperationType.NEW_CHARACTER,
          newCharacterSchema,
          newCharacterJson
        );
      ...
    }
  4. Xuất một loại NewCharacterExample.
    export type NewCharacterExample = z.infer<typeof newCharacterSchema>;
    

Xây dựng giao diện người dùng

Sau khi tạo và đăng ký ví dụ về quá trình tạo nội dung, bạn có thể tạo giao diện người dùng cho chế độ điều khiển mới. Phần lớn công việc của giai đoạn này là tạo một lớp thao tác mới, sau đó đăng ký lớp đó bằng mã chính của ứng dụng Wordcraft.

Cách tạo một thao tác mới:

  1. Trong thư mục wordcraft/app/core/operations/, hãy tạo một lớp thao tác mới bằng cách sử dụng một trong các lớp thao tác hiện có làm mẫu. Đối với tuỳ chọn điều khiển ký tự mới, bạn có thể tạo bản sao của lớp new_story_operation.ts và đổi tên lớp đó thành new_character_operation.ts.
  2. Đặt tên mới cho lớp và chỉ định thời điểm chế độ điều khiển xuất hiện trong giao diện người dùng bằng cách xác định ít nhất một giá trị OperationSite.
    export class NewCharacterOperation extends ChoiceOperation {
      static override isAvailable(operationSite: OperationSite) {
        return (
          operationSite === OperationSite.END_OF_SECTION ||
          operationSite === OperationSite.EMPTY_SECTION
        );
      }
    
  3. Đặt id cho thao tác.
      static override id = OperationType.NEW_CHARACTER;
    
  4. Cập nhật các hàm getrun để phản ánh các giá trị của tham số giản đồ. Mã này xử lý việc lấy văn bản lời nhắc từ giao diện người dùng để sử dụng trong lời nhắc do AI tạo.
      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. Cập nhật văn bản và nội dung mô tả giao diện người dùng.
      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.',
        }),
      };
    

Để đăng ký thao tác mới trong ứng dụng Wordcraft:

  1. Trong tệp wordcraft/app/core/operations/index.ts, hãy thêm một dữ liệu nhập cho thao tác mới.
    import {NewCharacterOperation} from './new_character_operation';
    
  2. Cũng trong tệp index.ts đó, hãy thêm dữ liệu xuất cho lớp NewCharacterOperation.
    export {
      ...
      NewCharacterOperation, // add this class
      ...
    };
  3. Trong tệp wordcraft/app/main.ts, hãy đăng ký thao tác mới.
    const operationsService = wordcraftCore.getService(OperationsService);
    operationsService.registerOperations(
      ...
      Operations.NewCharacterOperation, // add new operation
      ...
    );
    

Tạo cách xử lý lời nhắc

Trong giai đoạn cuối cùng của quá trình tạo chế độ điều khiển mới, bạn sẽ tạo mã để xử lý việc tạo lời nhắc cho mô hình tạo sinh bằng AI và xử lý phản hồi. Phần chính của công việc là xây dựng một trình xử lý lời nhắc trong thư mục wordcraft/app/models/gemini/prompts/. Trình xử lý này lấy dữ liệu đầu vào từ giao diện người dùng và tập hợp một lời nhắc để truyền đến mô hình tạo sinh.

Cách xác định giao diện cho các tham số lời nhắc:

  • Trong tệp wordcraft/app/core/shared/interfaces.ts, hãy thêm giao diện cho các tham số nhắc các thao tác mới.
    export interface NewCharacterPromptParams {
      character: string;
    }
    

Cách xác định trình xử lý lời nhắc cho thao tác mới:

  1. Trong thư mục wordcraft/app/models/gemini/prompts/, hãy tạo một lớp trình xử lý lời nhắc mới bằng cách sử dụng một trong các lớp thao tác hiện có làm mẫu. Đối với việc điều khiển ký tự mới, bạn có thể tạo bản sao của lớp new_story.ts và đổi tên lớp đó thành new_character.ts làm điểm xuất phát.
  2. Xác định chức năng trình xử lý lời nhắc và nhập lớp 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. Tạo hàm generatePrompt() để lấy dữ liệu đầu vào trên giao diện người dùng cho lời nhắc của mô hình 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. Tạo một hàm getPromptContext() để tập hợp dữ liệu đầu vào trên giao diện người dùng với các phản hồi mẫu và tạo lời nhắc hoàn chỉnh.
      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;
      }

Để tích hợp trình xử lý lời nhắc ký tự mới, hãy làm như sau:

  1. Trong tệp wordcraft/app/models/gemini/index.ts, hãy nhập trình xử lý lời nhắc cho thao tác ký tự mới.
    import {makePromptHandler as newCharacter} from './prompts/new_character';
  2. Thêm định nghĩa ghi đè cho trình xử lý lời nhắc newCharacter.
      override newCharacter = this.makePromptHandler(newCharacter);

Cách đăng ký tham số lời nhắc với định nghĩa mô hình:

  1. Trong tệp wordcraft/app/models/model.ts, hãy thêm một nội dung nhập cho giao diện NewCharacterPromptParams mới.
    import {
      ...
      NewCharacterPromptParams,
      ...
    } from '@core/shared/interfaces';
  2. Thêm tham số lời nhắc newCharacter vào lớp mô hình.
      async newCharacter(params: NewCharacterPromptParams): Promise<ModelResults> {
        throw new Error('Not yet implemented');
      }

Kiểm thử chế độ điều khiển chức năng ghi mới

Thành phần điều khiển mới của bạn đã sẵn sàng để thử nghiệm trong giao diện Wordcraft. Hãy nhớ kiểm tra mã của bạn để biết lỗi biên dịch trước khi tiếp tục.

Cách kiểm thử chế độ điều khiển ký tự mới:

  1. Chuyển đến thư mục gốc của dự án Wordcraft.`
    cd wordcraft/
    
  2. Chạy dự án ở chế độ phát triển:`
    npm run dev
    
  3. Trong trình duyệt web, hãy chuyển đến giao diện người dùng của Wordcraft. Địa chỉ cụ thể sẽ xuất hiện trong kết quả của lệnh trước đó, ví dụ:
    http://localhost:3000/
    
  4. Trong ứng dụng Wordcraft, hãy tạo một câu chuyện mới hoặc mở một câu chuyện hiện có.
  5. Trong vùng chỉnh sửa câu chuyện, hãy di chuyển con trỏ đến cuối câu chuyện. Trong thẻ Điều khiển ở bên phải, thành phần điều khiển giới thiệu ký tự sẽ xuất hiện.
  6. Trong trường giới thiệu nhân vật, hãy nhập nội dung mô tả ngắn gọn về nhân vật mới, sau đó chọn nút giới thiệu nhân vật.

Tài nguyên bổ sung

Để biết thêm thông tin về dự án Wordcraft, hãy xem kho lưu trữ mã. Bạn có thể xem các thay đổi được mô tả trong hướng dẫn này trong yêu cầu kéo này.

Ứng dụng sản xuất

Nếu bạn dự định triển khai một phiên bản Wordcraft tuỳ chỉnh cho nhiều đối tượng, hãy lưu ý rằng việc bạn sử dụng Google Gemini API có thể phải tuân theo giới hạn số lượng yêu cầu và các hạn chế khác về việc sử dụng. Nếu bạn đang cân nhắc xây dựng một ứng dụng phát hành chính thức bằng API Gemini như Workspace Agent, hãy tham khảo các dịch vụ của Vertex AI của Google Cloud để tăng khả năng có thể mở rộng và độ tin cậy cho ứng dụng của bạn.