LlamaIndex 响应评估全攻略
在大型语言模型(LLM)的应用开发中,评估生成的响应质量是提升应用性能的关键步骤。LlamaIndex 提供了丰富的评估模块,帮助开发者有效地衡量和优化 LLM 的输出。本文将详细介绍如何使用 LlamaIndex 进行响应评估。
使用 BaseEvaluator
LlamaIndex 中的所有评估模块都继承自 BaseEvaluator
类,该类包含两个主要方法:
-
evaluate 方法:接受查询、上下文、响应和额外关键字参数。
def evaluate( self, query: Optional[str] = None, contexts: Optional[Sequence[str]] = None, response: Optional[str] = None, **kwargs: Any, ) -> EvaluationResult:
-
evaluate_response 方法:提供一个替代接口,接受一个 LlamaIndex 的
Response
对象(包含响应字符串和源节点),而不是单独的上下文和响应。def evaluate_response( self, query: Optional[str] = None, response: Optional[Response] = None, **kwargs: Any, ) -> EvaluationResult:
这两个方法功能相同,但在直接使用 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
评估检索到的上下文和答案是否与给定的查询相关且一致。
注意,这个评估器需要传入查询,除了 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
)
总结
通过 LlamaIndex 的评估模块,开发者可以轻松地对 LLM 生成的响应进行多方面的评估,包括忠实度、相关性等。这些评估工具不仅帮助开发者了解模型的性能,还能指导模型的进一步优化。希望本文能帮助你更好地理解和应用 LlamaIndex 的评估功能。如果你有任何问题或需要进一步的帮助,请随时联系我们。祝你在 LLM 开发的道路上取得成功!