Documentation Index
Fetch the complete documentation index at: https://wb-21fd5541-john-wbdocs-2044-rename-serverless-products.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
이 노트북은 대화형 노트북입니다. 로컬에서 실행하거나 아래 링크를 사용할 수 있습니다:
GenAI 도구 생태계는 빠르게 발전하고 있으며, 새로운 프레임워크, 도구, 애플리케이션이 끊임없이 등장하고 있습니다. Weave는 GenAI 모니터링 및 평가 요구 사항을 모두 충족하는 원스톱 솔루션을 지향합니다. 또한 이는 경우에 따라 기존 플랫폼과 통합하거나, 프로젝트 또는 조직의 구체적인 요구 사항에 맞게 Weave를 확장해야 할 수 있음을 의미합니다.
이 쿡북에서는 Weave의 강력한 API와 함수를 활용해, Weave의 Traces 뷰를 확장하는 프로덕션 모니터링용 맞춤형 대시보드를 만드는 방법을 보여드립니다. 중점적으로 다룰 내용은 다음과 같습니다.
- Weave에서 트레이스, 비용, 피드백 및 기타 메트릭 가져오기
- 사용자 피드백과 비용 분포를 위한 집계 뷰 만들기
- 시간 경과에 따른 토큰 사용량 및 지연 시간 시각화 만들기
streamlit을 설치하고 이 프로덕션 대시보드 스크립트를 실행하면, 자신의 Weave 프로젝트에서 대시보드를 사용해 볼 수 있습니다!
이 튜토리얼을 진행하려면 다음 패키지만 설치하면 됩니다:
!pip install streamlit pandas plotly weave
2.1 Weave 클라이언트 초기화 및 비용 정의
먼저, Weave 클라이언트를 초기화하고 각 모델의 비용을 추가하는 함수를 정의하겠습니다.
- 여러 일반적인 모델의 기본 비용은 이미 포함되어 있지만, 사용자 정의 비용과 맞춤형 모델도 쉽게 추가할 수 있습니다. 아래에서는 몇 가지 모델에 사용자 정의 비용을 추가하고, 나머지에는 기본 비용을 사용하는 방법을 보여드리겠습니다.
- 비용은 Weave의 각 call / calls에 대해 추적된 토큰을 기준으로 계산됩니다. 많은 LLM 벤더 라이브러리에서는 토큰 사용량을 자동으로 추적하지만, 어떤 call / calls이든 사용자 정의 토큰 수를 반환하도록 할 수도 있습니다. 맞춤형 모델의 토큰 수와 비용 계산을 정의하는 방법은 이 쿡북을 참조하세요 - custom cost cookbook.
PROJECT_NAME = "wandb-smle/weave-cookboook-demo"
python
import weave
MODEL_NAMES = [
# 모델 이름, 프롬프트 비용, 완성 비용
("gpt-4o-2024-05-13", 0.03, 0.06),
("gpt-4o-mini-2024-07-18", 0.03, 0.06),
("gemini/gemini-1.5-flash", 0.00025, 0.0005),
("gpt-4o-mini", 0.03, 0.06),
("gpt-4-turbo", 0.03, 0.06),
("claude-3-haiku-20240307", 0.01, 0.03),
("gpt-4o", 0.03, 0.06),
]
def init_weave_client(project_name):
try:
client = weave.init(project_name)
for model, prompt_cost, completion_cost in MODEL_NAMES:
client.add_cost(
llm_id=model,
prompt_token_cost=prompt_cost,
completion_token_cost=completion_cost,
)
except Exception as e:
print(f"프로젝트 '{project_name}'의 Weave 클라이언트 초기화 실패: {e}")
return None
else:
return client
client = init_weave_client(PROJECT_NAME)
2.2 Weave에서 calls 데이터 가져오기
Weave에서 call / calls 데이터를 가져오는 방법은 두 가지입니다:
- call / calls별로 데이터 가져오기
- 고수준 API 사용하기
2.2.1 call / calls별로 데이터 가져오기
Weave에서 데이터에 액세스하는 첫 번째 방법은 필터링된 calls 목록을 조회한 다음, 원하는 데이터를 call / calls별로 추출하는 것입니다. 이를 위해 calls_query_stream API를 사용하여 Weave에서 calls 데이터를 가져올 수 있습니다.
calls_query_stream API: 이 API를 사용하면 Weave에서 calls 데이터를 가져올 수 있습니다.
filter dictionary: 이 dictionary에는 calls 데이터를 가져오기 위한 필터 매개변수가 포함됩니다. 자세한 내용은 여기를 참조하세요.
expand_columns list: 이 list에는 calls 데이터에서 확장할 column이 포함됩니다.
sort_by list: 이 list에는 calls 데이터의 정렬 매개변수가 포함됩니다.
include_costs boolean: 이 boolean은 calls 데이터에 비용을 포함할지 여부를 나타냅니다.
include_feedback boolean: 이 boolean은 calls 데이터에 피드백을 포함할지 여부를 나타냅니다.
import itertools
from datetime import datetime, timedelta
import pandas as pd
def fetch_calls(client, project_id, start_time, trace_roots_only, limit):
filter_params = {
"project_id": project_id,
"filter": {"started_at": start_time, "trace_roots_only": trace_roots_only},
"expand_columns": ["inputs.example", "inputs.model"],
"sort_by": [{"field": "started_at", "direction": "desc"}],
"include_costs": True,
"include_feedback": True,
}
try:
calls_stream = client.server.calls_query_stream(filter_params)
calls = list(
itertools.islice(calls_stream, limit)
) # calls가 너무 많을 경우 가져올 수를 제한
print(f"Fetched {len(calls)} calls.")
except Exception as e:
print(f"Error fetching calls: {e}")
return []
else:
return calls
calls = fetch_calls(client, PROJECT_NAME, datetime.now() - timedelta(days=1), True, 100)
python
# 원시 데이터는 Call 객체의 목록
pd.DataFrame([call.dict() for call in calls]).head(3)
Weave의 반환값을 사용하면 calls를 매우 쉽게 처리할 수 있습니다. 관련 정보를 추출해 딕셔너리 목록에 저장한 다음, 이 목록을 pandas 데이터프레임으로 변환해 반환합니다.
import json
from datetime import datetime
import pandas as pd
def process_calls(calls):
records = []
for call in calls:
feedback = call.summary.get("weave", {}).get("feedback", [])
thumbs_up = sum(
1
for item in feedback
if isinstance(item, dict) and item.get("payload", {}).get("emoji") == "👍"
)
thumbs_down = sum(
1
for item in feedback
if isinstance(item, dict) and item.get("payload", {}).get("emoji") == "👎"
)
latency = call.summary.get("weave", {}).get("latency_ms", 0)
records.append(
{
"Call ID": call.id,
"Trace ID": call.trace_id, # 트레이스 조회에 사용할 수 있는 고유 ID입니다
"Display Name": call.display_name, # UI 또는 프로그래밍 방식으로 설정할 수 있는 선택 이름입니다
"Latency (ms)": latency,
"Thumbs Up": thumbs_up,
"Thumbs Down": thumbs_down,
"Started At": pd.to_datetime(getattr(call, "started_at", datetime.min)),
"Inputs": json.dumps(call.inputs, default=str),
"Outputs": json.dumps(call.output, default=str),
}
)
return pd.DataFrame(records)
python
df_calls = process_calls(calls)
df_calls.head(3)
각 call / calls를 일일이 살펴보는 대신, Weave는 모델 비용, 피드백, 기타 메트릭에 직접 액세스할 수 있는 고수준 API도 제공합니다.
예를 들어 비용의 경우, 프로젝트에서 사용 중인 모든 LLM의 비용을 가져오기 위해 query_costs API를 사용하겠습니다:
# 비용 API를 사용하여 비용 조회
costs = client.query_costs()
df_costs = pd.DataFrame([cost.dict() for cost in costs])
df_costs["total_cost"] = (
df_costs["prompt_token_cost"] + df_costs["completion_token_cost"]
)
# 고유한 llm_id마다 첫 번째 행만 표시
df_costs
다음으로 Plotly를 사용해 시각화를 생성할 수 있습니다. 가장 기본적인 대시보드이지만, 원하는 대로 사용자 지정할 수 있습니다! 더 복잡한 예시는 여기에서 Streamlit 예제를 확인하세요.
import plotly.express as px
import plotly.graph_objects as go
def plot_feedback_pie_chart(thumbs_up, thumbs_down):
fig = go.Figure(
data=[
go.Pie(
labels=["Thumbs Up", "Thumbs Down"],
values=[thumbs_up, thumbs_down],
marker={"colors": ["#66b3ff", "#ff9999"]},
hole=0.3,
)
]
)
fig.update_traces(textinfo="percent+label", hoverinfo="label+percent")
fig.update_layout(showlegend=False, title="Feedback Summary")
return fig
def plot_model_cost_distribution(df):
fig = px.bar(
df,
x="llm_id",
y="total_cost",
color="llm_id",
title="Cost Distribution by Model",
)
fig.update_layout(xaxis_title="Model", yaxis_title="Cost (USD)")
return fig
# 모든 플롯의 소스 코드를 참조하세요
python
plot_feedback_pie_chart(df_calls["Thumbs Up"].sum(), df_calls["Thumbs Down"].sum())
python
plot_model_cost_distribution(df_costs)
이 쿡북에서는 Weave의 API와 함수를 사용해 맞춤형 프로덕션 모니터링 대시보드를 만드는 방법을 살펴보았습니다. 현재 Weave는 데이터를 쉽게 입력하고, 맞춤형 프로세스에 활용할 수 있도록 데이터를 추출하는 빠른 인테그레이션에 중점을 두고 있습니다.
- 데이터 입력:
- @weave-op() 데코레이터를 사용한 프레임워크 독립적 트레이싱과 CSV에서 call / calls를 임포트하는 기능(관련 임포트 쿡북 참조)
- 다양한 프로그래밍 프레임워크와 언어에서 Weave에 로그를 기록할 수 있는 서비스 API 엔드포인트. 자세한 내용은 여기를 참조하세요.
- 데이터 출력:
- CSV, TSV, JSONL, JSON 형식으로 데이터를 쉽게 다운로드할 수 있습니다. 자세한 내용은 여기를 참조하세요.
- 데이터에 프로그래밍 방식으로 접근해 쉽게 내보낼 수 있습니다. 이 쿡북에서 설명한 대로 내보내기 패널의 “Use Python” 섹션을 참조하세요. 자세한 내용은 여기를 참조하세요.
이 맞춤형 대시보드는 Weave의 기본 Traces 뷰를 확장하여 프로덕션 환경의 LLM 애플리케이션을 목적에 맞게 모니터링할 수 있게 해줍니다. 더 복잡한 대시보드를 보고 싶다면, 자신의 Weave 프로젝트 URL을 추가할 수 있는 Streamlit 예제를 이 저장소에서 확인해 보세요.