Braintrust Observability

Braintrust Observability

Braintrust는 AI 애플리케이션을 구축하기 위한 엔드투엔드 플랫폼이에요. AI SDK로 구축할 때 Braintrust를 통합해 실제 상호작용을 로그하고, 모니터링하고, 조치를 취할 수 있어요.

출처: 문서

본문

설정

Braintrust는 OpenTelemetry를 네이티브로 지원하며 Next.js 또는 Node.js를 통해 AI SDK와 바로 동작해요.

Next.js

Next.js를 사용 중이라면 @vercel/otel과 함께 Braintrust exporter를 사용해요:

import { registerTelemetry } from 'ai';
import { LegacyOpenTelemetry } from '@ai-sdk/otel';
import { registerOTel } from '@vercel/otel';
import { BraintrustExporter } from 'braintrust';

registerTelemetry(new LegacyOpenTelemetry());

export function register() {
  registerOTel({
    serviceName: 'my-braintrust-app',
    traceExporter: new BraintrustExporter({
      parent: 'project_name:your-project-name',
      filterAISpans: true, // Only send AI-related spans
    }),
  });
}

추적된 LLM 호출은 parent 필드에 제공된 Braintrust 프로젝트 또는 실험 아래에 표시돼요.

통합이 등록되면 텔레메트리가 자동으로 캡처돼요. context 옵션을 통해 추가 메타데이터를 전달할 수 있어요:

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

const result = await generateText({
  model: openai('gpt-6-luna'),
  prompt: 'What is 2 + 2?',
  context: {
    query: 'weather',
    location: 'San Francisco',
  },
});

통합은 streamText 같은 스트리밍 함수를 지원해요. 스트리밍된 각 호출은 Braintrust에서 ai.streamText span을 생성해요.

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

export async function POST(req: Request) {
  const { prompt } = await req.json();

  const result = await streamText({
    model: openai('gpt-6-luna'),
    prompt,
  });

  return result.toDataStreamResponse();
}

Node.js

프레임워크 없이 Node.js를 사용한다면 NodeSDK를 직접 구성해야 해요. 이 경우 BraintrustSpanProcessor를 사용하는 것이 더 간단해요.

먼저 필요한 의존성을 설치해요:

npm install ai @ai-sdk/openai @ai-sdk/otel braintrust @opentelemetry/sdk-node @opentelemetry/sdk-trace-base zod

그런 다음 OpenTelemetry SDK를 설정해요:

import { NodeSDK } from '@opentelemetry/sdk-node';
import { registerTelemetry, generateText, tool, isStepCount } from 'ai';
import { LegacyOpenTelemetry } from '@ai-sdk/otel';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
import { BraintrustSpanProcessor } from 'braintrust';

const sdk = new NodeSDK({
  spanProcessors: [
    new BraintrustSpanProcessor({
      parent: 'project_name:your-project-name',
      filterAISpans: true,
    }),
  ],
});

sdk.start();
registerTelemetry(new LegacyOpenTelemetry());

async function main() {
  const result = await generateText({
    model: openai('gpt-6-luna'),
    messages: [
      {
        role: 'user',
        content: 'What are my orders and where are they? My user ID is 123',
      },
    ],
    tools: {
      listOrders: tool({
        description: 'list all orders',
        inputSchema: z.object({ userId: z.string() }),
        execute: async ({ userId }) =>
          `User ${userId} has the following orders: 1`,
      }),
      viewTrackingInformation: tool({
        description: 'view tracking information for a specific order',
        inputSchema: z.object({ orderId: z.string() }),
        execute: async ({ orderId }) =>
          `Here is the tracking information for ${orderId}`,
      }),
    },
    context: {
      something: 'custom',
      someOtherThing: 'other-value',
    },
    telemetry: {
      functionId: 'my-awesome-function',
    },
    stopWhen: isStepCount(10),
  });

  await sdk.shutdown();
}

main().catch(console.error);

자료

단계별 예시를 보려면 Braintrust 쿡북을 확인하세요.

Braintrust에 애플리케이션을 로그한 후 다음 워크플로우를 살펴보세요:

더 알아보기 (Learn more)