RAG 如何消除大模型幻觉

什么是大模型幻觉

假设我们有一个基于大型生成模型(如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.mfbz.cn/a/548646.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 的内存管理机制

目录 Qt 的内存管理机制 Qt 的对象树 利用代码查看自动释放 Qt 的内存管理机制 Qt 的对象树 Qt 中所有的控件都是被一颗多叉树管理起来的,这样就是为了方便释放资源的时候方便释放,而我们在编写代码的时候,创建对应的控件,然…

Samtec科普 | 一文入门连接器电镀的QA

【摘要/前言】 像大多数电子元件一样,无数子元件和工艺的质量直接影响到成品的质量和性能。对于PCB级连接器,这些因素包括针脚材料、塑料类型、模制塑料体的质量、尾部的共面性、表面处理(电镀)的质量、选择正确的连接器电镀、制…

【C++算法模板】数论:欧拉筛,线性查找质数的算法

文章目录 1&#xff09;传统找质数的方法&#xff08;优化筛选次数&#xff09;2&#xff09;欧拉筛 1&#xff09;传统找质数的方法&#xff08;优化筛选次数&#xff09; bool isPrime(int num) {for(int i2;i<sqrt(num)) {if(num%i0)return false;}return true; }如果要…

跑马拉松跑成骨坏死?!马拉松赛事密集,提前了解运动损伤很重要

跑步狂热者右脚疼痛未重视 日积月累右脚终于“撑”不住了 近日&#xff0c;徐大爷来院就诊说自己半年前右脚莫名出现酸痛&#xff0c;一直没当回事&#xff0c;结果1个月前跑完步疼痛加重&#xff0c;最近严重到影响日常走路&#xff0c;无奈只能找医生。在医生的详细检查和认真…

基于arduino的ESP32上蓝牙midi音乐设备开发教程

目录 简介 开发环境 开发过程 函数介绍 相关文章 简介 首先看几个视频&#xff0c;大佬们做的东西&#xff0c;都是基于esp32。 自制卡林巴电子琴&#xff0c;可通过蓝牙连接手机库乐队 MIDI Boy【理科生的第一件乐器】_哔哩哔哩_bilibili 【Totoro】模仿“埙”的电子吹…

win11电脑驱动怎么更新,windows11更新驱动

驱动是指计算机里软件的程序,硬件的运作离不开驱动的支持,因为驱动就是使得硬件和电脑系统沟通的桥梁。既然驱动如此重要,那么不装肯定不行,如果有问题,也要及时地修复和更新。最近,有位win11用户,想要了解win11电脑驱动怎么更新?接下来,教程会带来两种更新win11驱动的…

vscode i18n Ally插件配置项

.vscode文件&#xff1a; {"i18n-ally.localesPaths": ["src/lang"], //显示语言&#xff0c; 这里也可以设置显示英文为en,// 如下须要手动配置"i18n-ally.keystyle": "nested", // 翻译路径格式 (翻译后变量格式 nested&#xff1a…

[C++初阶]类和对象(一)

1.面向过程和面向对象的区分 我们之前都是用C语言写的代码,我们知道C语言是一个面向过程的语言,但是现在我们学的时C,我们都知道C是一种面向对象的语言,那么什么叫面向过程?什么叫面向对象呢? 这里我们来举个例子: 比如我们是开饭店的&#xff0c;客人点了一道菜&#xff0c…

开源模型应用落地-LangChain试炼-CPU调用QWen1.5(一)

一、前言 尽管现在的大语言模型已经非常强大&#xff0c;可以解决许多问题&#xff0c;但在处理复杂情况时&#xff0c;仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而&#xff0c;现在可以利用langchain来使得模型的应用变得更加直接和简单。 通过langchain框…

什么是T型槽铸铁平板中内应力——河北北重厂家

T型槽铸铁平板中的内应力指的是平板内部受到的内部力&#xff0c;包括拉应力和剪应力。在T型槽铸铁平板使用过程中&#xff0c;由于自身重量、外力加载等原因&#xff0c;会产生内部应力。这些内应力是平板内部各部分之间的相互作用力&#xff0c;使得平板各部分受到不同的拉伸…

C++ 为什么不能在构造函数中调用虚函数

最近在Clion编辑器中看到构造函数中调用虚函数提示&#xff1a; Do not invoke virtual member functions from constructor 这里记录一下为什么不能在构造函数中调用虚函数。 #include <iostream> #include <string>using namespace std;class BaseClass {publi…

大模型时代:普通人该如何获利?

随着科技的飞速发展&#xff0c;我们正处在一个大模型的时代。所谓大模型&#xff0c;就是指那些拥有数十亿、甚至千亿参数的深度学习模型。这些大模型的出现&#xff0c;不仅推动了人工智能技术的进步&#xff0c;也为普通人创造了众多的获利机会。那么&#xff0c;在这个大模…

【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 成员变量&#xff08;实例变量&#xff09;类变量&#xff08;静态变量&#xff09;定义方式静态变量的使用场景 成员变量&#xff08;实例变量&#xff09; 成员变量声明在一个类中&#xff0c;但在方法、构造…

GAMS104 现代游戏引擎 2

渲染的难点可以分为一下三部分&#xff1a;如何计算入射光线、如何考虑材质以及如何实现全局光照。 渲染的难点之一在于阴影&#xff0c;或者说是光的可见性。如何做出合适的阴影效果远比想象中要难得多&#xff0c;在实践中往往需要通过大量的技巧才能实现符合人认知的阴影效…

AI数字人对话之RealChar框架源码解读

零.功能介绍 与虚拟角色(非形象)进行文本或语音会话 体验地址:RealChar. 代码库:GitHub - Shaunwei/RealChar: 🎙️🤖Create, Customize and Talk to your AI Character/Companion in Realtime (All in One Codebase!). Have a natural seamless conversation with AI…

3.3 Ax=b 的完全解

一、Ax b 在求解 A x 0 A\boldsymbol x\boldsymbol 0 Ax0 时&#xff0c;我们将其转化成 R x 0 R\boldsymbol x\boldsymbol 0 Rx0&#xff0c;将自由变量赋予特殊值&#xff08;1 或 0&#xff09;&#xff0c;主元变量即可通过回代求出。这个过程中我们没有关注右侧的 …

基于SpringBoot+Vue的在线教育系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了在线教育系统的开发全过程。通过分析在线教育系统管理的不足&#xff0c;创建了一个计算机管理在线教育系统的方案。文章介绍了在线教育系统的系统分析部…

Python基于Django的微博热搜、微博舆论可视化系统

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

【SLAM】在Win10上实现Nerf-Pytorch【GPU版】

文章目录 ReadMe安装依赖运行下载两个示例数据集:lego和fern训练一个低分辨率的Lego NeRF:训练一个低分辨率蕨类植物NeRF:更多数据集预训练模型可复现实现1、下载nerf-pytorch工程2、安装依赖3、下载数据4、运行lego NeRF:ReadMe Github链接 NeRF (神经辐射场)是一种在合成…

UE5 C++ 创建3DWidgete 血条 再造成伤害

一&#xff0e;创建 二&#xff0e;&#xff35;&#xff29;里声明变量 创建类 public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget")float CurrentHealth 100.0f;UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget"…
最新文章