-
[LlamaIndex] Evaluating카테고리 없음 2024. 1. 30. 12:29
평가와 벤치마킹은 LLM 개발에서 중요한 개념입니다. LLM 앱(RAG, 에이전트)의 성능을 향상하려면 이를 측정할 수 있는 방법이 있어야 합니다. LlamaIndex는 생성된 결과의 품질을 측정하는 주요 모듈을 제공합니다. 또한 검색 품질을 측정하기 위한 주요 모듈도 제공합니다.
○ Response Evaluation(응답 평가)
LlamaIndex는 결과의 품질을 측정하기 위해 LLM 기반 평가 모듈을 제공합니다. 이는 "골드" LLM(예: GPT-4)을 사용하여 예측된 답변이 다양한 방식으로 올바른지 여부를 결정합니다. 이러한 현재 평가 모듈 중 다수에는 실측 라벨이 필요 하지 않습니다. 쿼리, 컨텍스트, 응답의 일부 조합을 통해 평가를 수행하고 이를 LLM 호출과 결합할 수 있습니다.
평가 모듈은 다음과 같은 형식으로 되어 있습니다.
- 정확성 : 생성된 답변이 쿼리에 제공된 참조 답변과 일치하는지 여부(라벨 필요)
- 의미적 유사성 예측된 답변이 참조 답변과 의미적으로 유사한지 여부입니다(라벨 필요).
- 충실도 : 답변이 검색된 문맥에 충실한지(즉, 환각이 있는지)를 평가합니다.
- Context Relevancy : 검색된 컨텍스트가 쿼리와 관련이 있는지 여부입니다.
- 답변 관련성 : 생성된 답변이 쿼리와 관련이 있는지 여부입니다.
- 지침 준수 : 예상 답변이 특정 지침을 준수하는지 여부입니다.
# Faithfulness 평가(Hallucincation)
'FaithfulnessEvaluator'를 사용하여, 답변이 컨텍스트에 충실한지, 환각은 없는지 평가할 수 있습니다. 아래는 코드 예시입니다.
# 평가 모듈을 사용하기 위한 함수 생성 def evaluate( self, query: Optional[str] = None, contexts: Optional[Sequence[str]] = None, response: Optional[str] = None, **kwargs: Any, ) -> EvaluationResult: def evaluate_response( self, query: Optional[str] = None, response: Optional[Response] = None, **kwargs: Any, ) -> EvaluationResult:
from llama_index import VectorStoreIndex, ServiceContext from llama_index.llms import OpenAI from llama_index.evaluation import FaithfulnessEvaluator # build service context llm = OpenAI(model="gpt-4", temperature=0.0) service_context = ServiceContext.from_defaults(llm=llm) # build index ... # define evaluator evaluator = FaithfulnessEvaluator(service_context=service_context) # query index query_engine = vector_index.as_query_engine() response = query_engine.query( "What battles took place in New York City in the American Revolution?" ) eval_result = evaluator.evaluate_response(response=response) print(str(eval_result.passing))
# 쿼리 응답 관련성 평가
'RelevanceyEvaluator'를 사용하여, 검색된 컨텍스트와 답변이 주어진 쿼리에 대해 관련성이 있고 일관성이 있는지 평가합니다.
from llama_index import VectorStoreIndex, ServiceContext from llama_index.llms import OpenAI from llama_index.evaluation import RelevancyEvaluator # build service context llm = OpenAI(model="gpt-4", temperature=0.0) service_context = ServiceContext.from_defaults(llm=llm) # build index ... # define evaluator evaluator = RelevancyEvaluator(service_context=service_context) # query index query_engine = vector_index.as_query_engine() query = "What battles took place in New York City in the American Revolution?" response = query_engine.query(query) eval_result = evaluator.evaluate_response(query=query, response=response) print(str(eval_result))
○ Retrieval Evaluation(검색 평가)
질문 데이터세트와 실측 순위가 주어지면 평균 상호 순위(MRR), 적중률, 정밀도 등과 같은 순위 지표를 사용하여 검색기를 평가할 수 있습니다.
'RetrieverEvaluator'를 사용하여, 쿼리와 노드의 검색 품질을 평가 합니다.
from llama_index.evaluation import RetrieverEvaluator # define retriever somewhere (e.g. from index) # retriever = index.as_retriever(similarity_top_k=2) retriever = ... retriever_evaluator = RetrieverEvaluator.from_metric_names( ["mrr", "hit_rate"], retriever=retriever ) retriever_evaluator.evaluate( query="query", expected_ids=["node_id1", "node_id2"] )
○ Evaluating with Labelled RAG Dataset
특정 도메인을 위해 구축한 LLM 애플리케이션이 잘 동작하는지 테스트하려면, 도메인에서 생성된 데이터로 테스트를 해봐야 합니다. 이를 위해 LlamaIndex에서는 Labelled 된 Domain Dataset을 통해 모델을 평가할 수 있도록 지원 합니다.
# Labelled Dataset 생성
Labelled RAG Dataset은 아래의 코드 예시를 통해 직접 구축할 수 있습니다.
from llama_index.llama_dataset import ( LabelledRagDataset, CreatedBy, CreatedByType, LabelledRagDataExample, ) example1 = LabelledRagDataExample( query="This is some user query.", query_by=CreatedBy(type=CreateByType.HUMAN), reference_answer="This is a reference answer. Otherwise known as ground-truth answer.", reference_contexts=[ "This is a list", "of contexts used to", "generate the reference_answer", ], reference_by=CreatedBy(type=CreateByType.HUMAN), ) # a sad dataset consisting of one measely example rag_dataset = LabelledRagDataset(examples=[example1])
위의 코드로 LabelledRagDataExample을 하나씩 생성하여 수동으로 LabelledRagDataset을 구축할 수 있습니다. 하지만 이 작업은 다소 지루하고 오래 걸립니다. 이번에는 LLM을 사용하여 데이터세트를 생성하는 방법을 알아보겠습니다.
from llama_index.llama_dataset.generator import RagDatasetGenerator from llama_index import ServiceContext from llama_index.llm import OpenAI import nest_asyncio nest_asyncio.apply() documents = ... # a set of documents loaded by using for example a Reader service_context = ServiceContext.from_defaults(llm=OpenAI(model="gpt-4")) dataset_generator = RagDatasetGenerator.from_documents( documents=documents, service_context=service_context, num_questions_per_chunk=10, # set the number of questions per nodes ) rag_dataset = dataset_generator.generate_dataset_from_nodes()
# Labelled Dataset 사용
Labelled Rag Dataset을 사용하여 RAG 시스템을 평가하기 위해서는 두 단계를 수행해야 합니다
(1) 데이터 세트에 대한 예측(즉, 각 개별 예제의 쿼리에 대한 응답 생성)
(2) 예측된 응답을 참조 답변과 비교하여 평가
LlamaIndex에서는 이 평가 프로세스를 간소화하는 RagEvaluatorPack을 제공합니다.
from llama_index.llama_pack import download_llama_pack RagEvaluatorPack = download_llama_pack("RagEvaluatorPack", "./pack") rag_evaluator = RagEvaluatorPack( query_engine=query_engine, # built with the same source Documents as the rag_dataset rag_dataset=rag_dataset, ) benchmark_df = await rag_evaluator.run()