【RAG 论文】WikiChat:从 WikiPedia 检索数据来提高 LLM 的事实性的聊天机器人

news2024/12/26 22:55:40

论文:WikiChat: Stopping the Hallucination of Large Language Model Chatbots by Few-Shot Grounding on Wikipedia
⭐⭐⭐⭐
Stanford University, EMNLP 2023
相关地址:

  • demo 体验地址
  • Code
  • Huggingface 模型

文章目录

    • 论文速读
    • 模型 demo
    • 一些其他的细节
      • 1)WikiChat 的通用性
      • 2)模型蒸馏
      • 3)文本索引阶段
      • 4)检索召回阶段
    • 总结
    • 摘抄

这篇论文的题目具有一定争议性,尽管论文题目说“Stopping the Hallucination”,但在实际体验时仍然会存在很多幻觉。但本文提出的思路确实也提高了 LLM 回答的事实准确性,其思路值得学习。

论文速读

WikiChat 在想生成用户问题时,会经过 7 个过程来生成最终的答案,如下图所示:

WikiChat 的步骤
这 7 个步骤形成一个 RAG pipeline,其中每一步都专门设计了对应的 prompt 来实现相关的目的

  • step 1 - QueryWikiChat 会根据用户的问题生成一个用于检索 Wikipedia 的 search query,并交由 retriever 检索出 N I R N_{IR} NIR 个 passages。另外这个 search query 中会带上推断出的用户需求的查询时间,这个查询时间可以是 recentyear=xxxx 或者 none,这个查询时间可用于辅助检索文档
  • step 2 - Summarize & Filter从检索到的 passages 中过滤掉不相关的部分,抽取出有用的章节,并将它们总结为多个要点
  • step 3 - Generate提示 LLM 让它生成对话历史的 response
  • step 4 - Extract Claims将 LLM 的 response 拆分为多个 claim,并使用 IR(Information Retrieve)从知识库中为每个 claim 检索出 N e v i d e n c e N_{evidence} Nevidence 个 passages 作为 证据
  • step 5 - Fact Check过滤掉没有证据支持的 claim。这里在具体操作时会使用 CoT。
  • step 6 - Draft根据前面得到的要点清单和对话历史生成 response 的草稿(draft)
  • step 7 - RefineLLM 根据我们期望的 relevance、naturalness、non-repetitiveness 以及 temporal correctness 等多个指标来对 draft 生成反馈,并进一步完善 draft,得到最终的 response。另外,由于 LLM 很难说“I don’t know”,所以这里规定当 stage 1-5 这个 curation stage 没有返回到相关信息的特殊情况下,会跳过 draft 的生成,并直接向最后一个阶段发送一个 “Sorry, I’m not sure”。

其中, N e c u d e n c e = 2 N_{ecudence} = 2 Necudence=2 N I R = 3 N_{IR}=3 NIR=3,这是一个经验参数,为了在 development set 上获得更高的 recall。

模型 demo

在上图中,是原论文演示了询问最近上映的电影 奥本海默 时 WikiChat 的 7 个过程所做的具体事情。下面,我们看一下在实际运行的 WikiChat 中,问出一个问题后会有怎样的回复。这里,我们问它关于星球大战系列电影的外传《游侠索罗》的主角 Solo 的扮演者,在问题中,我们故意说错了电影名,而是用了一个同义表达,看看 WikiChat 是如何应对的:

demo

可以看到,它成功回答了这个问题,主角 Solo 的扮演者是 Alden Ehrenreich,而且它意识到了电影名称的错误。在这里,我们可以展开看看 WikiChat 的中间处理过程:

  • WikiChat 首先在 Wikipedia 中进行检索,得到多个 passages:
    在这里插入图片描述
  • LLM 的原生 answer 以及从中抽取出来的 claims:

claims

这契合了论文提到的 WikiChat 的 RAG pipeline。

一些其他的细节

1)WikiChat 的通用性

WikiChat 的构建思路是具有通用性的:

  • 这里的知识库不局限于 Wikipedia,它可以是本地私有知识库
  • 使用的 LLM 不局限于特定的 LLM

2)模型蒸馏

以上我们介绍的过程是使用 ChatGPT 或 GPT 来完成的,但当我们部署时,为了降低模型运行的延迟和代价,同时为了本地部署时数据的私密性,我们进行了模型蒸馏,得到了一个较小的基于 LLaMA 的语言模型来实现 WikiChat 的问答。

具体的做法就是:让 WikiChat based on GPT-4 作为 teacher model,让公开可用的 LLaMA 作为 student model,去进行模型蒸馏。我们让一个 user simulator 去与 teacher model 使用 instruction 和多个 examples 进行对话,得到一堆 input-output paris,然后拿这些 instruction 和 input-output pairs 去微调 student LLM,让 LLaMA-based WikiChat 能够执行 pipeline 中各个 stages 的特定任务。

在具体数据上,本工作总共从 750 篇 Wikipedia 的文章中获得训练数据,一个 user simulator 与 GPT-4 针对每个 topic 进行 10 轮 QA 对话,共产生 37499 个 (instruction, input, output) pairs 作为微调数据对,用于对 LLaMA 进行微调。

根据实验,蒸馏后的 LLaMA-based WikiChat 可以达到 GPT4-based WikiChat 的 91% 的事实准确率,而且在延迟和消耗代价上低了很多很多。

3)文本索引阶段

在文本索引方面,使用 WikiExtractor 工具(https://github.com/attardi/wikiextractor) 从2023年4月28日获得的英文维基百科转储中提取纯文本,与ColBERT一样,将每篇文章(忽略表格和信息框)划分为不同的文本块作为段落,并在段落前加上文章标题,将段落和标题的总长度限制在120字以内。

4)检索召回阶段

在检索召回方面,在维基百科上使用 ColBERTv2(https://github.com/stanford-futuredata/ColBERT/) 和 PLAID(https://arxiv.org/abs/2205.09707) 作为检索工具。

总结

WikiChat 的七步 RAG pipeline 的思想,在每一步都设计对应的 prompt 是实现的关键

它在整个 RAG 流程中,主要强化的是召回内容的后处理阶段,整体会很慢,所以为了改善延迟、成本和隐私,本工作使用对 GPT4-based 进行模型蒸馏得到一个 LLaMA-based WikiChat。

摘抄

另外,觉得刘老师的下面这段话很有启发,在此摘抄:

RAG这条路,跟prompt工程,ICL有很紧密的联系,下面这张图很清晰地描述了当前大模型回复的优化路线。

先写个prompt,效果不行,加fewshot,然后出现了一堆怎么选fewshot的工作。

fewshot效果也不够,那就借助外部知识,简单做个搜索,结果还不好,那就再加上微调一把。

微调难免会有错误,对召回的处理不够好,这个时候再做下事实性验证,比如rethink,self critique。

这样可能效果还不好,那么,就对齐下任务,把RAG的过程加到微调里,最终将RAG,微调。prompt工程融为一体。

RAG optimization

参考文章:

  • https://mp.weixin.qq.com/s/UsZy6TdnUaqQ3PtSq6F4yA
  • https://baijiahao.baidu.com/s?id=1787053518998130102

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1614978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

让流程图动起来

我们平时画流程,然后贴到文档,就完事了。但是过程演示的时候,如果只是一张静态图,很难吸引到听众的注意力,表达效果并不太好。常用的方法是可以用PPT进行动态演示,做PPT也是需要花一些时间,同时…

[StartingPoint][Tier2]Base

Task 1 Which two TCP ports are open on the remote host? (远程服务器开放了哪两个TCP端口?) $ nmap -sC -sV 10.129.234.232 22,80 Task 2 What is the relative path on the webserver for the login page? (相关的登录页面路径是什么?) /login/login.php Task 3 …

1 transformers:词典,(文本如何处理)

0 介绍 NLP任务最初,就是在于如何处理文本。无论从TFIDF到word2Vec的过程,还是BERT都是想找到文本的向量表达,如何表示更好处理我们的下游任务。那么,这个过程是如何做的呢,本文主要就是介绍这一个过程,还是…

【C++ 多态】(一)虚函数重写✍

文章目录 1.虚函数重写的三个例外1.1协变(基类与派生类虚函数返回值类型不同)1.2析构函数的重写(基类与派生类析构函数的名字不同)1.3派生类可以不写 virtual 2.面试题✍ 1.虚函数重写的三个例外 1.1协变(基类与派生类虚函数返回值类型不同) ①🍎协变的概念&#…

Linux学习之路 -- 进程篇 -- 进程地址空间

目录 一、背景介绍 二、进程地址空间 1.看现象 2.先简单描述一下地址空间(地址空间全在操作系统的内部) 3.地址空间详细一点的描述 4.进程地址空间里面的内容(部分) 三、进程地址空间的转换机制 1.页表 2.进程地址空间和页…

牛客NC162 二叉树中和为某一值的路径(三)【中等 dfs C++、Java、Go、PHP】

题目 题目链接: https://www.nowcoder.com/practice/965fef32cae14a17a8e86c76ffe3131f 思路 既然要找所有路径上节点和等于目标值的路径个数,那我们肯定先找这样的路径起点啊, 但是我们不知道起点究竟在哪里, 而且任意节点都有…

Navicat 干货 | 掌握 PostgreSQL 规则语法

PostgreSQL 规则提供了一种强大的机制,控制查询执行并在数据库内部实施数据操作。理解规则的语法和用法对于有效利用其功能至关重要。在上周的文章中,我们探讨了 PostgreSQL 规则的工作原理及其与触发器的区别。今天的文章将使用免费的 “dvdrental”示例…

笔记本电脑坏了硬盘数据会丢失吗 笔记本电脑坏了如何取出硬盘的资料 数据恢复软件

笔记本电脑对我们真的非常重要了,是实现无纸化办公和学习的重要工具,但是如果笔记本电脑坏了我们存储在电脑里的资料该怎么办?笔记本电脑坏了硬盘数据会丢失吗?相信有许多朋友都会有这样的担忧。本文今天就为大家解决笔记本电脑坏…

3月衣物清洁行业数据概况和趋势分析:总销额环比上涨超60%!

人们日常生活离不开衣物清洁产品,同时随着生活品质得提高和消费者健康意识得增强,对于衣物清洁行业的需求量与日俱增。作为日常必备的消耗品,衣物清洁产品备受消费者关注。借此,衣物清洁行业在3月份表现出稳定的发展态势。 根据鲸…

【软件测试】关于Web自动化测试

文章目录 🍃前言🌲如何实现Web自动化🚩安装驱动管理🚩Selenium库的安装 🌳自动化常用函数🚩元素的定位🎈cssSelector🎈xpath 🚩操作测试对象🎈点击/提交对象—…

洗地机选哪个牌子好?过来人建议买这四款:性价比高质量好

随着生活节奏的加快,洗地机逐渐成为了人们生活中的清洁小能手,但市面上品牌众多,性能参差不齐,消费者往往难以抉择。在选择洗地机时,我们不仅要考虑其清洁效果,还应着重考察性价比。那么,面对如…

3.AlexNet--CNN经典网络模型详解(pytorch实现)

看博客AlexNet--CNN经典网络模型详解(pytorch实现)_alex的cnn-CSDN博客,该博客的作者写的很详细,是一个简单的目标分类的代码,可以通过该代码深入了解目标检测的简单框架。在这里不作详细的赘述,如果想更深…

[Meachines][Easy]Devvortex

Main $ nmap -p- 10.10.11.242 --min-rate 1000 # echo 10.10.11.242 devvortex.htb>>/etc/hosts 子域名爆破 $ apt install seclists $ wfuzz -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u "http://devvortex.htb/" -H &…

【Transformer】detr梳理

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 detr detr 1. 引言 论文: https://arxiv.org/pdf/2005.12872v3.pdf 时间: 2020.5.26 作者: Nicolas Carion?, Fra…

陈奂仁联手 The Sandbox 推出“Hamsterz Doodles”人物化身系列

全新人物化身系列结合艺术与实用性 开创元宇宙新篇章 著名亚洲唱作歌手兼香港电影金像奖得主陈奂仁携手 The Sandbox,兴奋地宣布推出新的元宇宙人物化身系列 —— Hamsterz Doodles 仓鼠涂鸦。 陈奂仁在 The Sandbox 推出 Hamsterz Doodles 系列,将艺术与…

智能家居—ESP32开发环境搭建

相关文章 毕业设计——基于ESP32的智能家居系统(语音识别、APP控制) 智能家居—ESP32开发环境搭建 一、下载安装二、验证三、资料获取 一、下载安装 下载安装 vscode 安装插件 创建工程 二、验证 写一个简单的函数来验证一下功能 void setup() {// put your setup c…

类和对象(2)——封装(封装的概念、包、staic)

前言 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节。 一、什么是封装 1.1 概念 将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节&…

【码农圈子】想加免费的程序员微信群的看过来

群名:码农圈子 很多人后台反应,最近有没有免费的微信技术交流社群 。今天特意写一篇文章来创建一些只有程序猿的微信群。(广告党慎入!) 这些微信技术群都是完全免费,后续也不会收取任何费用 。 群规则 …

Paragon NTFS如何手动更新? Paragon NTFS格式化硬盘会损失数据吗?

Paragon NTFS for Mac常被用于实现在Mac上读写NTFS格式硬盘,然而,有时用户可能会遇到软件无法自动更新的情况,需要进行手动更新操作。下面我们来看看Paragon NTFS如何手动更新,Paragon NTFS格式化硬盘会损失数据吗的相关内容。 一…

Python 使用 pip 安装 matplotlib 模块(精华版)

pip 安装 matplotlib 模块 1.使用pip安装matplotlib(五步实现):2.使用下载的matplotlib画图: 1.使用pip安装matplotlib(五步实现): 长话短说:本人下载 matplotlib 花了大概三个半小时屡屡碰壁,险些暴走。为了不让新来的小伙伴走我的弯路,特意…