PostHog LLM Analytics

PostHog LLM Analytics

PostHog은 오픈소스 제품 분석 플랫폼이에요. PostHog LLM Analytics 통합을 사용하면 제품 분석과 함께 LLM 사용량을 추적해 AI 기능이 사용자 행동에 어떤 영향을 미치는지 이해할 수 있어요. PostHog는 다음을 제공해요:

  • LLM 분석 — 모델과 사용자별 비용, 지연시간, 토큰 사용량
  • 제품 분석 — AI 사용량을 사용자 행동과 비즈니스 지표에 연결
  • 실험 — 프롬프트, 모델, AI 기능 A/B 테스트

출처: 문서

본문

설정

PostHog는 OpenTelemetry를 통해 AI SDK 텔레메트리 데이터를 지원해요. @posthog/ai 패키지의 PostHogTraceExporter는 gen_ai.* span을 PostHog의 OTLP 수집 엔드포인트로 보내고, 거기서 자동으로 $ai_generation 이벤트로 변환돼요.

Next.js

Next.js는 instrumentation hook을 통한 OpenTelemetry 계측을 기본 지원해요.

Step 1. 의존성 설치

npm install @posthog/ai @opentelemetry/sdk-node @opentelemetry/resources @ai-sdk/otel

Step 2. 프로젝트 루트에 instrumentation.ts 파일을 만들고 OTel 설정과 함께 AI SDK 텔레메트리 통합을 등록해요:

import { registerTelemetry } from 'ai';
import { LegacyOpenTelemetry } from '@ai-sdk/otel';
import { NodeSDK } from '@opentelemetry/sdk-node';
import { resourceFromAttributes } from '@opentelemetry/resources';
import { PostHogTraceExporter } from '@posthog/ai/otel';

registerTelemetry(new LegacyOpenTelemetry());

export function register() {
  const sdk = new NodeSDK({
    resource: resourceFromAttributes({
      'service.name': 'my-nextjs-app',
    }),
    traceExporter: new PostHogTraceExporter({
      apiKey: proces...EY!,
      host: 'https://us.i.posthog.com', // use https://eu.i.posthog.com for EU
    }),
  });
  sdk.start();
}

Step 3. 라우트 핸들러나 서버 액션에서 텔레메트리가 활성화된 AI SDK를 사용해요

import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';

const result = await generateText({
  model: openai('gpt-6-astra'),
  prompt: 'Tell me a fun fact about hedgehogs.',
  telemetry: {
    functionId: 'my-ai-function',
    metadata: {
      posthog_distinct_id: 'user_123', // optional: links events to a PostHog user
    },
  },
});

Node.js

Step 1. 의존성 설치

npm install @posthog/ai @opentelemetry/sdk-node @opentelemetry/resources @ai-sdk/otel

Step 2. PostHog의 trace exporter로 OpenTelemetry SDK 초기화

import { NodeSDK } from '@opentelemetry/sdk-node';
import { resourceFromAttributes } from '@opentelemetry/resources';
import { PostHogTraceExporter } from '@posthog/ai/otel';
import { registerTelemetry } from 'ai';
import { LegacyOpenTelemetry } from '@ai-sdk/otel';

const sdk = new NodeSDK({
  resource: resourceFromAttributes({
    'service.name': 'my-ai-app',
  }),
  traceExporter: new PostHogTraceExporter({
    apiKey: '<your...y>',
    host: 'https://us.i.posthog.com', // use https://eu.i.posthog.com for EU
  }),
});
sdk.start();
registerTelemetry(new LegacyOpenTelemetry());

Step 3. AI SDK를 사용해요. 통합이 등록되면 텔레메트리가 자동으로 캡처돼요:

import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';

const result = await generateText({
  model: openai('gpt-6-astra'),
  prompt: 'Tell me a fun fact about hedgehogs.',
  telemetry: {
    functionId: 'my-ai-function',
    metadata: {
      posthog_distinct_id: 'user_123', // optional: links events to a PostHog user
    },
  },
});

console.log(result.text);

await sdk.shutdown();

통합은 streamText 같은 스트리밍 함수를 지원해요. 스트리밍된 각 호출은 PostHog가 캡처하는 ai.streamText span을 생성해요.

구성

이벤트를 PostHog 사용자에 연결

metadata 필드에 posthog_distinct_id를 전달해 LLM 이벤트를 PostHog의 특정 사용자와 연관지어요. 생략하면 이벤트가 익명으로 캡처돼요.

const result = await generateText({
  model: openai('gpt-6-astra'),
  prompt: 'Write a short story about a cat.',
  telemetry: {
    metadata: {
      posthog_distinct_id: 'user_123',
    },
  },
});

프라이버시 제어

recordInputs와 recordOutputs를 false로 설정해 입력과 출력 기록을 비활성화할 수 있어요:

const result = await generateText({
  model: openai('gpt-6-astra'),
  prompt: 'Write a short story about a cat.',
  telemetry: {
    recordInputs: false,
    recordOutputs: false,
  },
});

자료

더 알아보기 (Learn more)