사용 패턴
사용 패턴 (응답 평가)
LlamaIndex의 모든 평가 모듈은 BaseEvaluator 클래스를 구현하며 두 가지 주요 메서드를 가져요.
출처: 문서
본문
BaseEvaluator 사용하기
evaluate메서드는query,contexts,response와 추가 키워드 인자를 받아요.
def evaluate(
self,
query: Optional[str] = None,
contexts: Optional[Sequence[str]] = None,
response: Optional[str] = None,
**kwargs: Any,
) -> EvaluationResult:
evaluate_response메서드는 별도의contexts와response대신 llamaindexResponse객체(응답 문자열과 소스 노드를 포함)를 받는 대체 인터페이스를 제공해요.
def evaluate_response(
self,
query: Optional[str] = None,
response: Optional[Response] = None,
**kwargs: Any,
) -> EvaluationResult:
기능상 evaluate와 동일하지만, llamaindex 객체를 직접 다룰 때 더 간단해요.
EvaluationResult 사용하기
각 평가기는 실행되면 EvaluationResult를 출력해요:
eval_result = evaluator.evaluate(query=..., contexts=..., response=...)
eval_result.passing # binary pass/fail
eval_result.score # numerical score
eval_result.feedback # string feedback
평가기마다 결과 필드의 일부만 채울 수도 있어요.
응답 충실도(즉, 환각) 평가하기
FaithfulnessEvaluator는 답변이 검색된 컨텍스트에 충실한지(다시 말해 환각이 있는지) 평가해요.
from llama_index.core import VectorStoreIndex
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import FaithfulnessEvaluator
# create llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# build index
...
# define evaluator
evaluator = FaithfulnessEvaluator(llm=llm)
# 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))
각 소스 컨텍스트를 개별적으로 평가할 수도 있어요:
from llama_index.core import VectorStoreIndex
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import FaithfulnessEvaluator
# create llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# build index
...
# define evaluator
evaluator = FaithfulnessEvaluator(llm=llm)
# 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?"
)
response_str = response.response
for source_node in response.source_nodes:
eval_result = evaluator.evaluate(
response=response_str, contexts=[source_node.get_content()]
)
print(str(eval_result.passing))
response.source_nodes의 각 소스 노드에 대응하는 결과 목록을 받게 돼요.
쿼리 + 응답 관련성 평가하기
RelevancyEvaluator는 검색된 컨텍스트와 답변이 주어진 쿼리에 대해 관련성 있고 일관적인지 평가해요. 이 평가기는 Response 객체 외에도 query를 전달해야 한다는 점에 주의하세요.
from llama_index.core import VectorStoreIndex
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import RelevancyEvaluator
# create llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# build index
...
# define evaluator
evaluator = RelevancyEvaluator(llm=llm)
# 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))
마찬가지로 특정 소스 노드에 대해 평가할 수도 있어요.
from llama_index.core import VectorStoreIndex
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import RelevancyEvaluator
# create llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# build index
...
# define evaluator
evaluator = RelevancyEvaluator(llm=llm)
# 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)
response_str = response.response
for source_node in response.source_nodes:
eval_result = evaluator.evaluate(
query=query,
response=response_str,
contexts=[source_node.get_content()],
)
print(str(eval_result.passing))
질문 생성
LlamaIndex는 여러분의 데이터를 사용해 답할 질문도 생성할 수 있어요. 위의 평가기들과 결합하면 데이터에 대한 완전 자동화된 평가 흐름을 만들 수 있어요.
from llama_index.core import SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.core.llama_dataset.generator import RagDatasetGenerator
# create llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# build documents
documents = SimpleDirectoryReader("./data").load_data()
# define generator, generate questions
dataset_generator = RagDatasetGenerator.from_documents(
documents=documents,
llm=llm,
num_questions_per_chunk=10, # set the number of questions per nodes
)
rag_dataset = dataset_generator.generate_questions_from_nodes()
questions = [e.query for e in rag_dataset.examples]
배치 평가
여러 질문에 걸쳐 평가기 세트를 실행하기 위한 배치 평가 러너도 제공해요.
from llama_index.core.evaluation import BatchEvalRunner
runner = BatchEvalRunner(
{"faithfulness": faithfulness_evaluator, "relevancy": relevancy_evaluator},
workers=8,
)
eval_results = await runner.aevaluate_queries(
vector_index.as_query_engine(), queries=questions
)
통합 (Integrations)
커뮤니티 평가 도구와도 통합해요.
DeepEval
DeepEval은 자체 평가 메트릭으로 구동되는 6개의 평가기(retriever와 generator 평가를 위한 3개의 RAG 평가기 포함)를 제공해요. 시작하려면 deepeval을 설치하세요:
pip install -U deepeval
그런 다음 deepeval에서 평가기를 import 해서 사용하면 돼요. 전체 예시:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from deepeval.integrations.llama_index import DeepEvalAnswerRelevancyEvaluator
documents = SimpleDirectoryReader("YOUR_DATA_DIRECTORY").load_data()
index = VectorStoreIndex.from_documents(documents)
rag_application = index.as_query_engine()
# An example input to your RAG application
user_input = "What is LlamaIndex?"
# LlamaIndex returns a response object that contains
# both the output string and retrieved nodes
response_object = rag_application.query(user_input)
evaluator = DeepEvalAnswerRelevancyEvaluator()
evaluation_result = evaluator.evaluate_response(
query=user_input, response=response_object
)
print(evaluation_result)
deepeval에서 6개 평가기를 모두 import 하는 방법은 다음과 같아요:
from deepeval.integrations.llama_index import (
DeepEvalAnswerRelevancyEvaluator,
DeepEvalFaithfulnessEvaluator,
DeepEvalContextualRelevancyEvaluator,
DeepEvalSummarizationEvaluator,
DeepEvalBiasEvaluator,
DeepEvalToxicityEvaluator,
)
deepeval의 평가 메트릭을 LlamaIndex와 함께 사용하고 전체 LLM 테스트 스위트를 활용하는 방법을 더 알아보려면 docs를 방문하세요.