퍼플렉시티 Search API 공개! 리서치 효율 높이는 3가지 활용법

배경: 기존 AI 리서치의 한계

AI 생산성 도구를 활용한 리서치는 편리하지만, “AI 생산성 툴 트렌드 분석해줘”처럼 전체 과정을 한 번에 요청하는 방식은 근본적인 문제를 내포한다. 첫째, 출처 컨트롤의 어려움이다. AI가 어떤 사이트를 검색하고 그 정보를 기반으로 요약할지 사용자가 제어할 수 없다. 둘째, 최신 정보 누락 가능성이 있다. 최근 기사 위주로 검색을 요청해도 가장 최신 정보를 가져오지 못하는 경우가 발생한다. 셋째, 재현 불가능성이다. 같은 주제로 리서치를 요청해도 매번 결과가 달라질 수 있어 일관성 있는 분석이 어렵다. 마지막으로 환각(Hallucination)의 위험성이 항상 존재하며, 출처가 붙어도 해당 문장과 관련 없는 사이트가 표기되는 경우가 발생한다.

핵심 개념: 리서치 프로세스의 단계별 분리

이러한 문제를 해결하기 위해서는 리서치 프로세스를 세분화하는 접근이 필요하다. 전통적인 수동 리서치처럼 키워드 생성 → 관련 사이트 수집 → 출처 아카이빙 → 내용 분석 → 요약의 단계로 쪼개면, 각 단계에서 사용자가 개입하고 커스터마이징할 수 있는 여지가 생긴다. Perplexity의 Search API는 이러한 단계별 자동화를 가능하게 하는 도구로, 검색 키워드 제어, 신뢰 도메인 필터링, 결과의 재현성 확보가 가능하다.

시스템 아키텍처: n8n 기반 워크플로우 구성

기본 설정: Data Table 활용

n8n의 Data Table은 내장 스프레드시트 형태의 데이터베이스로, 인증 없이 빠르게 AI 설정 값을 저장하고 활용할 수 있다. 리서치 자동화 시스템에서는 다음 컬럼 구조를 사용한다:

컬럼명용도예시
Case세 가지 방식 구분case-1, case-2, case-3
Query검색 키워드 리스트”AI 브라우저 in 2025, AI 브라우저 ChatGPT, Gemini, Claude”
System PromptAI 모델 지시사항요약 형식, 출력 스타일 등

Query 값은 Edit Field 노드를 통해 전처리가 필요하다. 쉼표로 구분된 문자열을 배열 형태로 변환하고, 각 항목을 쌍따옴표로 감싸며, 전체를 브래킷으로 묶어야 Perplexity API가 정확히 인식한다:

// Edit Field Expression
$json.Query.split(',')
  .map(item => item.trim())
  .filter(item => item.length > 0)
  .map(item => `"${item}"`)
  .join(', ')

HTTP Request를 통한 Perplexity Search API 호출

n8n의 기본 Perplexity 노드는 Message 모델만 지원하므로, Search API를 사용하려면 HTTP Request 노드로 직접 구성해야 한다. Perplexity API Reference 문서의 Search API 섹션에서 제공하는 cURL 명령을 Import cURL 기능으로 가져와 다음과 같이 설정한다:

Endpoint: https://api.perplexity.ai/search
Method: POST
Authentication: Predefined Credential (Perplexity API)
Body (JSON):

{
  "query": ["검색키워드1", "검색키워드2", "검색키워드3"],
  "max_results": 10,
  "max_tokens_per_page": 2048
}

주요 파라미터:

  • query: 최대 5개까지 동시 검색 가능
  • max_results: 사이트 개수 (최대 20개)
  • max_tokens_per_page: 사이트별 스니펫 길이 (기본 1024, 최대 설정 가능)
  • country: 검색 지역 설정 (예: “US”, “KR”)

방식 1: 멀티 키워드 검색 + 스니펫 요약

워크플로우 구조

  1. Manual Trigger → 수동 실행
  2. Data Table Get Row → Case 1 설정 값 로드
  3. Edit Field → Query 전처리 (배열 포맷팅)
  4. HTTP Request (Perplexity Search API) → 키워드 검색
  5. Split Out → 10개 결과를 개별 아이템으로 분리
  6. Google Sheets Append Row → 출처 아카이빙
  7. OpenAI Message → GPT-4o-mini로 스니펫 기반 요약
  8. Google Sheets Append Row → 리서치 결과 저장

실행 예시: AI 브라우저 트렌드 분석

검색 키워드:

  • “AI 브라우저 in 2025”
  • “AI 브라우저 ChatGPT”
  • “AI 브라우저 Gemini”
  • “AI 브라우저 Claude”

Search API 응답:

{
  "results": [
    {
      "title": "...",
      "url": "https://example.com/...",
      "snippet": "...",
      "published_date": "2025-01-15",
      "last_indexed": "2025-01-20"
    },
    // ... 9개 더
  ]
}

출처 아카이빙 (Google Sheets - 리서치 출처):

Case검색요청Query제목출처(URL)Snippet날짜업데이트날짜
case-1AI 브라우저……https://……2025-01-152025-01-20

ChatGPT 요약 프롬프트:

검색 쿼리: ["AI 브라우저 in 2025", ...]

다음 참고 자료만 근거로 해서 브리핑을 작성해줘:
{JSON.stringify(results)}

장점:

  • 빠른 실행 속도 (10개 사이트 기준 수 초)
  • 키워드 고정으로 재현성 확보
  • 출처 자동 아카이빙으로 추후 검증 가능

단점:

  • 스니펫 길이 제한으로 심층 분석 어려움
  • 사이트 본문 전체를 읽지 못함

방식 2: URL 직접 접근 + Gemini URL Context

개념: Gemini의 URL Context Tool

Gemini API는 url_context라는 Tool을 제공하여, 프롬프트 내에 URL이 포함되면 해당 사이트에 직접 접근해 본문을 읽고 분석할 수 있다. 스니펫이 아닌 전체 본문 기반 분석이 가능하다는 점에서 방식 1보다 정밀하다.

워크플로우 구조

  1. Manual Trigger
  2. Data Table Get Row → Case 2 설정
  3. Edit Field → Query 전처리
  4. HTTP Request (Perplexity Search API) → max_results: 5 (타임아웃 방지)
  5. Split Out → 결과 분리
  6. Google Sheets Append Row → 출처 저장
  7. Code (JavaScript) → URL 리스트 통합
  8. HTTP Request (Gemini API) → URL Context 활용 분석
  9. Google Sheets Append Row → 결과 저장

Code 노드: URL 통합 로직

// Split Out으로 분리된 아이템들을 다시 하나로 통합
const items = $input.all();
const urls = items.map(item => item.json.url);
 
const userPrompt = `
아래 URL들만 근거로, URL Context로 각 본문을 확인하고 시스템 지시에 따라 비교 추천 리포트를 작성해주세요.
 
URL 리스트:
${urls.join('\n')}
`;
 
return { json: { userPrompt } };

Gemini API HTTP Request 설정

Endpoint: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent
Method: POST
Authentication: Predefined Credential (Gemini API)
Body:

{
  "system_instruction": {
    "parts": { "text": "{{$node['Case 2'].json.system_prompt}}" }
  },
  "contents": {
    "role": "user",
    "parts": { "text": "{{$node['Code'].json.userPrompt}}" }
  },
  "generationConfig": {
    "temperature": 0.3,
    "maxOutputTokens": 2048
  },
  "tools": [
    { "google_search": {} },
    { "url_context": {} }
  ]
}

핵심 파라미터:

  • tools: url_context 명시로 URL 직접 접근 활성화
  • temperature: 0.3으로 낮춰 환각 최소화
  • maxOutputTokens: 출력 길이 제어로 타임아웃 방지

실행 예시: n8n vs Make 비교 분석

검색 키워드:

  • “n8n vs Make 비교”
  • “n8n vs Make Feature”
  • “n8n vs Make Pricing Recommendation”

Search API 결과: 5개 URL 수집
Gemini 분석 과정:

  1. 각 URL에 접근하여 본문 읽기
  2. 기능, 가격, 사용성 등 비교 포인트 추출
  3. 표 형식으로 정리된 비교 리포트 생성

타임아웃 대응:

  • 사이트 개수를 5개로 제한 (20개 시 타임아웃 발생)
  • maxOutputTokens 설정으로 응답 시간 단축

장점:

  • 전체 본문 기반 심층 분석
  • 비교 분석, 상세 정보 추출에 적합

단점:

  • 사이트 개수가 많으면 타임아웃 발생
  • 브로드한 리서치에는 부적합

방식 3: 신뢰 도메인 필터링 + Deep Research (Async)

개념: 도메인 기반 심층 리서치

Perplexity의 Deep Research 기능은 광범위한 검색과 분석을 수행하지만, 일반적으로 4분 이상 소요되어 n8n의 기본 타임아웃(2분)을 초과한다. 이를 해결하기 위해 Async(비동기) 모드를 사용한다. 또한 Search API로 신뢰할 수 있는 도메인 리스트를 먼저 수집하고, 이를 search_domain_filter로 제공하여 리서치 품질을 높인다.

워크플로우 구조

  1. Manual Trigger
  2. Data Table Get Row → Case 3 설정
  3. Edit Field → Query 전처리 + System Prompt 내 {{topic}} 치환
  4. HTTP Request (Perplexity Search API) → max_results: 20, country: “US”
  5. Split Out → 20개 결과 분리
  6. Google Sheets Append Row → 출처 저장
  7. Code (JavaScript) → 신뢰 도메인 알고리즘으로 20개 필터링
  8. HTTP Request (Create Async Chat Completion) → Deep Research 요청
  9. Wait (240초) → 초기 대기
  10. HTTP Request (Get Async Response) → 상태 확인
  11. If (Status == “completed”) → 완료 여부 체크
    • False: Wait(30초) → 10번으로 루프
    • True: 다음 단계 진행
  12. Edit Field → Think 부분 제거
  13. Google Sheets Append Row → 결과 저장

System Prompt 동적 생성

Data Table의 System Prompt에 {{topic}} 플레이스홀더를 포함하고, Edit Field에서 실제 Query 값으로 치환한다:

// Edit Field Expression
const systemPrompt = $json.system_prompt;
const topic = $json.Query.split(',')[0].trim(); // 첫 번째 키워드를 주제로 사용
return {
  json: {
    query: /* 전처리된 쿼리 배열 */,
    system_prompt: systemPrompt.replace('{{topic}}', topic)
  }
};

Code 노드: 신뢰 도메인 필터링 알고리즘

const items = $input.all();
 
// 1. 기본 신뢰 도메인 (수동 추가)
const trustedDomains = [
  'techcrunch.com',
  'venturebeat.com',
  'theverge.com'
];
 
// 2. Search API 결과에서 도메인 추출
const domainCount = {};
items.forEach(item => {
  const url = new URL(item.json.url);
  const domain = url.hostname.replace('www.', '');
  domainCount[domain] = (domainCount[domain] || 0) + 1;
});
 
// 3. 2회 이상 등장한 도메인 우선 추가
const frequentDomains = Object.keys(domainCount)
  .filter(domain => domainCount[domain] >= 2)
  .sort((a, b) => domainCount[b] - domainCount[a]);
 
trustedDomains.push(...frequentDomains);
 
// 4. 상위 랭킹 도메인으로 20개 채우기
const allDomains = items.map(item => {
  const url = new URL(item.json.url);
  return url.hostname.replace('www.', '');
});
 
for (const domain of allDomains) {
  if (trustedDomains.length >= 20) break;
  if (!trustedDomains.includes(domain)) {
    trustedDomains.push(domain);
  }
}
 
return {
  json: { 
    domains: trustedDomains.slice(0, 20)
  }
};

알고리즘 로직:

  1. 수동으로 지정한 신뢰 도메인 포함
  2. Search API 결과에서 2회 이상 등장한 도메인 우선 추가
  3. 상위 랭킹 도메인으로 20개까지 채움

Async Deep Research 구현

Step 1: Deep Research 요청 (Create Async Chat Completion)

Endpoint: https://api.perplexity.ai/chat/completions/async
Body:

{
  "model": "sonar-reasoning",
  "messages": [
    {
      "role": "system",
      "content": "{{$node['Settings'].json.system_prompt}}"
    },
    {
      "role": "user",
      "content": "{{$node['Settings'].json.query[0]}}"
    }
  ],
  "search_domain_filter": {{$node['Code'].json.domains}},
  "temperature": 0.2,
  "max_tokens": 4096
}

응답:

{
  "id": "async-12345...",
  "status": "created"
}

Step 2: 대기 (Wait 240초)

Deep Research는 최소 4분 소요되므로 초기 대기 시간 설정

Step 3: 상태 확인 (Get Async Response)

Endpoint: https://api.perplexity.ai/chat/completions/async/{{$node['Request'].json.id}}
Method: GET

응답 예시 (진행 중):

{
  "id": "async-12345...",
  "status": "in_progress"
}

응답 예시 (완료):

{
  "id": "async-12345...",
  "status": "completed",
  "choices": [
    {
      "message": {
        "content": "<think>분석 과정...</think>\n\n# 2025 AI 자동화 시장 트렌드\n\n본문..."
      }
    }
  ]
}

Step 4: If 노드 + 루프

// If 노드 조건
$json.status === "completed"
  • True: Edit Field로 진행 (Think 부분 제거)
  • False: Wait(30초) → Get Async Response 재실행 (루프)

Step 5: 결과 전처리 (Edit Field)

// <think>...</think> 부분 제거
const content = $json.choices[0].message.content;
const reportStart = content.indexOf('\n\n') + 2;
return {
  json: {
    result: content.substring(reportStart)
  }
};

실행 예시: 2025 AI 자동화 시장 트렌드

검색 키워드: “AI Automation Market Trends 2025 Report”
수집된 도메인: 20개 (TechCrunch, VentureBeat, McKinsey, Gartner 등)
Deep Research 소요 시간: 약 5분
최종 리포트: 시장 규모, 주요 플레이어, 기술 트렌드, 전망 등을 포함한 4,000+ 토큰 분량

장점:

  • 20개 신뢰 도메인 기반 포괄적 분석
  • Async 방식으로 타임아웃 없음
  • 최상급 심층 리포트 생성

단점:

  • 5분 이상 소요 (실시간성 낮음)
  • 워크플로우 복잡도 증가

시스템 비교 및 선택 가이드

방식속도정밀도사이트 개수적합한 리서치 유형
1. 멀티 키워드 + 스니펫★★★★★ (수 초)★★☆☆☆10개빠른 트렌드 파악, 초기 조사
2. URL 직접 접근 (Gemini)★★★☆☆ (1-2분)★★★★☆5개비교 분석, 제품 리뷰
3. Deep Research (Async)★★☆☆☆ (5분+)★★★★★20개시장 조사, 백서급 리포트

핵심 인사이트: 생산성은 시스템에서 나온다

AI에게 “자유롭게” 리서치를 맡기는 것은 편리하지만, 출처 불명확, 환각, 재현 불가능 등의 문제로 인해 오히려 팩트 체크에 더 많은 시간을 소비하게 된다. 반면 리서치 프로세스를 단계별로 세분화하고, 각 단계에서 제어 가능한 파라미터(키워드, 도메인 필터, 요약 형식 등)를 명확히 설정하면, 신뢰도를 높이면서도 자동화의 이점을 누릴 수 있다.

Perplexity Search API의 진정한 가치는 단순히 “검색 결과를 제공하는 것”이 아니라, 검색-수집-분석-요약의 각 단계를 프로그래밍 가능하게 만든다는 점에 있다. n8n과 같은 워크플로우 자동화 플랫폼과 결합하면, 개발자가 아니더라도 자신만의 리서치 시스템을 구축할 수 있다.

실무 적용 체크리스트

  1. 리서치 목적 명확화: 빠른 트렌드 파악 vs. 심층 분석
  2. 신뢰 도메인 리스트 사전 구성: 분야별 권위 있는 소스 정의
  3. 출처 아카이빙 시스템: Google Sheets, Notion 등으로 검증 가능하게 저장
  4. System Prompt 템플릿화: Data Table에 케이스별로 관리
  5. 타임아웃 대응: 사이트 개수 조절, Async 모드 활용
  6. 결과 포맷 표준화: Markdown, JSON 등 일관된 형식 유지

관련 리소스:

  • Perplexity API Documentation: /search-api:nqplahsSKhw
  • n8n Data Table Guide: /workflows:nqplahsSKhw
  • Gemini URL Context Tool: /api-reference:nqplahsSKhw