File size: 4,372 Bytes
4a98f26 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
"""
Langfuse๋ฅผ ํ์ฉํ ๋ชจ๋ํฐ๋ง ๊ตฌํ (์ ํ์ )
"""
from typing import Dict, Any, Optional
import time
import os
from dotenv import load_dotenv
# ํ๊ฒฝ ๋ณ์ ๋ก๋
load_dotenv()
# ์ค์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
LANGFUSE_SECRET_KEY = os.getenv("LANGFUSE_SECRET_KEY", "")
LANGFUSE_PUBLIC_KEY = os.getenv("LANGFUSE_PUBLIC_KEY", "")
LANGFUSE_HOST = os.getenv("LANGFUSE_HOST", "https://cloud.langfuse.com")
class LangfuseMonitoring:
def __init__(self):
"""
Langfuse ๋ชจ๋ํฐ๋ง ์ด๊ธฐํ (์ ํ์ ๊ธฐ๋ฅ)
"""
self.enabled = False
print("๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ์ ์ด๊ธฐํํฉ๋๋ค...")
# Langfuse๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธ
try:
from langfuse import Langfuse
if LANGFUSE_PUBLIC_KEY and LANGFUSE_SECRET_KEY:
try:
self.langfuse = Langfuse(
public_key=LANGFUSE_PUBLIC_KEY,
secret_key=LANGFUSE_SECRET_KEY,
host=LANGFUSE_HOST,
)
self.enabled = True
print("Langfuse ๋ชจ๋ํฐ๋ง์ด ํ์ฑํ๋์์ต๋๋ค.")
except Exception as e:
print(f"Langfuse ์ด๊ธฐํ ์คํจ: {e}")
else:
print("Langfuse API ํค๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค. ๋ชจ๋ํฐ๋ง์ ๋นํ์ฑํ๋ฉ๋๋ค.")
except ImportError:
print("langfuse ํจํค์ง๊ฐ ์ค์น๋์ง ์์์ต๋๋ค. ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ์ด ๋นํ์ฑํ๋ฉ๋๋ค.")
print("pip install langfuse ๋ช
๋ น์ผ๋ก ์ค์นํ ์ ์์ต๋๋ค.")
def start_trace(self, name: str, user_id: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None) -> Any:
"""
์ ํธ๋ ์ด์ค ์์
Args:
name: ํธ๋ ์ด์ค ์ด๋ฆ
user_id: ์ฌ์ฉ์ ID (์ ํ์ )
metadata: ์ถ๊ฐ ๋ฉํ๋ฐ์ดํฐ (์ ํ์ )
Returns:
ํธ๋ ์ด์ค ๊ฐ์ฒด ๋๋ None
"""
if not self.enabled:
return None
try:
return self.langfuse.trace(
name=name,
user_id=user_id,
metadata=metadata or {},
)
except Exception as e:
print(f"ํธ๋ ์ด์ค ์์ฑ ์คํจ: {e}")
return None
def log_generation(self, trace: Any, name: str, prompt: str, response: str, metadata: Optional[Dict[str, Any]] = None) -> None:
"""
LLM ์์ฑ ๋ก๊น
Args:
trace: ํธ๋ ์ด์ค ๊ฐ์ฒด
name: ์์ฑ ์ด๋ฆ
prompt: ์
๋ ฅ ํ๋กฌํํธ
response: ๋ชจ๋ธ ์๋ต
metadata: ์ถ๊ฐ ๋ฉํ๋ฐ์ดํฐ (์ ํ์ )
"""
if not self.enabled or trace is None:
return
try:
trace.generation(
name=name,
model="user-defined-model",
prompt=prompt,
completion=response,
metadata=metadata or {},
)
except Exception as e:
print(f"์์ฑ ๋ก๊น
์คํจ: {e}")
def log_span(self, trace: Any, name: str, input_data: Any, output_data: Any, start_time: float, end_time: float) -> None:
"""
์ฒ๋ฆฌ ๊ตฌ๊ฐ ๋ก๊น
Args:
trace: ํธ๋ ์ด์ค ๊ฐ์ฒด
name: ๊ตฌ๊ฐ ์ด๋ฆ
input_data: ์
๋ ฅ ๋ฐ์ดํฐ
output_data: ์ถ๋ ฅ ๋ฐ์ดํฐ
start_time: ์์ ์๊ฐ
end_time: ์ข
๋ฃ ์๊ฐ
"""
if not self.enabled or trace is None:
return
try:
trace.span(
name=name,
start_time=start_time,
end_time=end_time,
input=input_data,
output=output_data,
metadata={"duration_ms": (end_time - start_time) * 1000},
)
except Exception as e:
print(f"๊ตฌ๊ฐ ๋ก๊น
์คํจ: {e}")
def end_trace(self, trace: Any) -> None:
"""
ํธ๋ ์ด์ค ์ข
๋ฃ
Args:
trace: ์ข
๋ฃํ ํธ๋ ์ด์ค ๊ฐ์ฒด
"""
if not self.enabled or trace is None:
return
try:
trace.update(status="success")
except Exception as e:
print(f"ํธ๋ ์ด์ค ์ข
๋ฃ ์คํจ: {e}") |