본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 07. 20:00

.NET에서 LLM 호출을 위한 로컬 네트워크 탭(평가 기능 포함)을 구축했습니다

요약

.NET 환경에서 LLM 호출을 실시간으로 모니터링하고 평가할 수 있는 로컬 도구인 Seerlens를 소개합니다. 프롬프트, 토큰 사용량, 비용, 지연 시간 및 도구 호출을 시각화하며 OpenTelemetry 표준을 준수합니다.

핵심 포인트

  • .NET 앱의 LLM 호출을 실시간 대시보드로 시각화
  • 토큰 기반 비용 계산 및 지연 시간 추적 기능 제공
  • OpenTelemetry GenAI 컨벤션 기반의 표준 준수
  • 품질 저하를 방지하기 위한 답변 평가(Evals) 기능 포함
  • 로컬 우선 방식의 SQLite 기반 데이터 관리

LLM (Large Language Model) 기반으로 무언가를 구축할 때, 여러분은 대부분 눈을 가린 채 비행하는 것과 같습니다. 프롬프트 (Prompt)를 보내고 답변을 받지만, 정작 흥미로운 부분들은 보이지 않습니다. 코드가 조립한 후 모델로 전달된 정확한 텍스트가 무엇인지, 그 호출 한 번에 비용이 얼마 들었는지, 시간이 얼마나 걸렸는지, 도구 (Tool)를 호출했는지, 그리고 프롬프트나 모델의 변경이 답변의 품질을 조용히 떨어뜨리지는 않았는지와 같은 것들 말입니다.

브라우저에서는 네트워크 (Network) 탭을 열면 됩니다. 하지만 AI 호출의 경우, 특히 .NET 환경에서는 그에 상응하는 좋은 로컬 도구가 없었습니다. 그래서 제가 직접 만들었습니다: Seerlens.

Seerlens demo

그것은 무엇인가

명령어 하나만 입력하면, 여러분의 앱이 수행하는 모든 LLM 호출을 실시간으로 보여주는 로컬 대시보드가 나타납니다:

dotnet tool install -g Seerlens
seerlens   # http://localhost:5005 에서 대시보드 실행

그 다음 앱이 이를 가리키도록 설정하면 됩니다. .NET에서는 이미 사용 중인 IChatClient를 래핑 (Wrap)하면 됩니다:

using Seerlens.Sdk;

SeerlensTrace.Configure("http://localhost:5005");
...

client를 통한 모든 호출이 표시됩니다: 프롬프트 (Prompt), 완성된 텍스트 (Completion), 토큰 (Tokens), 달러 단위의 비용, 지연 시간 (Latency), 그리고 모든 도구 호출 (Tool calls)까지 말이죠. 이 도구는 로컬 우선 (Local-first) 방식이며, SQLite를 사용하고, 회원가입도 클라우드도 필요 없습니다.

OpenTelemetry GenAI 컨벤션 (Conventions)을 기반으로 구축되었기 때문에 .NET 전용은 아닙니다 (모든 OTLP 앱에서 작동하며, Python과 JS를 위한 작은 SDK들도 있습니다). 하지만 의도적으로 .NET을 우선적으로 내세웠습니다.

왜 .NET인가

.NET AI 스택은 빠르게 성장했습니다: Microsoft.Extensions.AI, Semantic Kernel, Aspire 대시보드 등이 그것입니다. 이들은 호출을 추적 (Trace)하는 기능은 훌륭합니다. 하지만 답변이 정말 좋았는지 판단하거나, 토큰을 실행 가능한 예산으로 변환하는 기능은 없습니다. Python 세계에는 이를 위한 Langfuse, Phoenix, Promptfoo, Braintrust가 있습니다. .NET에는 기본적으로 아무것도 없었습니다. 그 간극이 바로 Seerlens가 존재하는 이유입니다.

제가 실제로 신경 쓰는 부분: 평가 (Evals)

트레이싱 (Tracing)이 입구라면, "API를 한 번 호출한 것"과 "AI를 실제로 운영하는 것"을 가르는 차이점은 품질 저하 (Quality Regressions)를 포착하는 것입니다. 작은 골든 세트 (Golden Set)를 작성하고, 이를 기준으로 답변을 점수화하며, 시간이 지남에 따라 변화하는 추세를 관찰하는 것입니다.

이를 통해 CI (지속적 통합)를 제어할 수 있습니다:

seerlens eval support --min 0.8 --baseline .seerlens/support.base

점수가 하한선 아래로 떨어지거나 저장된 베이스라인 (Baseline)에서 너무 많이 벗어나면 0이 아닌 종료 코드를 반환합니다. 따라서 답변 품질을 조용히 떨어뜨리는 모델 교체는 운영 환경에서의 갑작스러운 사고가 아니라, PR (Pull Request) 상의 빨간색 체크 표시로 나타나게 됩니다.

세 가지 스코어러 (Scorer)가 있습니다: keyword (오프라인 방식), llm-judge (루브릭 (Rubric)에 따른 채점 방식), 그리고 제가 만족하며 사용하는 agent 방식입니다. agent 방식은 모델에게 케이스의 도구 (Tools)를 제공하고 실제로 호출하게 한 뒤, 올바른 순서로 적절한 도구를 사용했는지 점수를 매깁니다. "답변은 맞았지만 도구 경로가 틀린 경우"는 더 낮은 점수로 나타납니다.

이것이 아닌 것

사용자에게 적합한지 판단할 수 있도록 솔직하게 말씀드리겠습니다. 이 도구는 단일 사용자용이며 로컬 (Local) 환경에서 작동합니다. 즉, 인증 (Auth)이나 공유 대시보드가 없습니다. SQLite는 개발 루프 (Dev loop)에는 적합하지만, 운영 환경의 대량 데이터 (Production firehose) 처리에는 적합하지 않습니다. 에이전트 스코어러는 미리 정의된 결과가 포함된 도구를 사용하며, 사용자의 실제 도구를 실행하지는 않습니다. 또한 비용 정보는 가격표 (직접 재정의 가능)가 업데이트된 최신 상태일 때만 유효합니다. 운영 트래픽을 모니터링하는 팀이라면 배포된 플랫폼을 사용하는 것이 올바른 선택입니다. 이것은 로컬 개발 루프를 위한 도구입니다.

사용해 보기

MIT 라이선스이며 GitHub, NuGet, PyPI, npm에서 이용 가능합니다.

이 프로젝트는 제가 공개적으로 만들어 온 사이드 프로젝트이므로, 부족한 점에 대한 진솔한 피드백을 진심으로 기다리고 있습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0