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.streamTextspan을 생성해요.
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에 애플리케이션을 로그한 후 다음 워크플로우를 살펴보세요:
- 도구를 라이브러리에 추가하고 실험과 플레이그라운드에서 사용하기
- LLM 호출 품질을 평가하기 위한 커스텀 스코러 만들기
- 로그를 데이터셋에 추가하고 모델과 프롬프트를 비교하는 평가 실행하기
더 알아보기 (Learn more)
- 출처 문서: Braintrust Observability