RAG 如何消除大模型幻觉

news2024/11/28 12:47:47

什么是大模型幻觉

假设我们有一个基于大型生成模型(如GPT-3)的问答系统,该系统用于回答药企内部知识库中的问题。我们向其提出一个问题:“阿司匹林的主要药理作用是什么?”

正确的答案应该是:“阿司匹林主要通过抑制环氧酶(COX)酶的活性,降低前列腺素和血栓素的生成,从而起到抗血小板聚集、镇痛和解热的作用。”

然而,由于大模型幻觉问题,生成模型可能会给出一个在语法和流畅性上看似合理,但实际上并不准确的答案,例如:“阿司匹林的主要药理作用是通过抑制多巴胺受体来改善心血管功能。”这个答案中的信息是错误的,因为阿司匹林的药理作用与多巴胺受体无关。

如何减少幻觉

解决大模型幻觉问题需要采取多种策略来提高生成模型在自然语言处理任务中的准确性和可靠性。以下是一些常见的方法:

  1. 结合检索和生成:使用像RAG(Retrieval-Augmented Generation)这样的模型,在生成过程中结合检索相关文档或信息。这样可以在生成阶段利用更多外部知识,从而减少幻觉现象。
  2. 模型可解释性和后处理:分析生成模型的输出,以识别和纠正潜在的幻觉问题。这可以通过使用可解释性工具、规则引擎或其他后处理方法来实现。
  3. 模型融合与集成:将多个生成模型的输出进行融合或集成,以提高生成文本的准确性。这可以通过投票、加权平均或其他集成方法来实现。
  4. 优化生成策略:在生成过程中采用更合适的概率抽样策略,如束搜索(beam search)、拓扑抽样(top-k sampling)或者核心抽样(nucleus sampling),以平衡生成文本的多样性和准确性。
  5. 更精细的预训练和微调(fine-tuning):在预训练生成模型时,使用更高质量、更具代表性的数据集。更多有标签的数据或强化学习方法来提高模型。在微调阶段,使用与目标任务更相关的数据集,以便模型更好地适应特定场景。
  6. 提示词工程:使用更好的提示词进行正确性引导。
  7. 增加多样性:在生成回答时,可以引入一些随机性或多样性,以避免模型过于依赖于检索到的特定信息。例如,可以通过引入不同的词汇、短语或句子结构来增加生成的多样性。

通过采取这些方法,研究人员和工程师可以在一定程度上解决大模型幻觉问题,提高生成模型在自然语言处理任务中的表现。然而,这仍然是一个具有挑战性的研究领域,需要进一步的探索和创新。

RAG是什么

RAG(Retrieval-Augmented Generation)是一种结合了检索和生成的技术,旨在提高自然语言处理任务的性能。在RAG中,外部检索(或搜索)系统和大模型被集成在了一起,它会首先根据用户词从外部的文本数据中检索与当前任务相关的信息,然后利用这些信息和用户词一起构建一个更丰富的上下文信息,从而生成回答或完成任务。

191BF910-61EE-4CBA-AA66-188DA4C77D7B.png

RAG(中文为检索增强生成) = 检索技术 + LLM 提示

RAG(Retrieval-Augmented Generation)的详细过程主要包括以下步骤:

  1. 输入:首先,RAG接收一个输入,这个输入可以是一个问题、一个句子或者一个段落,取决于具体的任务需求。
  2. 检索阶段:RAG模型会从预先构建的知识库或文档集合中检索出与输入相关的文档或片段。这个过程通常使用一个检索模型,例如基于BM25的模型或者基于向量空间模型的最近邻搜索。检索到的文档或片段将作为上下文信息,供下一阶段的生成模型使用。
  3. 上下文整合:检索到相关文档或片段后,RAG模型会将这些文档与输入整合在一起,形成一个统一的上下文。
  4. 生成阶段:在这个阶段,RAG模型会使用一个预训练的生成模型(例如GPT-3)来生成回答或输出。这个过程是条件生成的,意味着生成的文本不仅依赖于输入,还依赖于检索阶段提供的上下文信息。生成模型会考虑这些上下文信息,以生成一个与输入相关,且在内容上更准确和可靠的回答或输出。
  5. 输出:最后,RAG模型会输出生成的文本。这个输出应该充分考虑了检索到的相关文档中的信息,从而减少了幻觉现象,提高了生成文本的准确性和可靠性。

通过这种结合检索和生成的方式,RAG模型能够在生成过程中利用更多的外部知识,从而提高生成文本的质量,并减少生成模型的幻觉现象。然而,RAG模型的效果往往依赖于检索阶段的效果,如果检索阶段不能提供足够相关和有用的文档或片段,那么生成阶段的效果可能会受到影响。因此 ,如何优化检索阶段的效果,是RAG模型的一个重要研究方向,也是一个非常大的挑战

检索技术

RAG中模型的检索阶段主要用于从大规模知识库或文档集合中检索与输入问题或文本相关的文档或片段。这个阶段主要决定了最终的效果。

目前主流的检索技术包括以下几种:

  1. 基于关键词的检索:这种方法主要依赖于关键词匹配来检索相关文档。一个常用的技术是BM25,它是一种基于词频-逆文档频率(TF-IDF)的信息检索算法。BM25为每个文档计算一个得分,该得分表示文档与查询之间的相关性。然后,根据得分对文档进行排序,并返回最相关的文档。
  2. 基于向量空间的检索:这种方法使用词嵌入或句子嵌入技术将文本表示为高维向量。对于输入问题或文本,也计算其向量表示。然后,使用余弦相似度或欧几里得距离等度量方法计算输入向量与文档向量之间的相似性。最后,根据相似性得分对文档进行排序,并返回最相关的文档。常用的向量表示方法包括Word2Vec、GloVe、BERT等。
  3. 基于深度学习的检索:这种方法使用深度学习模型(如神经网络)来学习输入问题或文本与文档之间的相关性。训练时,模型学习从输入问题或文本到相关文档的映射。在检索阶段,模型根据输入计算每个文档的相关性得分,并返回最相关的文档。这种方法通常需要大量的有标签训练数据,以便模型能够学习到有效的映射。
  4. 混合检索技术:在实际应用中,可能会将以上多种检索技术结合在一起,以实现更高效和准确的检索。例如,可以先使用基于关键词的检索方法进行粗略筛选,然后使用基于向量空间的检索方法进一步优化结果。

向量数据库

向量数据库是一种专门用于存储和检索高维向量数据的数据库。与传统的关系型数据库或文档数据库不同,向量数据库针对向量数据的特点进行了优化,以实现高效的相似性搜索和最近邻查询。

向量数据库的过程通常是把资料或者文档等所有内容转化成向量(这个过程称之为 Vector Embedding),然后当用户发起检索时,会将用户的搜索内容转换成向量,然后在数据库中搜索最相似的向量,匹配最相似的几个上下文,最后将上下文返回。

64FE8AC3-A89E-434A-B0AF-60D23CBF58FE.png

近似最近邻算法

向量数据库中的搜索算法主要用于实现最近邻搜索,即在高维向量空间中找到与给定向量最接近的其他向量。

各种向量搜索层出不穷的目的在于提升效率,这主要有两个方向:1. 降低向量大小(降维、降低长度)2. 缩小搜索空间。

以下是一些常见的ANN(Approximate Nearest Neighbors)算法实现:

  1. KD树(K-Dimensional Tree):KD树是一种空间划分树,用于在多维空间中组织数据。KD树的搜索过程可以高效地剪枝,从而减少搜索空间。然而,KD树在处理高维数据时效率会降低。
  2. 球树(Ball Tree):球树是一种以超球体来划分空间的树形数据结构,比KD树更适合处理高维数据。球树可以更好地处理数据的内在结构,从而提高搜索效率。
  3. 局部敏感哈希(Locality-Sensitive Hashing,LSH):LSH是一种哈希方法,可以将相近的点映射到相同或相近的哈希桶。LSH适用于大规模数据的相似性搜索,但精度较低。
  4. 乘积量化(Product Quantization):乘积量化是一种用于大规模最近邻搜索的向量量化方法。乘积量化可以将高维向量映射到紧凑的代码,从而大幅度减少存储和计算需求。
  5. 层次化导航(Hierarchical Navigable Small World,HNSW):HNSW是一种基于图的搜索方法,利用小世界网络的性质来加速最近邻搜索。HNSW可以处理大规模高维数据,且在精度和效率之间有良好的平衡。

向量数据库产品

目前市场上有许多向量数据库可供选择,包括开源和商业产品。一些常见的向量数据库包括:

  1. Faiss:由Facebook AI Research开发的一款高性能的向量数据库。Faiss提供了多种索引结构和算法,支持大规模的相似性搜索和最近邻查询。
  2. Annoy:由Spotify开发的一款近似最近邻搜索库,适用于推荐系统和其他需要高效相似性搜索的场景。
  3. Milvus:一个开源的向量数据库,提供多种索引和查询算法,支持分布式部署和可扩展性。
  4. Weaviate:一个开源的、实时的、可扩展的和基于语义的向量搜索引擎。Weaviate允许用户通过RESTful API或者GraphQL API进行数据的存储、检索和搜索。
  5. Elasticsearch:虽然Elasticsearch主要是一个文档数据库,但它也支持向量数据的存储和相似性搜索。通过内置的向量字段类型和相似性度量函数,Elasticsearch可以实现基本的最近邻查询。

RAG的架构

实现检索增强生成系统的方案很多,实践过程中我们可以参考具体的需求和数据的细微差别。下面是一个常用的工作流程,加深对于流程的基本理解。

BE908360-A55B-4A3F-A89A-E850DE98FE5C.png

代码实现

使用langchain加载文档

python
复制代码
import requests
from langchain.document_loaders import TextLoader

url = "xxx"
res = requests.get(url)
with open("test.txt", "w") as f:
    f.write(res.text)

loader = TextLoader('./test.txt')
documents = loader.load()

对文档切分,保证处于LLM窗口限制之下

python
复制代码
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

嵌入并存储这些文本块,使用 Weaviate 向量数据库

python
复制代码
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
import weaviate
from weaviate.embedded import EmbeddedOptions

client = weaviate.Client(
  embedded_options = EmbeddedOptions()
)

vectorstore = Weaviate.from_documents(
    client = client,
    documents = chunks,
    embedding = OpenAIEmbeddings(),
    by_text = False
)

检索并增强生成

python
复制代码
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser

template = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:
"""
prompt = ChatPromptTemplate.from_template(template)

print(prompt)

retriever = vectorstore.as_retriever()

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

rag_chain = (
    {"context": retriever,  "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

query = "阿司匹林的主要药理作用是什么?"
rag_chain.invoke(query)

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

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

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

相关文章

无人棋牌室软硬件方案

先决思考 软件这一套确实是做一套下来,可以无限复制卖出,这个雀氏是一本万利的买卖。 现在肯定是有成套的方案,值不值得重做?为什么要重做? 你想达到什么效果?还是需要细聊的。 做这个东西难度不高&…

✌粤嵌—2024/3/18—搜索插入位置

代码实现&#xff1a; 二分法&#xff1a; 方法一&#xff1a;非递归&#xff0c;左闭右闭 int searchInsert(int *nums, int numsSize, int target) {int l 0, r numsSize - 1; // 左闭右闭int mid;while (l < r) {mid (l r) / 2;if (nums[mid] target) {return mid;}…

plc数据采集网关

在信息化与工业化深度融合的今天&#xff0c;数据采集成为了推动制造业智能化转型的重要基石。其中&#xff0c;PLC数据采集网关作为连接PLC设备与上层管理系统的桥梁&#xff0c;扮演着至关重要的角色。 一、PLC数据采集网关&#xff1a;定义与重要性 PLC数据采集网关是一种…

3D视觉引导麻袋拆垛破包 | 某大型化工厂

客户需求 此项目为大型化工厂&#xff0c;客户现场每日有大量麻袋拆垛破包需求&#xff0c;麻袋软包由于自身易变形、码放垛型不规则、运输后松散等情况&#xff0c;无法依靠机器人示教位置完成拆垛。客户遂引入3D视觉进行自动化改造。 工作流程&#xff1a; 3D视觉对紧密贴合…

论文略读:Window Attention is Bugged: How not to Interpolate Position Embeddings

iclr 2024 reviewer 打分 6666 窗口注意力、位置嵌入以及高分辨率微调是现代Transformer X CV 时代的核心概念。论文发现&#xff0c;将这些几乎无处不在的组件简单地结合在一起&#xff0c;可能会对性能产生不利影响问题很简单&#xff1a;在使用窗口注意力时对位置嵌入进行插…

基于ARX结构(模加运算循环移位异或运算)的密码杂凑算法Lemon512

基于ARX结构(模加运算&循环移位&异或运算)的密码杂凑算法Lemon512 黄金龙 QQ1435271638 密码杂凑算法 密码杂凑算法也称作“散列算法”或“哈希算法”,现在的密码行业标准统称其为密码杂凑算法,简称“杂凑算法”或“杂凑函数”。密码杂凑算法对任意长度的消息进行…

鱼哥推荐书籍第18期:《推荐系统》算法 案例与大模型

鱼哥推荐书籍第18期&#xff1a;《推荐系统》算法 案例与大模型 什么是推荐系统&#xff1f;推荐系统解决了哪些问题&#xff1f;推荐系统的应用领域常用的推荐算法&#xff1a;基于内容的推荐算法协同过滤算法&#xff1a; 如何系统学习推荐系统&#xff1a;第一部分&#xff…

【Java探索之旅】数组使用 初探JVM内存布局

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、数组的使用1.1 元素访问1.2 数组遍历 二、JVM的内存布局&#x1f324;️全篇总结 …

聚道云软件连接器助力企业实现滴滴出差报销自动化

一、客户介绍 某机械有限公司是一家在机械设备制造领域拥有深厚底蕴和卓越实力的企业。自公司成立以来&#xff0c;该公司始终秉承创新、务实、高效的发展理念&#xff0c;专注于机械设备的研发、生产和销售。经过多年的发展&#xff0c;公司已成为国内机械行业的佼佼者&#…

PyQt介绍——弹框介绍和使用

PyQt介绍——弹框介绍和使用 一、QMessageBox QMessageBox是一种通用的弹出式对话框&#xff0c;用于显示消息&#xff0c;允许用户通过单击不同的标准按钮对消息进行反馈 QMessageBox类提供了许多常用的弹出式对话框&#xff0c;如提示、警告、错误、询问、关于等对话框。这…

软考证书有用吗?软考证书的含金量大吗?

一、以考代评 通过考试并获得相应级别计算机专业技术资格&#xff08;水平&#xff09;证书的人员&#xff0c;表明其已具备从事相应专业岗位工作的水平和能力&#xff0c;用人单位可根据《工程技术人员职务试行条例》有关规定和工作需要&#xff0c;从获得计算机专业技术资格…

诺奖得主与巨资“铸剑”:两年内,Pasqal冲刺量子计算的商业化大关

PASQAL的量子计算机 几年前&#xff0c;中性原子技术似乎是最不可能取得突破的领域。因为它们没有电荷&#xff0c;这使得控制它们显得尤为困难。然而&#xff0c;随着哈佛大学和麻省理工学院的最新研究进展&#xff0c;以及像QuEra这样的私营初创公司的努力&#xff0c;中性原…

修改百度百科的词条的方法

百度百科作为国内最大的百科全书网站之一&#xff0c;是广大网民获取各类知识的重要途径之一。所以&#xff0c;如何修改百度百科的词条成为了很多人关心的话题。本文将介绍修改百度百科的方法&#xff0c;并提供一些技巧和注意事项。 注册百度账号 首先&#xff0c;进入百度百…

2024/4/6—力扣—简化路径

代码实现&#xff1a; // 分割/得到名字 char **split(const char *s, int *returnSize) {int n strlen(s);char **ans (char **)malloc(sizeof(char *) * n);int l 0, r 0, len 0;while (r < n) {while (r < n && s[r] /) {r;}l r;while (r < n &…

Flask前端页面文本框展示后端变量,路由函数内外两类

一、外&#xff01;路由函数外的前后端数据传输 Flask后端 ↓ 首先导入包&#xff0c;需要使用 后端&#xff1a;flask_socketio来进行路由外的数据传输&#xff0c; from flask_socketio import SocketIO, emit 前端&#xff1a;还有HTML头文件的设置。 <!DOCTYPE …

面试突击---MySQL索引

面试突击---MYSQL索引 面试表达技巧&#xff1a;1、谈一下你对于mysql索引的理解&#xff1f;&#xff08;为什么mysql要选择B树来存储索引&#xff09;2、索引有哪些分类&#xff1f;3、聚簇索引与非聚簇索引4、回表、索引覆盖、最左匹配原则、索引下推&#xff08;1&#xff…

实验案例二:配置路由器实现互通

一.实验环境 实验用具包括两台路由器&#xff08;或交换机)&#xff0e;一根双绞线缆&#xff0c;一台PC&#xff0c;一条Console线缆。 二.需求描述 如图6.14所示&#xff0c;将两台路由器的Gig0/0接口相连&#xff0c;通过一台PC连接设备的Console端口并配置IP地址&#x…

跟风Spring的context继承风格写的一个业务处理器,无聊

忽然记起spring的context的N重继承风格&#xff0c;一个抽象类实现一部份功能&#xff0c;想从那重改复写就从哪重开始。脑子一抽&#xff0c;也在业务代码里面玩了下。效果嘛。学得是有模有样&#xff0c;感觉就是越搞越复杂。有点过度设计了&#xff0c;折腾个啥呢。哈哈哈……

防止企业数据泄密的四种有效措施

防止企业数据泄密的四种有效措施 泄密大案每天都在上演&#xff0c;受害者既有几十人的小型企业&#xff0c;也有上万人的世界500强&#xff0c;为什么这些企业都难逃数据泄露的噩梦呢&#xff1f;我们应该采取什么措施来防止信息泄密呢&#xff1f; 首先我们来看看数据泄密的…

聚贤帮赵远峰:照亮希望 激励奋斗

在2023年河北涿州灾情爆发后,聚贤帮的一众学员深入困难群众中去,力所能及贡献自己的一份力量。其实早在2022年4月,聚贤帮的许多成员就曾多次踏入山区,开展慈善活动,用自己的力量为当地居民带来温暖和关爱。 “照亮希望,激励奋斗”成为了大家慈善活动的信仰。通过捐款和物资,聚…