使用模式(响应评估)#
使用 BaseEvaluator#
LlamaIndex 中的所有评估模块都实现了 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方法提供了另一种接口,接收 llamaindex 的Response对象(包含响应字符串和源节点)而非单独的contexts和response。
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 # 二进制通过/失败
eval_result.score # 数值分数
eval_result.feedback # 文本反馈
不同的评估器可能会填充结果字段的子集。
评估响应忠实度(即幻觉检测)#
FaithfulnessEvaluator 评估答案是否忠实于检索到的上下文(换句话说,是否存在幻觉)。
from llama_index.core import VectorStoreIndex
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import FaithfulnessEvaluator
# 创建 llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# 构建索引
...
# 定义评估器
evaluator = FaithfulnessEvaluator(llm=llm)
# 查询索引
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
# 创建 llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# 构建索引
...
# 定义评估器
evaluator = FaithfulnessEvaluator(llm=llm)
# 查询索引
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 评估检索到的上下文和答案对于给定查询是否相关且一致。
注意此评估器需要传入 query 和 Response 对象。
from llama_index.core import VectorStoreIndex
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import RelevancyEvaluator
# 创建 llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# 构建索引
...
# 定义评估器
evaluator = RelevancyEvaluator(llm=llm)
# 查询索引
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
# 创建 llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# 构建索引
...
# 定义评估器
evaluator = RelevancyEvaluator(llm=llm)
# 查询索引
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
# 创建 llm
llm = OpenAI(model="gpt-4", temperature=0.0)
# 构建文档
documents = SimpleDirectoryReader("./data").load_data()
# 定义生成器,生成问题
dataset_generator = RagDatasetGenerator.from_documents(
documents=documents,
llm=llm,
num_questions_per_chunk=10, # 设置每个节点的问题数量
)
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
)
集成方案#
我们还集成了社区评估工具。
DeepEval#
DeepEval 提供 6 种评估器(包括 3 种 RAG 评估器,用于检索器和生成器评估),由其专有评估指标驱动。首先安装 deepeval:
pip install -U deepeval
然后可以从 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()
# 输入到 RAG 应用的示例
user_input = "What is LlamaIndex?"
# LlamaIndex 返回包含输出字符串和检索节点的响应对象
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 种评估器的方式:
from deepeval.integrations.llama_index import (
DeepEvalAnswerRelevancyEvaluator,
DeepEvalFaithfulnessEvaluator,
DeepEvalContextualRelevancyEvaluator,
DeepEvalSummarizationEvaluator,
DeepEvalBiasEvaluator,
DeepEvalToxicityEvaluator,
)
要了解更多关于如何将 deepeval 的评估指标与 LlamaIndex 结合使用,并充分利用其完整的 LLM 测试套件,请访问文档。