|
""" |
|
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("๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ์ ์ด๊ธฐํํฉ๋๋ค...") |
|
|
|
|
|
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}") |