평가와 테스트셋 생성의 비용 및 사용량 추정하기

평가와 테스트셋 생성의 비용 및 사용량 추정하기 (How to estimate Cost and Usage of evaluations and testset generation)

LLM을 평가와 테스트셋 생성에 사용할 때 비용은 중요한 요소예요. Ragas가 이 부분을 도와주는 몇 가지 도구를 제공해요.

출처: 문서

본문

평가와 테스트셋 생성에 LLM을 사용할 때 비용은 중요한 요소가 돼요. Ragas는 이를 도와주는 몇 가지 도구를 제공해요.

TokenUsageParser 구현하기

기본적으로 Ragas는 evaluate()에서 토큰 사용량을 계산하지 않아요. langchain의 LLM이 항상 토큰 사용량 정보를 일관된 방식으로 반환하지 않기 때문이에요. 따라서 사용량 데이터를 얻으려면 TokenUsageParser를 구현해야 해요.

TokenUsageParser는 langchain 모델의 generate_prompt() 함수에서 LLMResult 또는 ChatResult를 파싱해서 Ragas가 기대하는 TokenUsage를 출력하는 함수예요.

예를 들어 우리가 정의한 파서를 사용해서 OpenAI를 파싱하는 예시를 볼게요.

from langchain_openai.chat_models import ChatOpenAI
from langchain_core.prompt_values import StringPromptValue

gpt4o = ChatOpenAI(model="gpt-4o")
p = StringPromptValue(text="hai there")
llm_result = gpt4o.generate_prompt([p])

# OpenAI용 파서를 임포트
from ragas.cost import get_token_usage_for_openai

get_token_usage_for_openai(llm_result)

출력

TokenUsage(input_tokens=9, output_tokens=9, model='')

자신만의 파서를 정의하거나, 정의된 파서가 있다면 임포트할 수 있어요. LLM 프로바이더용 파서를 제안하거나 직접 기여하고 싶다면 이슈를 확인해주세요 🙂.

평가를 위한 토큰 사용량

get_token_usage_for_openai 파서를 사용해서 평가의 토큰 사용량을 계산해볼게요.

from ragas import EvaluationDataset
from datasets import load_dataset

dataset = load_dataset("vibrantlabsai/amnesty_qa", "english_v3")

eval_dataset = EvaluationDataset.from_hf_dataset(dataset["eval"])

출력

Repo card metadata block was not found. Setting CardData to empty.

파서를 evaluate() 함수에 전달하면 비용이 계산되어 Result 객체에 반환돼요.

from ragas import evaluate
from ragas.metrics import LLMContextRecall

from ragas.cost import get_token_usage_for_openai

result = evaluate(
    eval_dataset,
    metrics=[LLMContextRecall()],
    llm=gpt4o,
    token_usage_parser=get_token_usage_for_openai,
)

출력

Evaluating:   0%|          | 0/20 [00:00<?, ?it/s]
result.total_tokens()

출력

TokenUsage(input_tokens=25097, output_tokens=3757, model='')

Result.total_cost() 함수에 토큰당 비용을 전달하면 각 실행의 비용을 계산할 수 있어요.

이 경우 GPT-4o는 입력 토큰 100만 개당 $5, 출력 토큰 100만 개당 $15예요.

result.total_cost(cost_per_input_token=5 / 1e6, cost_per_output_token=15 / 1e6)

출력

1.1692900000000002

테스트셋 생성을 위한 토큰 사용량

테스트셋 생성에도 동일한 파서를 사용할 수 있지만, generate() 함수에 token_usage_parser를 전달해야 해요. 현재로서는 생성 과정의 비용만 계산하고 transforms의 비용은 계산하지 않아요.

예를 들어 기존 KnowledgeGraph를 로드해서 테스트셋을 생성해볼게요. 테스트셋 생성 방법에 대해 더 알고 싶다면 테스트셋 생성을 확인해요.

from ragas.testset.graph import KnowledgeGraph

# 기존 KnowledgeGraph 로드
# KnowledgeGraph 파일 위치에 맞게 경로를 변경해야 해요
kg = KnowledgeGraph.load("../../../experiments/scratchpad_kg.json")
kg

출력

KnowledgeGraph(nodes: 47, relationships: 109)

LLM 선택 방법은 모델 커스터마이즈 가이드테스트셋 생성 가이드를 참고해요.

from ragas.testset import TestsetGenerator
from ragas.llms import llm_factory

tg = TestsetGenerator(llm=llm_factory(), knowledge_graph=kg)
# testset 생성
testset = tg.generate(testset_size=10, token_usage_parser=get_token_usage_for_openai)
# 생성 과정의 총 비용
testset.total_cost(cost_per_input_token=5 / 1e6, cost_per_output_token=15 / 1e6)

출력

0.20967000000000002

더 알아보기 (Learn more)