GPT 프롬프트 자동화 Perplexity AI

gpt 프롬프트 자동화 perplexity ai

들어가며

GPT 프롬프트를 활용한 생산성 향상은 많은 사람들에게 매력적인 도전 과제가 되고 있습니다. 특히 Perplexity AI와 같은 서비스는 GPT 기반으로 다양한 질문에 대한 답변을 제공하지만, 반복적인 질문 입력과 답변 확인이 번거로울 수 있습니다. 이를 해결하기 위해 저는 Node.js와 Puppeteer, 그리고 Windows Batch Script를 활용해 Perplexity AI 프롬프트를 자동화하는 시스템을 구현했습니다. 이 글에서는 해당 구현 과정을 상세히 설명드리겠습니다.


Perplexity AI란?

Perplexity AI는 질문에 대한 답변을 제공하는 AI 기반 검색 서비스로, 특히 Pro 버전을 사용하면 보다 강력한 성능을 경험할 수 있습니다. 저는 Pro 플랜을 이용하면서 답변 품질에 매우 만족했지만, 매번 질문을 입력하고 응답을 확인하는 과정이 번거롭다고 느꼈습니다. 그래서 이를 자동화하기로 결정했습니다.

다만, 이 자동화 방식은 단순히 반복 작업을 줄이고 더 생산적인 작업에 집중하기 위한 보조 도구일 뿐, Perplexity AI가 제공하는 공식 API를 완전히 대체할 수는 없습니다. 또한, 무분별한 사용은 서비스 정책에 위배될 가능성이 있으므로 적절히 활용하는 것이 중요합니다.


구현 방식

1. 기술 스택

  • Node.js: JavaScript 런타임 환경으로, 웹 브라우저 자동화를 위한 Puppeteer 라이브러리를 사용.
  • Puppeteer🔗: Google Chrome 브라우저를 프로그래밍 방식으로 제어할 수 있는 라이브러리.
  • Windows Batch Script: 자동 실행 및 오류 처리 관리.

2. Windows Batch Script

아래는 자동화의 핵심 역할을 담당하는 Batch Script 코드입니다.

@echo off
chcp 65001 > nul
:loop
node puppetter_experiments --protocol-timeout=120000
if errorlevel 1 (
  echo 오류 발생. 랜덤한 시간 후 재시도합니다…
  set /a "wait_time=(%RANDOM% %% 30) + 1"
  timeout /t %wait_time% /nobreak > nul
  goto loop
)
echo 성공적으로 완료되었습니다.
set /a "restart_chance=%RANDOM% %% 100"
if %restart_chance% lss 30 (
  echo 30%% 확률로 재시작합니다. 5초 후 다시 시작합니다…
  timeout /t 5 /nobreak > nul
  goto loop
)
echo 프로그램을 종료합니다.
pause

이 스크립트는 Node.js로 작성된 자동화 코드를 실행하며, 오류 발생 시 랜덤 대기 후 재시도를 수행합니다. 또한 일정 확률로 작업을 재시작합니다.


3. Puppeteer 코드

Puppeteer 코드를 통해 브라우저를 열고 Perplexity AI 웹 페이지에서 질문 입력과 응답 수집을 자동화합니다.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const fs = require('fs').promises;
const path = require('path');
const { exec } = require('child_process');

puppeteer.use(StealthPlugin());

const responsesDir = 'textfiles';
const screenshotsDir = 'captures';

async function ensureDir(dirPath) {
  await fs.mkdir(dirPath, { recursive: true }).catch(err => {
    if (err.code !== 'EEXIST') throw err;
  });
}

function extractKeywords(question) {
  const stopWords = ['질문', '방법', '어떻게', '무엇', '왜', '언제', '어디서', '누가', '의', '에', '로', '를', '이', '가'];
  const words = question.toLowerCase().replace(/[^a-zA-Z0-9가-힣\s]/g, '').split(/\s+/);
  return words.filter(word => !stopWords.includes(word) && word.length > 1).slice(0, 3).join('_');
}

function sanitizeFilename(filename) {
  return filename.replace(/[<>:"/\\|?*\x00-\x1F]/g, '_');
}

async function launchBrowser() {
  return puppeteer.launch({
    executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
    headless: false,
    args: ['--no-sandbox'],
    protocolTimeout: 300000
  });
}

(async () => {
  await ensureDir(responsesDir);
  await ensureDir(screenshotsDir);

  const browser = await launchBrowser();
  const page = await browser.newPage();

  await page.goto('https://www.perplexity.ai/', { waitUntil: 'networkidle2', timeout: 160000 });
  console.log('페이지 로딩 완료');

  const question = "GPT와 Notion 관련한 주제";
  const inputSelector = 'textarea';

  await page.waitForSelector(inputSelector);
  await page.type(inputSelector, question);
  await page.keyboard.press('Enter');
  console.log('질문 입력 완료');

  await page.waitForSelector('.prose', { timeout: 180000 });
  const responseText = await page.evaluate(() => {
    return document.querySelector('.prose').innerText;
  });

  const filename = sanitizeFilename(extractKeywords(question)) + '.txt';
  await fs.writeFile(path.join(responsesDir, filename), responseText);

  await browser.close();
})();

3. Puppeteer 코드 설명

1. 필요한 모듈 로드

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const fs = require('fs').promises;
const path = require('path');
const { exec } = require('child_process');
  • puppeteer-extra: Puppeteer 확장 라이브러리로, 더 많은 기능을 제공합니다.
  • puppeteer-extra-plugin-stealth: 브라우저 자동화 탐지를 방지하는 플러그인.
  • fs, path: 파일 입출력 및 경로 조작을 위한 Node.js 기본 모듈
  • .exec: 외부 명령 실행을 위한 모듈.

2. 응답 저장 및 스크린샷 디렉토리 생성

async function ensureDir(dirPath) {
  await fs.mkdir(dirPath, { recursive: true }).catch(err => {
    if (err.code !== 'EEXIST') throw err;
  });
}
  • ensureDir 함수는 응답 및 스크린샷 디렉토리가 없는 경우 자동으로 생성합니다. 이미 존재하면 오류를 무시합니다.

3. 질문 키워드 추출 및 파일 이름 정리

function extractKeywords(question) { const stopWords = [...]; 
return words.filter(...).slice(0, 3).join('_'); 
} 
function sanitizeFilename(filename) { 
return filename.replace(/[<>:"/\\|?*\x00-\x1F]/g, '_'); 
}
  • extractKeywords: 질문에서 중요한 키워드(예: ‘GPT’, ‘Notion’)를 추출해 파일 이름으로 사용합니다.
  • sanitizeFilename: 파일 이름에 사용할 수 없는 문자를 안전한 문자로 대체합니다.

4. 브라우저 실행 및 설정

async function launchBrowser() { return puppeteer.launch({ executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: false, args: ['--no-sandbox'], protocolTimeout: 300000 }); }
  • launchBrowser: Chrome 브라우저를 실행하며, headless: false로 설정해 실제 브라우저 화면이 표시되도록 합니다.
  • protocolTimeout: 작업 타임아웃 설정.

5. Perplexity AI와 상호작용

await page.goto('https://www.perplexity.ai/', ...); await page.waitForSelector(inputSelector); await page.type(inputSelector, question); await page.keyboard.press('Enter');
  • Perplexity AI 웹사이트를 열고 질문 입력란(textarea)에 질문을 입력한 후 Enter 키로 제출합니다.
  • page.waitForSelector: 특정 요소가 나타날 때까지 대기해 안정성을 확보합니다.

6. 응답 수집 및 저장

const responseText = await page.evaluate(() => { return document.querySelector('.prose').innerText; }); 
await fs.writeFile(path.join(responsesDir, filename), responseText);
  • .prose 클래스를 가진 응답 요소에서 텍스트를 추출해 파일로 저장합니다.

7. 브라우저 종료

await browser.close();
  • 작업이 완료되면 브라우저를 종료해 리소스를 해제합니다.


실행 결과

GPT 프롬프트 자동화 사진

자동화 코드를 실행하면 다음과 같은 결과물을 얻게 됩니다.

  1. 응답 텍스트 파일: Perplexity AI에서 생성된 답변이 저장됩니다.
  2. 스크린샷: 답변 화면의 스크린샷이 캡처됩니다.

결론

GPT 기반 프롬프트 자동화를 통해 반복적인 작업을 간소화하고 생산성을 높일 수 있었습니다. 특히 Puppeteer를 활용한 브라우저 자동화는 다양한 웹 애플리케이션에서 확장 가능성이 높습니다. 다만, 이 방식은 편의성을 위한 보조 도구로 활용되어야 하며, 무분별한 사용은 서비스의 정책을 위반할 수 있음을 명심해야 합니다. 앞으로는 로그인 자동화와 질문 템플릿 기능을 추가하여 더욱 고도화할 계획입니다. 여러분도 이러한 자동화를 통해 효율적인 작업 방식으로 삶을 업그레이드 하시길 바랍니다….

Leave a Comment

error: Content is protected !!