LlamaIndex 忠实度评估器使用指南
在处理大型语言模型(LLM)时,确保生成的响应忠实于源文档是至关重要的。本文将介绍如何使用 LlamaIndex 的 FaithfulnessEvaluator
模块来评估查询引擎的响应是否与源节点匹配,从而检测是否存在幻觉现象。我们将以纽约市维基百科页面为例,展示整个评估过程。
安装依赖
首先,我们需要安装必要的依赖包:
%pip install llama-index-llms-openai pandas[jinja2] spacy
设置环境
为了在 Jupyter Notebook 中使用异步操作,我们需要应用 nest_asyncio
:
import nest_asyncio
nest_asyncio.apply()
同时,设置 OpenAI API 密钥:
import os
os.environ["OPENAI_API_KEY"] = "sk-..."
导入必要的模块
接下来,导入 LlamaIndex 和其他必要的模块:
from llama_index.core import (
VectorStoreIndex,
SimpleDirectoryReader,
Response,
)
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import FaithfulnessEvaluator
from llama_index.core.node_parser import SentenceSplitter
import pandas as pd
pd.set_option("display.max_colwidth", 0)
使用 GPT-4 进行评估
我们使用 GPT-4 作为评估模型:
gpt4 = OpenAI(temperature=0, model="gpt-4")
evaluator_gpt4 = FaithfulnessEvaluator(llm=gpt4)
加载文档并创建向量索引
加载纽约市维基百科页面的文档,并创建向量索引:
documents = SimpleDirectoryReader("./test_wiki_data/").load_data()
splitter = SentenceSplitter(chunk_size=512)
vector_index = VectorStoreIndex.from_documents(
documents, transformations=[splitter]
)
定义显示评估结果的函数
定义一个函数,用于在 Jupyter Notebook 中显示评估结果:
from llama_index.core.evaluation import EvaluationResult
def display_eval_df(response: Response, eval_result: EvaluationResult) -> None:
if response.source_nodes == []:
print("no response!")
return
eval_df = pd.DataFrame(
{
"Response": str(response),
"Source": response.source_nodes[0].node.text[:1000] + "...",
"Evaluation Result": "Pass" if eval_result.passing else "Fail",
"Reasoning": eval_result.feedback,
},
index=[0],
)
eval_df = eval_df.style.set_properties(
**{
"inline-size": "600px",
"overflow-wrap": "break-word",
},
subset=["Response", "Source"]
)
display(eval_df)
运行评估
运行查询并评估响应:
query_engine = vector_index.as_query_engine()
response_vector = query_engine.query("How did New York City get its name?")
eval_result = evaluator_gpt4.evaluate_response(response=response_vector)
display_eval_df(response_vector, eval_result)
生成更多问题进行基准测试
生成更多问题,以便进行更全面的评估:
from llama_index.core.evaluation import DatasetGenerator
question_generator = DatasetGenerator.from_documents(documents)
eval_questions = question_generator.generate_questions_from_nodes(5)
print(eval_questions)
批量评估查询引擎
定义一个函数,用于批量评估查询引擎:
import asyncio
def evaluate_query_engine(query_engine, questions):
c = [query_engine.aquery(q) for q in questions]
results = asyncio.run(asyncio.gather(*c))
print("finished query")
total_correct = 0
for r in results:
eval_result = 1 if evaluator_gpt4.evaluate_response(response=r).passing else 0
total_correct += eval_result
return total_correct, len(results)
运行批量评估:
vector_query_engine = vector_index.as_query_engine()
correct, total = evaluate_query_engine(vector_query_engine, eval_questions[:5])
print(f"score: {correct}/{total}")
总结
通过 LlamaIndex 的 FaithfulnessEvaluator
模块,我们可以有效地评估查询引擎的响应是否忠实于源文档。这不仅有助于检测幻觉现象,还能提升模型的可靠性和准确性。希望本文能帮助你更好地理解和应用 LlamaIndex 的评估功能。如果你有任何问题或需要进一步的帮助,请随时联系我们。祝你在 LLM 开发的道路上取得成功!