ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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()

     

Designed by Tistory.