메인 콘텐츠로 건너뛰기
OpenTelemetry (OTEL)을 사용해 Weave에서 PydanticAI 에이전트 및 도구 호출을 트레이싱할 수 있습니다. PydanticAI는 Pydantic 팀이 개발한 Python 에이전트 프레임워크로, 생성형 AI를 활용해 프로덕션급 애플리케이션을 쉽고 타입 안전하게 구축할 수 있도록 해 줍니다. 이 프레임워크는 모든 에이전트 및 도구 호출을 트레이싱하기 위해 OTEL을 사용합니다.
Weave에서 OTEL 트레이싱에 대한 자세한 내용은 Send OTEL Traces to Weave를 참조하세요.
이 가이드는 OTEL을 사용해 PydanticAI 에이전트 및 도구 호출을 트레이싱하고, 해당 트레이스를 Weave에서 시각화하는 방법을 보여줍니다. 필요한 의존성을 설치하는 방법, OTEL 트레이서를 구성해 데이터를 Weave로 전송하는 방법, 그리고 PydanticAI 에이전트와 도구를 계측하는 방법을 학습하게 됩니다. 또한 애플리케이션의 모든 에이전트에 대해 기본적으로 트레이싱을 활성화하는 방법도 살펴봅니다.

사전 준비 사항

시작하기 전에 필수 OTEL 종속성을 설치하세요:
pip install opentelemetry-sdk OTELemetry-exporter-otlp-proto-http
이제 Weave에서 OTEL 트레이싱을 구성합니다.

Weave에서 OTEL 트레이싱 설정

PydanticAI에서 Weave로 트레이스를 전송하려면 TracerProviderOTLPSpanExporter를 사용해 OTEL을 설정합니다. 익스포터에 인증 및 프로젝트 식별을 위한 적절한 엔드포인트와 HTTP 헤더를 설정하세요.
API 키와 프로젝트 정보와 같은 민감한 환경 변수는 .env와 같은 환경 파일에 저장하고, os.environ을 사용해 로드하는 것을 권장합니다. 이렇게 하면 자격 증명을 안전하게 보호하고 코드베이스에 포함되지 않도록 할 수 있습니다.

필수 설정

  • 엔드포인트: https://trace.wandb.ai/otel/v1/traces
  • 헤더:
    • Authorization: W&B API 키를 사용하는 Basic 인증
    • project_id: W&B entity/project 이름 (예: myteam/myproject)

예시 설정

다음 코드 스니펫은 PydanticAI 애플리케이션에서 Weave로 OTEL 트레이스를 전송하도록 OTLP span exporter 및 tracer provider를 구성하는 방법을 보여줍니다.
import base64
import os
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk import trace as trace_sdk
from opentelemetry.sdk.trace.export import SimpleSpanProcessor

# 환경 변수에서 민감한 값 로드
WANDB_BASE_URL = "https://trace.wandb.ai"
PROJECT_ID = os.environ.get("WANDB_PROJECT_ID")  # W&B entity/프로젝트 이름 예: "myteam/myproject"
WANDB_API_KEY = os.environ.get("WANDB_API_KEY")  # W&B API 키

OTEL_EXPORTER_OTLP_ENDPOINT = f"{WANDB_BASE_URL}/otel/v1/traces"
AUTH = base64.b64encode(f"api:{WANDB_API_KEY}".encode()).decode()

OTEL_EXPORTER_OTLP_HEADERS = {
    "Authorization": f"Basic {AUTH}",
    "project_id": PROJECT_ID,
}

# 엔드포인트와 헤더로 OTLP 스팬 익스포터 생성
exporter = OTLPSpanExporter(
    endpoint=OTEL_EXPORTER_OTLP_ENDPOINT,
    headers=OTEL_EXPORTER_OTLP_HEADERS,
)

# 트레이서 프로바이더 생성 및 익스포터 추가
tracer_provider = trace_sdk.TracerProvider()
tracer_provider.add_span_processor(SimpleSpanProcessor(exporter))

OTEL로 PydanticAI 에이전트 추적하기

PydanticAI 에이전트를 추적하고 Weave로 트레이스 데이터를 전송하려면, 트레이서 프로바이더로 설정된 InstrumentationSettings 객체를 Agent constructor에 전달하세요. 이렇게 하면 모든 에이전트 및 도구 호출이 OTEL 설정에 따라 추적됩니다. 다음 예시는 추적이 활성화된 간단한 에이전트를 만드는 방법을 보여줍니다. 핵심 단계는 에이전트를 초기화할 때 instrument 인수를 설정하는 것입니다:
from pydantic_ai import Agent
from pydantic_ai.models.instrumented import InstrumentationSettings

# OTEL 추적을 사용하는 PydanticAI 에이전트 생성
agent = Agent(
    "openai:gpt-4o",
    instrument=InstrumentationSettings(tracer_provider=tracer_provider),
)

result = agent.run_sync("What is the capital of France?")
print(result.output)
에이전트 호출은 모두 추적되어 Weave로 전송됩니다.
간단한 PydanticAI 에이전트 트레이스 시각화

OTEL로 PydanticAI 도구 트레이싱하기

Weave는 OTEL로 계측된 모든 PydanticAI 작업을 트레이싱할 수 있으며, 여기에는 에이전트 호출과 도구 호출이 모두 포함됩니다. 이는 에이전트가 도구(예: @agent.tool_plain 데코레이터가 적용된 함수)를 호출할 때, 도구 입력과 출력, 그리고 모델의 추론 과정을 포함한 전체 상호작용이 Weave에 캡처되고 시각화된다는 뜻입니다. 다음 예시는 시스템 프롬프트와 도구를 갖는 에이전트를 생성하는 방법을 보여줍니다. 에이전트와 도구 모두에 대해 트레이싱이 자동으로 활성화됩니다.
from pydantic_ai import Agent
from pydantic_ai.models.instrumented import InstrumentationSettings

# 시스템 프롬프트와 OTEL 추적을 사용하여 PydanticAI 에이전트 생성
agent = Agent(
    "openai:gpt-4o",
    system_prompt=(
        "You are a helpful assistant that can multiply numbers. "
        "When asked to multiply numbers, use the multiply tool."
    ),
    instrument=InstrumentationSettings(tracer_provider=tracer_provider),
)

# 도구 정의
@agent.tool_plain
def multiply(a: int, b: int) -> int:
    """두 숫자를 곱합니다."""
    return a * b

# 에이전트에 도구 사용 요청
result = agent.run_sync("What is 7 multiplied by 8?")
print(result.output)
도구 호출의 트레이스 시각화
에이전트 호출과 도구 호출은 모두 Weave에서 트레이싱되므로, 애플리케이션의 전체 추론 과정과 실행 경로를 확인할 수 있습니다.

기본으로 모든 에이전트 계측하기

애플리케이션의 모든 PydanticAI 에이전트에 OTEL 트레이싱을 적용하려면 Agent.instrument_all() 메서드를 사용하세요. 이 메서드는 instrument 파라미터를 명시적으로 지정하지 않은 모든 에이전트에 대해 기본 InstrumentationSettings 인스턴스를 설정합니다.
from pydantic_ai import Agent
from pydantic_ai.models.instrumented import InstrumentationSettings

# 모든 에이전트에 대한 기본 계측 설정
Agent.instrument_all(InstrumentationSettings(tracer_provider=tracer_provider))

# 이제 새로운 에이전트는 기본적으로 이 계측을 사용합니다
agent1 = Agent("openai:gpt-4o")
agent2 = Agent("openai:gpt-4o", system_prompt="Be helpful.")

result = agent1.run_sync("What is the capital of France?")
print(result.output)
이 방법은 더 큰 규모의 애플리케이션에서 설정을 반복하지 않고 모든 에이전트에서 일관된 트레이싱을 수행하고자 할 때 유용합니다. 자세한 내용은 PydanticAI OTEL 문서를 참조하세요.

자세히 알아보기