Skip to content

使用模式(响应评估)#

使用 BaseEvaluator#

LlamaIndex 中的所有评估模块都实现了 BaseEvaluator 类,具有两个主要方法:

  1. evaluate 方法接受 querycontextsresponse 和其他关键字参数。
    def evaluate(
        self,
        query: Optional[str] = None,
        contexts: Optional[Sequence[str]] = None,
        response: Optional[str] = None,
        **kwargs: Any,
    ) -> EvaluationResult:
  1. evaluate_response 方法提供了另一种接口,它接受一个 llamaindex Response 对象(其中包含响应字符串和源节点),而不是单独的 contextsresponse
def evaluate_response(
    self,
    query: Optional[str] = None,
    response: Optional[Response] = None,
    **kwargs: Any,
) -> EvaluationResult:

在处理 llamaindex 对象时,它的功能与 evaluate 相同,但使用起来更简单。

使用 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 测试套件,请访问 文档。