大模型评测之幻觉检测hallucination_evaluation_model

大背景:

  1. 2025开年deepseek铺天盖地的新闻
  2. 参会代表已经表明,年度主线就是以AI为基础
  3. Manus于3月初横空出世
  4. 国内各种模型竞赛的现状,只要是和科技沾边的公司不可能没有大模型,哪怕是里三层外三层套壳也得上
  5. 东升西降,宏观使然,竞争中必然有科技竞争

小背景

  1. 本公司自研大模型rd,在模型排名中必有一席之地
  2. 除了加大力度研发,还需各种评测
  3. 正好,吾就是一名专业的模型评测员
  4. 随着各种假信息的泛滥,模型越来越不清楚安全的边界、真实的边界,只是于铺天盖地的网页中查找然后总结,算不上一个优秀的大模型

幻觉检测

什么是幻觉检测?

官网中介绍到:"HHEM模型系列旨在检测 LLM 中的幻觉。它们在构建检索增强生成 (RAG) 应用程序的背景下特别有用,其中 LLM 总结了一组事实,并且 HHEM 可用于衡量该总结与事实在事实上的一致程度。"

说人话,就是检测一下大模型对事实的认知能力如何。

大模型地址:https://huggingface.co/vectara/hallucination_evaluation_model

如何做幻觉检测

  1. 仔细阅读中大模型地址的Model Card部分,这对你理解 "事实但是幻觉" 很重要。 

  2. 把项目克隆下来,待会儿要用到里面的模型进行计算

  3. 下载官方数据集,https://huggingface.co/datasets/vectara/leaderboard_results/tree/main ,数据集是一个很大的csv文件,里面是用于测试幻觉的各种问题,用于模型的输入

  4. 使用提示语,提示语要和问题进行拼接

  5. 编写一个脚本,从csv中读取问题,请求大模型,再将大模型的答案追加到后一列。参考如下:

    复制代码
    def huan_jue():
        df = pd.read_csv('leaderboard_summaries.csv', encoding='utf-8')
        df = df[df['model'] == 'deepseek/deepseek-v3']
    
        data = {"source": [], 'ori_summary': [], "rendu_summary": []}
        for index, row in df.iterrows():
            source = row[0]
            ori_summary = row[1]
            msg = f'Provide a concise summary of the following passage, covering the core pieces of information described in english. {source}'
            con = rendu(msg)
            try:
                con = con['choices'][0]['message']['content']
            except IndexError:
                con = ''
            print(index, con[:100])
            data["source"].append(source)
            data["ori_summary"].append(ori_summary)
            data["rendu_summary"].append(con)
    
        df2 = pd.DataFrame(data)
        df2.to_csv('output.csv', index=False)
  6. 上面的过程可能很漫长,建议放到服务器后台进行,后台命令参考,如果不打算用服务器跑,这一步忽略。

    复制代码
    nohup python hallucination_test.py > nohup.out 2>&1 &
  7. 下载依赖的模型,参考代码如下(如果已配置梯子,这一步可以忽略)

    复制代码
    import os
    os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
    from huggingface_hub import snapshot_download
    
    snapshot_download(
      repo_id="microsoft/OmniParser-v2.0",
      # repo_type="dataset",  # 下载数据集时才需要
      local_dir="../hallucination_evaluation_model/google/flan-t5-base",
      # proxies={"https": "http://localhost:7890"},
      # max_workers=8,
      etag_timeout=180
    )
  8. 使用大模型地址的Model Card部分提到的计算方式进行计算,这也是为什么第一步让大家熟读Model Card。我用的是Pipline方式计算的。计算也很耗时,建议放在服务器进行。

  9. 分数转化为排行榜支持的形式,首先我们看一下排行榜 https://huggingface.co/spaces/vectara/leaderboard ,首列分数越低代表该大模型致幻程度越小,说明模型越好。那四列的意思分别为:

    转换分数脚本参考

    • 幻觉率:幻觉评分低于0.5的摘要百分比

    • 事实一致率:幻觉率的补充,以百分比表示。

    • 回答率:非空摘要的百分比。这要么是模型拒绝生成响应,要么是由于各种原因抛出错误。(例如,模型认为文档包含不恰当的内容)

    • 平均摘要长度:生成的摘要的平均字数

```
import pandas as pd
result = {
    'Hallucination Rate': 0,
    'Factual Consistency Rate': 0,
    'Answer Rate': 0,
    'Average Summary Length': 0
}
with open('result.json', 'r') as f:
    con = eval(f.read())
hr = fcr = ar = 0
df = pd.read_csv('hallu_rendu/rendu_summary.csv')

asl = []
for i in df['rendu_summary'].tolist():
    j = i.split(' ')
    sm = 0
    sm += len(j)
    asl.append(sm)

for i in con:
    if i < 0.5:
        hr += 1
    if not i:
        ar += 1

hr = round(hr/len(con), 2)
fcr = 1-hr
hr = str(hr * 100) + '%'
fcr = str(fcr * 100) + '%'
ar = str((len(con) - ar) / len(con) * 100) + '%'
asl = str(sum(asl)/len(asl))
result['Hallucination Rate'] = hr
result['Factual Consistency Rate'] = fcr
result['Answer Rate'] = ar
result['Average Summary Length'] = asl
print(result)
```

聊一聊我们的模型评测结果

我们的rd模型在评测中各项评分如下:{'Hallucination Rate': '16.0%', 'Factual Consistency Rate': '84.0%', 'Answer Rate': '100.0%', 'Average Summary Length': '102.68190854870775'}

这个结果算不上好,但至少上榜了。

你们的呢,评论区聊一聊