다음을 통해 공유


콘솔을 사용하여 원격 분석 데이터 검사

콘솔은 원격 분석 데이터를 검사하는 권장 방법은 아니지만 간단하고 빠르게 시작하는 방법입니다. 이 문서에서는 최소한의 커널 설정으로 검사를 위해 콘솔에 원격 분석 데이터를 출력하는 방법을 보여 줍니다.

내보내기

내보내기는 원격 분석 데이터를 대상으로 보내는 역할을 담당합니다. 여기에서 내보내기에 대해 자세히 알아보세요. 이 예제에서는 콘솔 내보내기를 사용하여 원격 분석 데이터를 콘솔에 출력합니다.

필수 조건

  • Azure OpenAI 채팅 완료 배포.
  • 운영 체제에 대한 최신 .Net SDK 입니다.

참고 항목

Java에는 시맨틱 커널 관찰 기능을 아직 사용할 수 없습니다.

설정

새 콘솔 애플리케이션 만들기

터미널에서 다음 명령을 실행하여 C#에서 새 콘솔 애플리케이션을 만듭니다.

dotnet new console -n TelemetryConsoleQuickstart

명령이 완료된 후 새로 만든 프로젝트 디렉터리로 이동합니다.

필요한 패키지를 설치합니다.

  • 의미 체계 커널

    dotnet add package Microsoft.SemanticKernel
    
  • OpenTelemetry 콘솔 내보내기

    dotnet add package OpenTelemetry.Exporter.Console
    

의미 체계 커널을 사용하여 간단한 애플리케이션 만들기

프로젝트 디렉터리에서 즐겨 찾는 편집기를 사용하여 Program.cs 파일을 엽니다. 의미 체계 커널을 사용하여 채팅 완료 모델에 프롬프트를 보내는 간단한 애플리케이션을 만들려고 합니다. 기존 콘텐츠를 다음 코드로 바꾸고 , deploymentNameendpoint< a0/>에 필요한 apiKey값을 입력합니다.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using OpenTelemetry;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace TelemetryConsoleQuickstart
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // Telemetry setup code goes here

            IKernelBuilder builder = Kernel.CreateBuilder();
            // builder.Services.AddSingleton(loggerFactory);
            builder.AddAzureOpenAIChatCompletion(
                deploymentName: "your-deployment-name",
                endpoint: "your-azure-openai-endpoint",
                apiKey: "your-azure-openai-api-key"
            );

            Kernel kernel = builder.Build();

            var answer = await kernel.InvokePromptAsync(
                "Why is the sky blue in one sentence?"
            );

            Console.WriteLine(answer);
        }
    }
}

원격 분석 추가

지금 콘솔 앱을 실행하는 경우 하늘이 파란색인 이유를 설명하는 문장이 표시되어야 합니다. 원격 분석을 통해 커널을 관찰하려면 주석을 // Telemetry setup code goes here 다음 코드로 바꿉다.

var resourceBuilder = ResourceBuilder
    .CreateDefault()
    .AddService("TelemetryConsoleQuickstart");

// Enable model diagnostics with sensitive data.
AppContext.SetSwitch("Microsoft.SemanticKernel.Experimental.GenAI.EnableOTelDiagnosticsSensitive", true);

using var traceProvider = Sdk.CreateTracerProviderBuilder()
    .SetResourceBuilder(resourceBuilder)
    .AddSource("Microsoft.SemanticKernel*")
    .AddConsoleExporter()
    .Build();

using var meterProvider = Sdk.CreateMeterProviderBuilder()
    .SetResourceBuilder(resourceBuilder)
    .AddMeter("Microsoft.SemanticKernel*")
    .AddConsoleExporter()
    .Build();

using var loggerFactory = LoggerFactory.Create(builder =>
{
    // Add OpenTelemetry as a logging provider
    builder.AddOpenTelemetry(options =>
    {
        options.SetResourceBuilder(resourceBuilder);
        options.AddConsoleExporter();
        // Format log messages. This is default to false.
        options.IncludeFormattedMessage = true;
        options.IncludeScopes = true;
    });
    builder.SetMinimumLevel(LogLevel.Information);
});

마지막으로 줄 // builder.Services.AddSingleton(loggerFactory); 의 주석 처리를 제거하여 로거 팩터리를 작성자에 추가합니다.

위의 코드 조각에서는 먼저 리소스 인스턴스를 빌드하기 위한 리소스 작성기를 만듭니다. 리소스는 원격 분석 데이터를 생성하는 엔터티를 나타냅니다. 리소스 에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 공급자에 대한 리소스 작성기는 선택 사항입니다. 제공되지 않으면 기본 특성이 있는 기본 리소스가 사용됩니다.

다음으로 중요한 데이터를 사용하여 진단을 켭니다. 의미 체계 커널에서 AI 서비스에 대한 진단을 사용하도록 설정할 수 있는 실험적 기능입니다. 이 기능을 켜면 전송된 프롬프트 및 중요한 데이터로 간주되는 AI 모델에서 받은 응답과 같은 추가 원격 분석 데이터가 표시됩니다. 원격 분석에 중요한 데이터를 포함하지 않으려면 다른 스위치 Microsoft.SemanticKernel.Experimental.GenAI.EnableOTelDiagnostics 를 사용하여 모델 이름, 작업 이름 및 토큰 사용 등과 같은 중요하지 않은 데이터로 진단을 사용하도록 설정할 수 있습니다.

그런 다음 추적 프로그램 공급자 작성기 및 미터 공급자 작성기를 만듭니다. 공급자는 원격 분석 데이터를 처리하고 내보내기자에게 파이핑할 책임이 있습니다. 원본을 구독하여 Microsoft.SemanticKernel* 의미 체계 커널 네임스페이스에서 원격 분석 데이터를 수신합니다. 추적 프로그램 공급자와 미터 공급자 모두에 콘솔 내보내기를 추가합니다. 콘솔 내보내기는 원격 분석 데이터를 콘솔로 보냅니다.

마지막으로 로거 팩터리를 만들고 콘솔에 로그 데이터를 보내는 로깅 공급자로 OpenTelemetry를 추가합니다. 최소 로그 수준을 로그 출력에 서식이 지정된 메시지 및 범위를 포함하도록 Information 설정합니다. 그런 다음 로거 팩터리는 작성기에서 추가됩니다.

중요합니다

공급자는 싱글톤이어야 하며 전체 애플리케이션 수명 동안 활성 상태여야 합니다. 애플리케이션이 종료될 때 공급자를 삭제해야 합니다.

새 Python 가상 환경 만들기

python -m venv telemetry-console-quickstart

가상 환경을 활성화합니다.

telemetry-console-quickstart\Scripts\activate

필요한 패키지를 설치합니다.

pip install semantic-kernel

의미 체계 커널을 사용하여 간단한 Python 스크립트 만들기

새 Python 스크립트를 만들고 즐겨 찾는 편집기를 사용하여 엽니다.

New-Item -Path telemetry_console_quickstart.py -ItemType file

의미 체계 커널을 사용하여 채팅 완료 모델에 프롬프트를 보내는 간단한 Python 스크립트를 만들려고 합니다. 기존 콘텐츠를 다음 코드로 바꾸고 , deployment_nameendpoint< a0/>에 필요한 api_key값을 입력합니다.

import asyncio
import logging

from opentelemetry._logs import set_logger_provider
from opentelemetry.metrics import set_meter_provider
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, ConsoleLogExporter
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import ConsoleMetricExporter, PeriodicExportingMetricReader
from opentelemetry.sdk.metrics.view import DropAggregation, View
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
from opentelemetry.semconv.resource import ResourceAttributes
from opentelemetry.trace import set_tracer_provider

from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion


# Telemetry setup code goes here

async def main():
    # Create a kernel and add a service
    kernel = Kernel()
    kernel.add_service(AzureChatCompletion(
        api_key="your-azure-openai-api-key",
        endpoint="your-azure-openai-endpoint",
        deployment_name="your-deployment-name"
    ))

    answer = await kernel.invoke_prompt("Why is the sky blue in one sentence?")
    print(answer)


if __name__ == "__main__":
    asyncio.run(main())

원격 분석 추가

환경 변수

기본적으로 커널은 AI 커넥터에 대한 범위를 내보내지 않습니다. 이러한 범위는 gen_ai 실험적 특성으로 간주되기 때문입니다. 이 기능을 사용하도록 설정하려면 환경 변수 SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS 를 설정하거나 SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE .로 true설정합니다.

중요합니다

프롬프트 및 완료는 중요한 데이터로 간주됩니다. 의미 체계 커널은 환경 변수를 설정SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE하지 않는 한 true AI 커넥터에서 이러한 데이터를 내보내지 않습니다. 설정 SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICStrue 모델 이름, 작업 이름 및 토큰 사용량과 같은 중요하지 않은 데이터만 내보낸다.

스크립트와 동일한 디렉터리에 명명된 .env 새 파일을 만들고 다음 콘텐츠를 추가합니다.

SEMANTICKERNEL_EXPERIMENTAL_GENAI_ENABLE_OTEL_DIAGNOSTICS_SENSITIVE=true

코드

지금 스크립트를 실행하면 하늘이 파란색인 이유를 설명하는 문장이 표시되어야 합니다. 원격 분석을 통해 커널을 관찰하려면 주석을 # Telemetry setup code goes here 다음 코드로 바꿉다.

# Create a resource to represent the service/sample
resource = Resource.create({ResourceAttributes.SERVICE_NAME: "telemetry-console-quickstart"})


def set_up_logging():
    exporter = ConsoleLogExporter()

    # Create and set a global logger provider for the application.
    logger_provider = LoggerProvider(resource=resource)
    # Log processors are initialized with an exporter which is responsible
    # for sending the telemetry data to a particular backend.
    logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter))
    # Sets the global default logger provider
    set_logger_provider(logger_provider)

    # Create a logging handler to write logging records, in OTLP format, to the exporter.
    handler = LoggingHandler()
    # Add filters to the handler to only process records from semantic_kernel.
    handler.addFilter(logging.Filter("semantic_kernel"))
    # Attach the handler to the root logger. `getLogger()` with no arguments returns the root logger.
    # Events from all child loggers will be processed by this handler.
    logger = logging.getLogger()
    logger.addHandler(handler)
    logger.setLevel(logging.INFO)


def set_up_tracing():
    exporter = ConsoleSpanExporter()

    # Initialize a trace provider for the application. This is a factory for creating tracers.
    tracer_provider = TracerProvider(resource=resource)
    # Span processors are initialized with an exporter which is responsible
    # for sending the telemetry data to a particular backend.
    tracer_provider.add_span_processor(BatchSpanProcessor(exporter))
    # Sets the global default tracer provider
    set_tracer_provider(tracer_provider)


def set_up_metrics():
    exporter = ConsoleMetricExporter()

    # Initialize a metric provider for the application. This is a factory for creating meters.
    meter_provider = MeterProvider(
        metric_readers=[PeriodicExportingMetricReader(exporter, export_interval_millis=5000)],
        resource=resource,
        views=[
            # Dropping all instrument names except for those starting with "semantic_kernel"
            View(instrument_name="*", aggregation=DropAggregation()),
            View(instrument_name="semantic_kernel*"),
        ],
    )
    # Sets the global default meter provider
    set_meter_provider(meter_provider)


# This must be done before any other telemetry calls
set_up_logging()
set_up_tracing()
set_up_metrics()

위의 코드 조각에서는 먼저 서비스를 나타내는 리소스를 만듭니다. 리소스는 원격 분석 데이터를 생성하는 엔터티를 나타냅니다. 리소스 에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 그런 다음 로깅, 추적 및 메트릭을 설정하는 세 가지 함수를 만듭니다. 각 함수는 각 원격 분석 데이터에 대한 공급자를 만들고 공급자에 콘솔 내보내기를 추가합니다.

마지막으로, 세 가지 함수를 호출하여 로깅, 추적 및 메트릭을 설정합니다. 이 작업은 다른 원격 분석 호출 전에 수행해야 합니다.

참고 항목

Java에는 시맨틱 커널 관찰 기능을 아직 사용할 수 없습니다.

달려라

다음 명령을 사용하여 콘솔 애플리케이션을 실행합니다.

dotnet run

다음 명령을 사용하여 Python 스크립트를 실행합니다.

python telemetry_console_quickstart.py

참고 항목

Java에는 시맨틱 커널 관찰 기능을 아직 사용할 수 없습니다.

원격 분석 데이터 검사

로그 레코드

콘솔 출력에 여러 로그 레코드가 표시됩니다. 다음과 유사하게 표시됩니다.

LogRecord.Timestamp:               2024-09-12T21:48:35.2295938Z
LogRecord.TraceId:                 159d3f07664838f6abdad7af6a892cfa
LogRecord.SpanId:                  ac79a006da8a6215
LogRecord.TraceFlags:              Recorded
LogRecord.CategoryName:            Microsoft.SemanticKernel.KernelFunction
LogRecord.Severity:                Info
LogRecord.SeverityText:            Information
LogRecord.FormattedMessage:        Function InvokePromptAsync_290eb9bece084b00aea46b569174feae invoking.
LogRecord.Body:                    Function {FunctionName} invoking.
LogRecord.Attributes (Key:Value):
    FunctionName: InvokePromptAsync_290eb9bece084b00aea46b569174feae
    OriginalFormat (a.k.a Body): Function {FunctionName} invoking.

Resource associated with LogRecord:
service.name: TelemetryConsoleQuickstart
service.instance.id: a637dfc9-0e83-4435-9534-fb89902e64f8
telemetry.sdk.name: opentelemetry
telemetry.sdk.language: dotnet
telemetry.sdk.version: 1.9.0

각 로그 레코드에는 다음 두 부분이 있습니다.

  • 로그 레코드 자체: 로그 레코드가 생성된 타임스탬프 및 네임스페이스, 로그 레코드의 심각도 및 본문 및 로그 레코드와 연결된 모든 특성을 포함합니다.
  • 로그 레코드와 연결된 리소스: 로그 레코드를 생성하는 데 사용되는 서비스, 인스턴스 및 SDK에 대한 정보를 포함합니다.

활동

참고 항목

.Net의 활동은 OpenTelemetry의 범위와 유사합니다. 애플리케이션의 작업 단위를 나타내는 데 사용됩니다.

콘솔 출력에 여러 활동이 표시됩니다. 다음과 유사하게 표시됩니다.

Activity.TraceId:            159d3f07664838f6abdad7af6a892cfa
Activity.SpanId:             8c7c79bc1036eab3
Activity.TraceFlags:         Recorded
Activity.ParentSpanId:       ac79a006da8a6215
Activity.ActivitySourceName: Microsoft.SemanticKernel.Diagnostics
Activity.DisplayName:        chat.completions gpt-4o
Activity.Kind:               Client
Activity.StartTime:          2024-09-12T21:48:35.5717463Z
Activity.Duration:           00:00:02.3992014
Activity.Tags:
    gen_ai.operation.name: chat.completions
    gen_ai.system: openai
    gen_ai.request.model: gpt-4o
    gen_ai.response.prompt_tokens: 16
    gen_ai.response.completion_tokens: 29
    gen_ai.response.finish_reason: Stop
    gen_ai.response.id: chatcmpl-A6lxz14rKuQpQibmiCpzmye6z9rxC
Activity.Events:
    gen_ai.content.prompt [9/12/2024 9:48:35 PM +00:00]
        gen_ai.prompt: [{"role": "user", "content": "Why is the sky blue in one sentence?"}]
    gen_ai.content.completion [9/12/2024 9:48:37 PM +00:00]
        gen_ai.completion: [{"role": "Assistant", "content": "The sky appears blue because shorter blue wavelengths of sunlight are scattered in all directions by the gases and particles in the Earth\u0027s atmosphere more than other colors."}]
Resource associated with Activity:
    service.name: TelemetryConsoleQuickstart
    service.instance.id: a637dfc9-0e83-4435-9534-fb89902e64f8
    telemetry.sdk.name: opentelemetry
    telemetry.sdk.language: dotnet
    telemetry.sdk.version: 1.9.0

각 활동에는 다음 두 부분이 있습니다.

  • 작업 자체: APM 도구가 추적을 빌드하는 데 사용하는 범위 ID 및 부모 범위 ID, 활동 기간 및 활동과 관련된 태그 및 이벤트를 포함합니다.
  • 활동과 연결된 리소스: 활동을 생성하는 데 사용되는 서비스, 인스턴스 및 SDK에 대한 정보를 포함합니다.

중요합니다

주의해야 할 특성은 .로 gen_ai시작하는 특성입니다. 이러한 특성은 GenAI 의미 체계 규칙에 지정된 특성입니다.

메트릭

콘솔 출력에 여러 메트릭 레코드가 표시됩니다. 다음과 유사하게 표시됩니다.

Metric Name: semantic_kernel.connectors.openai.tokens.prompt, Number of prompt tokens used, Unit: {token}, Meter: Microsoft.SemanticKernel.Connectors.OpenAI
(2024-09-12T21:48:37.9531072Z, 2024-09-12T21:48:38.0966737Z] LongSum
Value: 16

여기에서 이름, 설명, 단위, 시간 범위, 형식, 메트릭 값 및 메트릭이 속한 미터를 볼 수 있습니다.

참고 항목

위의 메트릭은 카운터 메트릭입니다. 메트릭 형식의 전체 목록은 여기를 참조 하세요. 메트릭 유형에 따라 출력이 달라질 수 있습니다.

로그

콘솔 출력에 여러 로그 레코드가 표시됩니다. 다음과 유사하게 표시됩니다.

{
    "body": "Function SyVCcBjaULqEhItH invoking.",
    "severity_number": "<SeverityNumber.INFO: 9>",
    "severity_text": "INFO",
    "attributes": {
        "code.filepath": "C:\\tmp\\telemetry-console-quickstart\\Lib\\site-packages\\semantic_kernel\\functions\\kernel_function_log_messages.py",
        "code.function": "log_function_invoking",
        "code.lineno": 19
    },
    "dropped_attributes": 0,
    "timestamp": "2024-09-13T17:55:45.504983Z",
    "observed_timestamp": "2024-09-13T17:55:45.504983Z",
    "trace_id": "0xe23e2c10785ea61ffc9f28be19482a80",
    "span_id": "0x686bd592e27661d7",
    "trace_flags": 1,
    "resource": {
        "attributes": {
            "telemetry.sdk.language": "python",
            "telemetry.sdk.name": "opentelemetry",
            "telemetry.sdk.version": "1.27.0",
            "service.name": "telemetry-console-quickstart"
        },
        "schema_url": ""
    }
}

범위

콘솔 출력에 여러 범위가 표시됩니다. 다음과 유사하게 표시됩니다.

{
    "name": "chat.completions gpt-4o",
    "context": {
        "trace_id": "0xe23e2c10785ea61ffc9f28be19482a80",
        "span_id": "0x8b20e9655610c3c9",
        "trace_state": "[]"
    },
    "kind": "SpanKind.INTERNAL",
    "parent_id": "0x686bd592e27661d7",
    "start_time": "2024-09-13T17:55:45.515198Z",
    "end_time": "2024-09-13T17:55:46.469471Z",
    "status": {
        "status_code": "UNSET"
    },
    "attributes": {
        "gen_ai.operation.name": "chat.completions",
        "gen_ai.system": "openai",
        "gen_ai.request.model": "gpt-4o",
        "gen_ai.response.id": "chatcmpl-A74oD7WGDjawnZ44SJZrj9fKrEv1B",
        "gen_ai.response.finish_reason": "FinishReason.STOP",
        "gen_ai.response.prompt_tokens": 16,
        "gen_ai.response.completion_tokens": 29
    },
    "events": [
        {
            "name": "gen_ai.content.prompt",
            "timestamp": "2024-09-13T17:55:45.515198Z",
            "attributes": {
                "gen_ai.prompt": "[{\"role\": \"user\", \"content\": \"Why is the sky blue in one sentence?\"}]"
            }
        },
        {
            "name": "gen_ai.content.completion",
            "timestamp": "2024-09-13T17:55:46.469471Z",
            "attributes": {
                "gen_ai.completion": "[{\"role\": \"assistant\", \"content\": \"The sky appears blue because shorter blue wavelengths of sunlight are scattered in all directions by the molecules and particles in the atmosphere more effectively than other colors.\"}]"
            }
        }
    ],
    "links": [],
    "resource": {
        "attributes": {
            "telemetry.sdk.language": "python",
            "telemetry.sdk.name": "opentelemetry",
            "telemetry.sdk.version": "1.27.0",
            "service.name": "telemetry-console-quickstart"
        },
        "schema_url": ""
    }
}

로 시작하는 특성에 주의하세요 gen_ai. 이러한 특성은 GenAI 의미 체계 규칙에 지정된 특성입니다. 전송된 요청 및 AI 모델에서 받은 응답에 대한 유용한 정보를 제공합니다.

메트릭

콘솔 출력에 여러 메트릭 레코드가 표시됩니다. 다음과 유사하게 표시됩니다.

{
    "resource_metrics": [
        {
            "resource": {
                "attributes": {
                    "telemetry.sdk.language": "python",
                    "telemetry.sdk.name": "opentelemetry",
                    "telemetry.sdk.version": "1.27.0",
                    "service.name": "telemetry-console-quickstart"
                },
                "schema_url": ""
            },
            "scope_metrics": [
                {
                    "scope": {
                        "name": "semantic_kernel.functions.kernel_function",
                        "version": null,
                        "schema_url": "",
                        "attributes": null
                    },
                    "metrics": [
                        {
                            "name": "semantic_kernel.function.invocation.duration",
                            "description": "Measures the duration of a function's execution",
                            "unit": "s",
                            "data": {
                                "data_points": [
                                    {
                                        "attributes": {
                                            "semantic_kernel.function.name": "SyVCcBjaULqEhItH"
                                        },
                                        "start_time_unix_nano": 1726250146470468300,
                                        "time_unix_nano": 1726250146478526600,
                                        "count": 1,
                                        "sum": 0.9650602999900002,
                                        "bucket_counts": [
                                            0,
                                            1,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0,
                                            0
                                        ],
                                        "explicit_bounds": [
                                            0.0,
                                            5.0,
                                            10.0,
                                            25.0,
                                            50.0,
                                            75.0,
                                            100.0,
                                            250.0,
                                            500.0,
                                            750.0,
                                            1000.0,
                                            2500.0,
                                            5000.0,
                                            7500.0,
                                            10000.0
                                        ],
                                        "min": 0.9650602999900002,
                                        "max": 0.9650602999900002
                                    }
                                ],
                                "aggregation_temporality": 2
                            }
                        }
                    ],
                    "schema_url": ""
                }
            ],
            "schema_url": ""
        }
    ]
}

위에 표시된 측정값은 히스토그램 메트릭입니다. 메트릭 형식의 전체 목록은 여기를 참조 하세요.

참고 항목

Java에는 시맨틱 커널 관찰 기능을 아직 사용할 수 없습니다.

다음 단계

원격 분석 데이터를 콘솔에 성공적으로 출력했으므로 APM 도구를 사용하여 원격 분석 데이터를 시각화하고 분석하는 방법에 대해 자세히 알아볼 수 있습니다.