Skip to content

Commit 0a03a46

Browse files
authored
feat: added track_completed decorator to track completed functions (#1171)
adding analytics to track completed functions.This is to measure the errors that are happening with evals and testset generation
1 parent 1c62466 commit 0a03a46

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

src/ragas/_analytics.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,24 @@ def track(event_properties: BaseEvent):
111111
return
112112

113113
requests.post(USAGE_TRACKING_URL, json=payload, timeout=USAGE_REQUESTS_TIMEOUT_SEC)
114+
115+
116+
class IsCompleteEvent(BaseEvent):
117+
is_completed: bool = True # True if the event was completed, False otherwise
118+
119+
120+
@silent
121+
def track_was_completed(func: t.Callable[P, T]) -> t.Callable[P, T]: # pragma: no cover
122+
"""
123+
Track if the function was completed. This helps us understand failure cases and improve the user experience. Disable tracking by setting the environment variable RAGAS_DO_NOT_TRACK to True as usual.
124+
"""
125+
126+
@wraps(func)
127+
def wrapper(*args: P.args, **kwargs: P.kwargs) -> t.Any:
128+
track(IsCompleteEvent(event_type=func.__name__, is_completed=False))
129+
result = func(*args, **kwargs)
130+
track(IsCompleteEvent(event_type=func.__name__, is_completed=True))
131+
132+
return result
133+
134+
return wrapper

src/ragas/evaluation.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from langchain_core.embeddings import Embeddings as LangchainEmbeddings
1010
from langchain_core.language_models import BaseLanguageModel as LangchainLLM
1111

12-
from ragas._analytics import EvaluationEvent, track
12+
from ragas._analytics import EvaluationEvent, track, track_was_completed
1313
from ragas.callbacks import new_group
1414
from ragas.cost import TokenUsage
1515
from ragas.embeddings.base import (
@@ -46,6 +46,7 @@
4646
from ragas.cost import CostCallbackHandler, TokenUsageParser
4747

4848

49+
@track_was_completed
4950
def evaluate(
5051
dataset: Dataset,
5152
metrics: list[Metric] | None = None,

src/ragas/testset/generator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from langchain_openai.chat_models import ChatOpenAI
1111
from langchain_openai.embeddings import OpenAIEmbeddings
1212

13-
from ragas._analytics import TestsetGenerationEvent, track
13+
from ragas._analytics import TestsetGenerationEvent, track, track_was_completed
1414
from ragas.embeddings.base import (
1515
BaseRagasEmbeddings,
1616
LangchainEmbeddingsWrapper,
@@ -231,6 +231,7 @@ def init_evolution(self, evolution: Evolution) -> None:
231231
if evolution.evolution_filter is None:
232232
evolution.evolution_filter = EvolutionFilter(llm=self.critic_llm)
233233

234+
@track_was_completed
234235
def generate(
235236
self,
236237
test_size: int,

tests/unit/test_analytics.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from __future__ import annotations
2+
import typing as t
3+
import pytest
24

35

46
def test_debug_tracking_flag():
@@ -125,3 +127,32 @@ def test_testset_generation_tracking(monkeypatch):
125127
monkeypatch.setattr(analyticsmodule, "do_not_track", lambda: False)
126128
monkeypatch.setattr(analyticsmodule, "_usage_event_debugging", lambda: False)
127129
track(testset_event_payload)
130+
131+
132+
def test_was_completed(monkeypatch):
133+
from ragas._analytics import track_was_completed, IsCompleteEvent
134+
135+
event_properties_list: t.List[IsCompleteEvent] = []
136+
137+
def echo_track(event_properties):
138+
event_properties_list.append(event_properties)
139+
140+
monkeypatch.setattr("ragas._analytics.track", echo_track)
141+
142+
@track_was_completed
143+
def test(raise_error=True):
144+
if raise_error:
145+
raise ValueError("test")
146+
else:
147+
pass
148+
149+
with pytest.raises(ValueError):
150+
test(raise_error=True)
151+
152+
assert event_properties_list[-1].event_type == "test"
153+
assert event_properties_list[-1].is_completed is False
154+
155+
test(raise_error=False)
156+
157+
assert event_properties_list[-1].event_type == "test"
158+
assert event_properties_list[-1].is_completed is True

0 commit comments

Comments
 (0)