작업 비용과 토큰 사용량 이해하기

작업 비용과 토큰 사용량 이해하기

LLM으로 평가(evaluation)와 테스트 셋 생성을 하다 보면 비용이 핵심 고려사항이 돼요. Ragas는 여기에 도움을 주는 몇 가지 도구를 제공하고 있어요. 이번에는 토큰 사용량을 어떻게 측정하고, 이를 근거로 비용을 계산하는지 살펴볼게요.

출처: 문서

본문

TokenUsageParser 이해하기

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

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

예를 들어, 우리가 정의한 parser를 이용해 OpenAI를 파싱하는 경우를 볼게요.

import os

os.environ["OPENAI_API_KEY"] = "your-api-key"

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])

# lets import a parser for OpenAI
from ragas.cost import get_token_usage_for_openai

get_token_usage_for_openai(llm_result)
/opt/homebrew/Caskroom/miniforge/base/envs/ragas/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm
TokenUsage(input_tokens=9, output_tokens=9, model='')

직접 parser를 정의하거나 이미 정의된 parser를 import해서 쓸 수도 있어요. LLM 프로바이더용 parser를 제안하고 싶거나 직접 기여하고 싶다면 이 이슈를 확인해 보세요 🙂.

평가에 사용하는 방법도 보여줄게요. 여기의 get started 예시를 이용했어요.

from datasets import load_dataset
from ragas import EvaluationDataset
from ragas.metrics._aspect_critic import AspectCriticWithReference

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


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

metric = AspectCriticWithReference(
    name="answer_correctness",
    definition="is the response correct compared to reference",
)
Repo card metadata block was not found. Setting CardData to empty.
from ragas import evaluate
from ragas.cost import get_token_usage_for_openai

results = evaluate(
    eval_dataset[:5],
    metrics=[metric],
    llm=gpt4o,
    token_usage_parser=get_token_usage_for_openai,
)
Evaluating: 100%|██████████| 5/5 [00:01<00:00,  2.81it/s]
results.total_tokens()
TokenUsage(input_tokens=5463, output_tokens=355, model='')

각 실행의 비용을 계산하려면, 토큰당 비용을 Result.total_cost() 함수에 넘겨주면 돼요.

이 경우 GPT-4o는 입력 토큰 1M 당 $5, 출력 토큰 1M 당 $15 가 들어요.

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

더 알아보기 (Learn more)