В этом руководстве мы узнаем, как создать плагин ChatGPT с помощью NestJS, прогрессивной среды Node.js для создания эффективных, надежных и масштабируемых серверных приложений. Мы создадим модуль NestJS, который интегрируется с API OpenAI для облегчения связи с ChatGPT.

Github Repo — https://github.com/messified/chatgpt-plugin-nestjs

Предпосылки

  • Базовые знания TypeScript и NestJS
  • Node.js ›= 14.x
  • NestJS ›= 8.x
  • Ключ API OpenAI (вы можете получить его, зарегистрировавшись на https://beta.openai.com/signup/)

Начиная

  1. Настроить новый проект NestJS
npm i -g @nestjs/cli

nest new chatgpt-plugin

cd chatgpt-plugin

2. Установите необходимые зависимости

$ npm install --save axios @nestjs/common @nestjs/core @nestjs/config reflect-metadata rxjs

3. Создайте модуль ChatGPT.

Создайте новый файл src/chatgpt.module.ts и добавьте следующий код:

import { Module} from '@nestjs/common';
import { ChatGPTService } from './chatgpt.service';
import { ChatGPTController } from './chatgpt.controller';
import { HttpModule } from '@nestjs/axios';

@Module({
  imports: [HttpModule],
  providers: [ChatGPTService],
  controllers: [ChatGPTController],
  exports: [ChatGPTService],
})
export class ChatGPTModule {}

4. Создайте службу ChatGPT.

Создайте новый файл src/chatgpt.service.ts и добавьте следующий код:

import { Injectable} from '@nestjs/common';
import { AxiosResponse } from 'axios';
import { Observable } from 'rxjs';
import { HttpService } from '@nestjs/axios';

@Injectable()
export class ChatGPTService {
  private readonly apiKey: string;
  private readonly apiUrl: string;

  constructor(private readonly httpService: HttpService) {
    this.apiKey = process.env.OPENAI_API_KEY;
    this.apiUrl = 'https://api.openai.com/v1/engines/davinci-codex/completions';
  }

  generateResponse(prompt: string): Observable<AxiosResponse> {
    const data = {
      prompt: prompt,
      max_tokens: 150,
      n: 1,
      stop: null,
      temperature: 1,
    };

    const headers = {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${this.apiKey}`,
    };

    return this.httpService.post(this.apiUrl, data, { headers: headers });
  }
}

5. Создайте контроллер ChatGPT.

Создайте новый файл src/chatgpt.controller.ts и добавьте следующий код:

import { Controller, Post, Body, HttpCode, HttpStatus } from '@nestjs/common';
import { ChatGPTService } from './chatgpt.service';
import { AxiosResponse } from 'axios';
import { map } from 'rxjs/operators';

@Controller('chatgpt')
export class ChatGPTController {
  constructor(private readonly chatGPTService: ChatGPTService) {}

  @Post()
  @HttpCode(HttpStatus.OK)
  generateResponse(@Body('prompt') prompt: string) {
    return this.chatGPTService
      .generateResponse(prompt)
      .pipe(map((response: AxiosResponse) => response.data.choices[0].text.trim()));
  }
}

6. Обновите AppModule.

Обновите файл src/app.module.ts, включив в него ChatGPTModule:

import { Module } from '@nestjs/common';
import { ChatGPTModule } from './chatgpt.module';

@Module({
  imports: [ChatGPTModule],
})
export class AppModule {}

7. Настройте ключ API OpenAI

Создайте файл .env в корневом каталоге проекта и добавьте свой ключ OpenAI API:

OPENAI_API_KEY=your_openai_api_key

Обновите файл src/app.module.ts, включив в него ConfigModule:

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { ChatGPTModule } from './chatgpt.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: '.env',
    }),
    ChatGPTModule,
  ],
})
export class AppModule {}

8. Протестируйте подключаемый модуль ChatGPT.

Запустите приложение NestJS:

$ npm run start

Чтобы протестировать плагин, отправьте POST-запрос на конечную точку /chatgpt с подсказкой:

curl -X POST -H "Content-Type: application/json" -d '{"prompt": "How to install Node.js?"}' http://localhost:3000/chatgpt

Тесты

  1. Установить тестовые зависимости

Чтобы написать модульные тесты, нам нужно установить среду тестирования Jest и пакет тестирования NestJS:

$ npm install --save-dev @nestjs/testing jest ts-jest

2. Создайте тест службы ChatGPT.

Создайте новый файл src/chatgpt.service.spec.ts и добавьте следующий код:

import { Test, TestingModule } from '@nestjs/testing';
import { HttpModule, HttpService } from '@nestjs/common';
import { ChatGPTService } from './chatgpt.service';
import { of } from 'rxjs';

describe('ChatGPTService', () => {
  let service: ChatGPTService;
  let httpService: HttpService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [HttpModule],
      providers: [ChatGPTService],
    }).compile();

    service = module.get<ChatGPTService>(ChatGPTService);
    httpService = module.get<HttpService>(HttpService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  it('should generate a response', (done) => {
    const prompt = 'Test prompt';
    const mockResponse = {
      data: {
        choices: [
          {
            text: 'Test response',
          },
        ],
      },
    };

    jest.spyOn(httpService, 'post').mockImplementationOnce(() => of(mockResponse));

    service.generateResponse(prompt).subscribe((response) => {
      expect(response).toEqual(mockResponse);
      done();
    });
  });
});

3. Создайте тест контроллера ChatGPT.

Создайте новый файл src/chatgpt.controller.spec.ts и добавьте следующий код:

import { Test, TestingModule } from '@nestjs/testing';
import { ChatGPTController } from './chatgpt.controller';
import { ChatGPTService } from './chatgpt.service';
import { of } from 'rxjs';

describe('ChatGPTController', () => {
  let controller: ChatGPTController;
  let service: ChatGPTService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [ChatGPTController],
      providers: [
        {
          provide: ChatGPTService,
          useValue: {
            generateResponse: jest.fn(),
          },
        },
      ],
    }).compile();

    controller = module.get<ChatGPTController>(ChatGPTController);
    service = module.get<ChatGPTService>(ChatGPTService);
  });

  it('should be defined', () => {
    expect(controller).toBeDefined();
  });

  it('should generate a response', () => {
    const prompt = 'Test prompt';
    const mockResponse = 'Test response';

    jest.spyOn(service, 'generateResponse').mockImplementationOnce(() => of(mockResponse));

    controller.generateResponse(prompt).subscribe((response) => {
      expect(response).toBe(mockResponse);
    });
  });
});

4. Запустите тесты

Для запуска тестов выполните следующую команду:

npm run test

Вы должны увидеть, что все тесты пройдены.

Заключение

Вы успешно создали плагин ChatGPT с NestJS и создали модульные тесты для службы и контроллера. Модульные тесты гарантируют, что ваш плагин ChatGPT работает должным образом, и помогают поддерживать качество кода по мере того, как вы расширяете проект, добавляя дополнительные функции или внося изменения в будущем.

Что теперь?

С вашим плагином ChatGPT вы можете создавать широкий спектр приложений и функций, которые используют возможности понимания и генерации естественного языка на основе искусственного интеллекта. Вот несколько практических способов использования плагина:

1. Чат-бот. Создайте чат-бота для своего веб-сайта или приложения, чтобы отвечать на вопросы пользователей, обеспечивать поддержку клиентов или вовлекать пользователей в интерактивные беседы.

2. Создание контента: создайте инструмент, который поможет пользователям создавать контент, такой как сообщения в блогах, обновления в социальных сетях или даже исходный код, на основе заданного запроса или набора требований.

3. Обобщение. Разработайте функцию, которая обобщает длинные фрагменты текста, такие как статьи, документы или сообщения электронной почты, чтобы пользователям было легче понять основные моменты.

4. Перевод. Внедрите службу перевода, которая позволит пользователям переводить текст между разными языками, что потенциально улучшит качество машинных переводов.

5. Текстовые игры. Создавайте текстовые приключенческие игры или интерактивные рассказы, в которых пользователи могут участвовать в захватывающих повествованиях, вводя текстовые команды и получая ответы от ИИ.

6. Генерация кода. Создайте инструмент, который генерирует фрагменты кода или помогает пользователям решать проблемы с кодированием на основе их ввода, что делает процесс разработки более быстрым и эффективным.

7. Обучение: создайте виртуального наставника, который поможет пользователям изучать новые темы или понятия, предоставляя объяснения, примеры и отвечая на вопросы.

8. Идея: создайте инструмент для мозгового штурма, который генерирует идеи, предложения или решения на основе пользовательского ввода, помогая пользователям преодолевать творческие препятствия или исследовать новые перспективы.

9. Семантический поиск. Внедрите функцию поиска, которая понимает контекст и значение пользовательских запросов, предоставляя более релевантные и точные результаты.

10. Анализ текста. Разработайте инструмент, который может анализировать текст на предмет тональности, грамматики, стиля или других лингвистических характеристик, предоставляя пользователям обратную связь или информацию.

Помните, что плагин подключается к API OpenAI, поэтому вам может потребоваться учитывать затраты на использование и ограничения скорости при создании приложений, которые в значительной степени зависят от плагина ChatGPT. Кроме того, убедитесь, что вы придерживаетесь политик и рекомендаций по использованию OpenAI при использовании ChatGPT API для своих проектов.