LLM 비용 분석하기
LLM 비용 분석하기 (Cost Analysis)
LLM 호출 한 번에도 비용이 든다는 건 다들 알지만, 정확히 어디서 얼마나 드는지는 잘 모르기 마련이에요. 예를 들어 OpenAI의 gpt-3.5-turbo는 1k 토큰당 $0.002예요. 인덱스를 구축하고 쿼리하는 비용은 어떤 요인에 의해 결정될까요? 크게 네 가지 — 사용하는 LLM 종류, 사용하는 데이터 구조 종류, 구축 중 파라미터, 쿼리 중 파라미터 — 입니다. LlamaIndex는 비용 구조를 예측할 수 있는 정보를 제공하는데, 그 핵심을 정리해볼게요.
출처: 공식문서
비용 구조 개요
LLM 호출이 없는 인덱스 (구축 비용 0)
SummaryIndex— 호출 없이 구축SimpleKeywordTableIndex— 정규식 키워드 추출기로 각 문서에서 키워드 추출RAKEKeywordTableIndex— RAKE 키워드 추출기로 각 문서에서 키워드 추출
LLM 호출이 필요한 인덱스
TreeIndex— LLM으로 텍스트를 계층적으로 요약해 트리 구축KeywordTableIndex— LLM으로 각 문서에서 키워드 추출
쿼리 시점 비용
쿼리 시점에는 최종 답을 합성하기 위해 항상 1번 이상의 LLM 호출이 발생해요. 일부 인덱스는 인덱스 구축과 쿼리 사이에 비용 트레이드오프가 존재해요. 예를 들어 SummaryIndex는 구축이 무료지만, (필터나 임베딩 조회 없이) 쿼리를 돌리면 LLM을 N번 호출해요.
인덱스별 쿼리 비용 노트:
SummaryIndex: 기본적으로 N번 LLM 호출 (N은 노드 수)TreeIndex: 기본적으로 log(N)번 LLM 호출 (N은 리프 노드 수)child_branch_factor=2로 설정하면 기본값인child_branch_factor=1보다 비싸요 (지수적 vs 로그적) — 부모 노드마다 1개가 아닌 2개 자식을 탐색하거든요
KeywordTableIndex: 기본적으로 쿼리 키워드를 추출하기 위한 LLM 호출 1회 필요index.as_retriever(retriever_mode="simple")또는index.as_retriever(retriever_mode="rake")로 쿼리 텍스트에도 정규식/RAKE 키워드 추출기를 쓸 수 있어요
VectorStoreIndex: 기본적으로 쿼리당 LLM 호출 1회.similarity_top_k나chunk_size를 늘리거나response_mode를 바꾸면 이 숫자는 증가해요
사용 패턴 — 토큰 예측기
LlamaIndex는 LLM·임베딩 호출의 토큰 사용량을 예측하는 토큰 예측기(predictor) 를 제공해요. 덕분에 실제 LLM 호출 전에 1) 인덱스 구축과 2) 인덱스 쿼리 동안의 비용을 예상할 수 있어요.
토큰은 TokenCountingHandler 콜백으로 카운트돼요. 설정 상세는 예시 노트북 참고.
MockLLM 사용하기
LLM 호출의 토큰 사용량을 예측하려면 아래처럼 MockLLM을 import해서 인스턴스화해요. max_tokens 파라미터는 "최악의 경우" 예측으로 쓰이며, 각 LLM 응답이 정확히 그만큼의 토큰을 포함한다고 가정해요.
from llama_index.core.llms import MockLLM
from llama_index.core import Settings
# mock llm을 전역으로 사용
Settings.llm = MockLLM(max_tokens=256)
이 예측기는 인덱스 구축과 쿼리 양쪽 모두에서 사용할 수 있어요.
MockEmbedding 사용하기
MockEmbedding으로 임베딩 호출의 토큰 사용량도 예측할 수 있어요.
from llama_index.core import MockEmbedding
from llama_index.core import Settings
# mock embedding을 전역으로 사용
Settings.embed_model = MockEmbedding(embed_dim=1536)