RAG 시스템 전 과정에서 관찰성 (Observability), 평가 (Evaluation), 프롬프트 관리 (Prompt Management)를 체계적으로 운영하기 위한 가이드입니다. Langfuse 와 LangSmith 두 가지 도구를 비교하며 세팅 체크리스트를 제공합니다.
공통 세팅 체크리스트
모든 LLMOps 도구에 공통으로 적용되는 기본 세팅입니다.
Trace 메타데이터: env, tenant/team, user/session, usecase, language
Retrieval 스팬 기록: top_k, filters, returned_doc_ids, rerank_on/off
Generation 스팬 기록: model, temperature, prompt_version, input_tokens/output_tokens, latency
PII/민감정보 마스킹 규칙 (로그/트레이스 저장 전)
LangSmith 세팅 가이드
LangChain 생태계와 긴밀하게 통합되며, Dataset 기반 반복 평가 와 Playground/Hub 기반 프롬프트 관리 가 강점입니다.
Tracing
Evaluation
Prompt 관리
트레이싱 설정 LangChain/LangGraph 기반이면 환경변수만 설정하면 자동 추적됩니다. import os
# 방법 1: LangChain 네이티브 (가장 간단)
os.environ[ "LANGCHAIN_TRACING_V2" ] = "true"
os.environ[ "LANGCHAIN_API_KEY" ] = "your-api-key"
os.environ[ "LANGCHAIN_PROJECT" ] = "rag-production"
# 방법 2: LangSmith SDK (프레임워크 무관)
os.environ[ "LANGSMITH_TRACING" ] = "true"
os.environ[ "LANGSMITH_API_KEY" ] = "your-api-key"
os.environ[ "LANGSMITH_PROJECT" ] = "rag-production"
확인할 수 있는 것 :
각 노드(검색, 생성)의 입출력
검색된 문서 내용과 유사도 점수
LLM 호출의 프롬프트와 응답
실행 시간과 토큰 사용량
평가 설정 Dataset을 만들어 반복 평가하는 것이 핵심입니다. from langsmith import Client
client = Client()
# Dataset 생성
dataset = client.create_dataset( "rag-eval-v1" )
# 평가 데이터 추가
client.create_examples(
inputs = [
{ "question" : "RAG에서 인덱싱이란?" },
{ "question" : "하이브리드 검색의 장점은?" },
],
outputs = [
{ "answer" : "문서를 청크로 분할하고 벡터화하여 저장하는 과정" },
{ "answer" : "Dense와 Sparse 검색의 장점을 결합한 방식" },
],
dataset_id = dataset.id,
)
Playground에서 Dataset 대상으로 평가/실험 실행 (코드 없이도 가능)
평가 결과 비교 및 회귀 테스트 자동화
프롬프트 관리 UI/SDK로 프롬프트를 생성하고 관리합니다. from langsmith import Client
client = Client()
# 프롬프트 생성
client.push_prompt(
"rag-qa-prompt" ,
object = {
"template" : "컨텍스트: {context} \n 질문: {question} \n 답변:" ,
"input_variables" : [ "context" , "question" ],
},
)
# 프롬프트 가져오기 (최신 버전)
prompt = client.pull_prompt( "rag-qa-prompt" )
Playground에서 프롬프트 수정 → “Commit”으로 버전 생성
Programmatic 관리 (langsmith 패키지)
버전별 성능 비교 가능
Langfuse 세팅 가이드
오픈소스 LLM 관찰성 플랫폼으로, 셀프호스팅 가능 하며 환경별 라벨 배포 와 LLM-as-a-Judge 평가가 강점입니다.
Tracing
Evaluation
Prompt 관리
트레이싱 설정 LangChain과도 연동 가능하며, 네이티브 SDK도 제공합니다. # 방법 1: LangChain 콜백
from langfuse import Langfuse
from langfuse.langchain import CallbackHandler
# Langfuse 클라이언트 초기화 (앱 시작 시 1회)
Langfuse(
public_key = "your-public-key" ,
secret_key = "your-secret-key" ,
host = "https://cloud.langfuse.com" , # 또는 셀프호스팅 URL
)
# 콜백 핸들러 생성
langfuse_handler = CallbackHandler()
# 체인 실행 시 콜백 전달
result = chain.invoke(
"질문" ,
config = { "callbacks" : [langfuse_handler]},
)
# 방법 2: 데코레이터 (네이티브)
from langfuse.decorators import observe
@observe ()
def rag_pipeline ( question : str ):
docs = retriever.invoke(question)
answer = llm.invoke(format_prompt(docs, question))
return answer
강점 : Trace/Span 구조로 각 스텝의 지연/비용/에러를 세밀하게 추적평가 설정 LLM-as-a-Judge와 Human Annotation Queue를 조합합니다. from langfuse import get_client
langfuse = get_client()
# Dataset 생성
dataset = langfuse.create_dataset( "rag-eval-v1" )
# 평가 데이터 추가
langfuse.create_dataset_item(
dataset_name = "rag-eval-v1" ,
input = { "question" : "RAG에서 인덱싱이란?" },
expected_output = { "answer" : "문서를 청크로 분할하고 벡터화하여 저장하는 과정" },
)
LLM-as-a-Judge : 루브릭 기반 자동 평가 (Trace/Experiment에도 적용)
Annotation Queue : 휴먼 라벨링 워크플로우
Dataset/Experiment 기반 회귀 평가
프롬프트 관리 UI에서 생성/수정하고 버전/라벨로 배포합니다. from langfuse import get_client
langfuse = get_client()
# 프롬프트 가져오기 (라벨 기반)
prompt = langfuse.get_prompt( "rag-qa-prompt" , label = "production" )
# 프롬프트 적용
compiled = prompt.compile( context = context, question = question)
버전/라벨 배포 : staging에서 검증 후 prod 라벨 부여
Config 관리 : 모델 파라미터/스키마도 프롬프트와 함께 버전 관리
환경별 라벨 : 코드 수정 없이 배포 버전 스위칭
도구 비교 요약
기능 LangSmith Langfuse 트레이싱 환경변수 설정만으로 자동 콜백/데코레이터 방식 (v3 싱글톤 패턴) LangChain 통합 네이티브 (가장 간편) 콜백 핸들러로 통합 평가 Dataset + Playground 실험 Dataset + LLM-as-Judge + Annotation Queue 프롬프트 관리 Hub/Playground/커밋 UI + 버전/라벨/환경별 배포 셀프호스팅 불가 (SaaS) 가능 (Docker/K8s)가격 무료 티어 + 유료 오픈소스 무료 + 클라우드 유료 추천 시나리오 LangChain 생태계 올인 셀프호스팅/운영 유연성 필요
두 도구 모두 우수하며, 팀의 기술 스택과 운영 요구사항에 맞게 선택합니다. LangChain/LangGraph를 주로 사용한다면 LangSmith, 셀프호스팅이 필요하거나 프레임워크에 구애받지 않으려면 Langfuse가 적합합니다.
참고 자료