Faithfulness: 충실도: 답변이 검색된 문맥에 충실한지(즉, 환각이 있는지 여부) 평가합니다.
Context Relevancy: 검색된 문맥이 쿼리와 관련이 있는지 여부입니다.
Answer Relevancy: 생성된 답변이 쿼리와 관련이 있는지 여부입니다.
Guideline Adherence: 예측된 답변이 특정 가이드라인을 준수하는지 여부입니다.
Question Generation 기능 제공
LlamaIndex는 쿼리를 평가하는 것 외에도 데이터를 사용하여 평가할 질문을 생성할 수도 있습니다. 즉, 자동으로 질문을 생성한 다음 평가 파이프라인을 실행하여 LLM이 데이터를 사용하여 실제로 질문에 정확하게 답변할 수 있는지 테스트할 수 있습니다.
EvaluationResult 예시
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))
Evaluating Query + Response Relevancy
RelevancyEvaluator는 검색된 컨텍스트와 답변이 주어진 쿼리에 대해 관련성이 있고 일관성이 있는지 평가합니다.
이 평가자는 응답 객체 외에 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))
Question Generation
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]
DeepEval은 독자적인 평가 메트릭으로 구동되는 6개의 평가기(리트리버 및 발전기 평가를 위한 3개의 RAG 평가기 포함)를 제공합니다.
pip install -U deepeval
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)
Retrieval evaluation라는 개념은 새로운 것이 아니며, 질문의 데이터 세트와 실제 순위가 주어지면 평균 상호 순위(mean-reciprocal rank, MRR), 적중률(hit-rate), 정확도(precision) 등과 같은 순위 메트릭을 사용하여 검색기를 평가할 수 있습니다.