오늘은 오픈소스로 제공되는 LLM 평가 프레임워크인 opik을 처음 접하게 되어 간단한 설명과 활용방법에 대해 얘기해보겠습니다.
opik은 LLM 애플리케이션을 평가, 테스트 및 모니터링하기 위한 오픈소스 플랫폼입니다. 저는 보통 RAG 파이프라인을 구성한후 추적을 하는 용도로 Langsmith를 많이 사용했는데, opik에서 좀 더 직관적인 ui와 LLM 성능을 자동으로 평가하는 기능도 제공한다고해서 사용해보게 되었습니다.
로그인하고 볼 수 있는 메인 화면인데 상당히 깔끔한 구조입니다.
하단의 Quickstart guide를 보면 사용하는 프레임워크별로 LLM을 추적할 수 있게끔 샘플 코드가 작성되어있습니다.
from langchain_openai import ChatOpenAI
from common.state_graph import GraphState
from retrieve_docs import retrieve_docs, summary_docs, evaluate_docs
from langgraph.graph import StateGraph, START, END
from opik.integrations.langchain import OpikTracer
# 모델 설정
model = ChatOpenAI(model_name="gpt-4o-mini")
# 워크플로우 생성 및 노드 등록
workflow = StateGraph(GraphState)
workflow.add_node("retrieve_docs", retrieve_docs)
workflow.add_node("summary_docs", summary_docs)
workflow.add_node("evaluate_docs", evaluate_docs)
##### 엣지 정의 예시 #####
workflow.add_edge(START, "retrieve_docs")
workflow.add_edge("retrieve_docs", "summary_docs")
workflow.add_edge("summary_docs", "evaluate_docs")
# workflow.add_edge("evaluate_docs", "retrieve_docs")
workflow.add_edge("evaluate_docs", END)
app = workflow.compile()
tracer = OpikTracer(graph=app.get_graph(xray=True))
inputs = {"question": "안녕하세요"}
result = app.invoke(inputs, config={"callbacks": [tracer]})
print(result)
제가 사용하고 있는 프레임워크는 LangGraph여서 관련 샘플 코드를 참고해서 제 코드에 추가하였습니다.
OPIK_API_KEY=Md3KFb....
OPIK_WORKSPACE=retrieve_docs
추가로 저는 Opik api key와 project명에 대한 설정을 .env 파일에 작성해주고 코드를 실행하였습니다.
OPIK: Failed to process CreateSpansBatchMessage. Error: status_code: 400, body: {'code': 400, 'message': 'No such workspace: retrieve docs'}
OPIK: Failed to process CreateTraceBatchMessage. Error: status_code: 400, body: {'code': 400, 'message': 'No such workspace: retrieve docs'}
그런데 분명 가이드라인을 따라 코드를 작성했고, 별도의 커스텀도 하지않았는데 위 에러가 계속 발생하였습니다.
제가 원하는 프로젝트명도 분명 만들어둔 상태였는데 에러가 계속 발생해서 원인을 찾지 못하고 있었습니다. 그러다 문득 retrieve docs를 만들어둔 Projects가 workspace와 다른게 아닐까? 라는 의문이 들었고 OpikTracer 클래스 내부를 살펴보니 매개변수로 project_name 값을 선택적 Input으로 받는걸 확인했습니다. 그래서 .env의 OPIK_WORKSPACE를 지우고 새롭게 아래와 같이 코드를 수정하고 다시 실행해 보았습니다.
tracer = OpikTracer(graph=app.get_graph(xray=True), project_name="retrieve_docs")
코드 실행후, 화면을 확인해보니 성공적으로 추적이 되고 있는 모습을 볼 수 있었습니다.
추적한 내용을 살펴보면, 각 노드에서 소요되는 시간과, 노드별 In/Output 결과를 직관적으로 볼 수 있었습니다. 더 사용해봐야겠지만 상당히 편리하고 유용하다는 느낌을 받았습니다. 이제 평가에 대한 작업도 진행해보도록 하겠습니다.
참고자료
https://github.com/comet-ml/opik?tab=readme-ov-file
'LLMops' 카테고리의 다른 글
[LLMops] Opik으로 LLM 평가하기 (0) | 2025.03.28 |
---|