基于 Llama-Index、Llama 3 和 Qdrant,构建一个 RAG 问答系统!

news2024/11/26 10:36:36

构建一个使用Llama-Index、Llama 3和Qdrant的高级重排-RAG系统


尽管大型语言模型(LLMs)有能力生成有意义且语法正确的文本,但它们面临的一个挑战是幻觉。

在LLMs中,幻觉指的是它们倾向于自信地生成错误答案,制造出看似令人信服的虚假信息。这个问题自LLMs问世以来就普遍存在,并经常导致不准确和事实错误的输出。

为了解决幻觉问题,事实检查至关重要。一种用于为LLMs原型设计进行事实检查的方法包括三种方法:

  1. 提示工程
  2. 检索增强生成(RAG)
  3. 微调

在这种情况下,我们将利用RAG(检索增强生成)来缓解幻觉。

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

成立了大模型面试和技术交流群,相关源码、资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:来自CSDN + 技术交流

什么是 RAG?

RAG = 密集向量检索(R)+上下文学习(AG)

检索:为您的文档中提出的问题查找参考资料。

增强:将参考资料添加到您的提示中。

生成:改进对所提出的问题的回答。

在RAG中,我们通过将文本文档或文档片段的集合编码为称为向量嵌入的数值表示来处理它们。每个向量嵌入对应于一个单独的文档片段,并存储在一个称为向量存储的数据库中。负责将这些片段编码为嵌入的模型称为编码模型或双编码器。这些模型在广泛的数据集上进行了训练,使它们能够为文档片段创建强大的表示形式,即单个向量嵌入。为了避免幻觉,RAG利用了与LLMs的推理能力分开保存的事实知识源。这些知识是外部存储的,可以轻松访问和更新。

有两种类型的知识源:

  1. 参数化知识:这种知识是在训练过程中获得的,并且隐含地存储在神经网络的权重中。
  2. 非参数化知识:这种类型的知识存储在外部源中,例如向量数据库。

为什么要在微调之前使用RAG?

  1. 便宜:无需额外的训练。
  2. 更容易更新最新信息。
  3. 更可信赖,因为有事实可核查的参考资料。


优化工作流程总结了基于以下两个因素可以使用的方法:

内容优化:模型需要知道什么。
LLM优化:模型需要如何行动。

RAG 数据堆栈

📁 加载语言数据

� 处理语言数据

🤖 嵌入语言数据

🗂 将向量加载到数据库中

RAG 涉及的阶段

RAG涉及的阶段包括:

  • 数据加载:这涉及从各种来源(如文本文件、PDF、网站、数据库或API)检索数据,并将其集成到您的管道中。Llama Hub提供了各种连接器来实现此目的。

  • 索引:这个阶段侧重于为数据查询创建结构化格式。对于LLMs,索引通常涉及生成向量嵌入,这是数据含义的数值表示,以及其他元数据策略,以便促进准确和上下文相关的数据检索。

  • 存储:在索引之后,通常的做法是存储索引和相关元数据,以避免将来需要重复索引。

  • 查询:有多种方法可以利用LLMs和Llama-Index数据结构进行查询,包括子查询、多步查询和混合策略,具体取决于所选择的索引策略。

  • 评估:这一步对于评估管道的有效性以比较替代策略或在实施更改时至关重要。评估提供了关于查询响应的准确性、保真度和速度的客观指标。

我们的 RAG 堆栈是使用Llama-Index、Qdrant和Llama 3构建的。

什么是 Llama-Index?

Llama-Index作为一个旨在为带有上下文丰富的LLM应用程序开发的框架。上下文增强涉及将LLMs与您的私有或领域特定数据结合使用。

该框架的一些流行应用包括:

  • 问答聊天机器人(通常称为RAG系统,简称“检索增强生成”)
  • 文档理解和提取
  • 能够进行研究和采取行动的自治代理

Llama-Index提供了一套全面的工具,以促进这些应用程序的开发,从初始原型到生产就绪的解决方案。这些工具使数据摄取和处理成为可能,同时实现了与基于LLM的提示结合的复杂查询工作流的实施。

在这里,我们使用了 llama-index >= v0.10。

主要增强

ServiceContext已被弃用:每个LlamaIndex用户都熟悉ServiceContext,它逐渐变得过时且繁琐,用于管理LLMs、嵌入、块大小、回调以及其他功能。因此,我们完全将其弃用;现在您可以直接指定参数或设置默认值。

重新设计的文件夹结构:

  • llama-index-core:此文件夹包含所有核心Llama-Index抽象。
  • llama-index-integrations:该文件夹包括19个Llama-Index抽象的第三方集成,涵盖了数据加载器、LLMs、嵌入模型、向量存储等。
  • llama-index-packs:在这里,您将找到我们的50多个LlamaPacks集合,这些模板旨在启动用户的应用程序。

LlamaHub将成为所有集成的中央枢纽。

Llama 3

Meta的Llama 3是开放访问的Llama系列的最新版本,可以通过Hugging Face访问。

它作为响应合成的语言模型。Llama 3有两种尺寸可供选择:8B适用于在消费级GPU上进行精简部署和开发,70B适用于广泛的AI应用。每种尺寸变体都提供基础版本和指令调整版本。

此外,一种在Llama 3 8B上进行微调的新版本Llama Guard已被引入为Llama Guard 2。

什么是 Qdrant?

Qdrant是一个向量相似度搜索引擎,通过易于使用的API提供了一个生产就绪的服务。它专门用于存储、搜索和管理点(向量)以及附加负载信息。

它经过优化,可以高效地存储和查询高维向量。像 Qdrant 这样的向量数据库利用了专门的数据结构和索引技术,例如用于实现近似最近邻居和产品量化等技术的分层可导航小世界(HNSW)。

这些优化使得快速相似度和语义搜索成为可能,允许用户根据指定的距离度量找到与给定查询向量最接近的向量。Qdrant支持的常用距离度量包括欧几里得距离、余弦相似度和点积。

使用的技术栈

  • 应用程序框架:Llama-index
  • 嵌入模型:BAAI/bge-small-en-v1.5
  • LLM:Meta-Llama-3
  • 向量存储:Qdrant

代码实现

安装所需库

%%writefile requirements.txt
llama-index
llama-index-llms-huggingface
llama-index-embeddings-fastembed
fastembed
Unstructured[md]
qdrant
llama-index-vector-stores-qdrant
einops
accelerate
sentence-transformers

#
!pip install -r requirements.txt
accelerate==0.29.3
einops==0.7.0
sentence-transformers==2.7.0
transformers==4.39.3
qdrant-client==1.9.0
llama-index==0.10.32
llama-index-agent-openai==0.2.3
llama-index-cli==0.1.12
llama-index-core==0.10.32
llama-index-embeddings-fastembed==0.1.4
llama-index-legacy==0.9.48
llama-index-llms-huggingface==0.1.4
llama-index-vector-stores-qdrant==0.2.8

下载数据集

!mkdir Data
!wget "https://arxiv.org/pdf/1810.04805.pdf" -O Data/arxiv.pdf

加载文档

from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader("/content/Data").load_data()

实例化嵌入模型

from llama_index.embeddings.fastembed import FastEmbedEmbedding
from llama_index.core import Settings

embed_model = FastEmbedEmbedding(model_name="BAAI/bge-small-en-v1.5")

Settings.embed_model = embed_model
Settings.chunk_size = 512

定义系统提示

from llama_index.core import PromptTemplate

system_prompt = "You are a Q&A assistant. Your goal is to answer questions as accurately as possible based on the instructions and context provided."

# This will wrap the default prompts that are internal to llama-index
query_wrapper_prompt = PromptTemplate("{query_str}")

实例化LLM

由于我们使用Llama 3作为LLM,我们需要执行以下操作:

  • 生成HuggingFace访问令牌
  • 请求使用该模型的访问权限
from huggingface_hub import notebook_login
notebook_login()

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from llama_index.llms.huggingface import HuggingFaceLLM

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")

stopping_ids = [
    tokenizer.eos_token_id,
    tokenizer.convert_tokens_to_ids(""),
]

llm = HuggingFaceLLM(
    context_window=8192,
    max_new_tokens=256,
    generate_kwargs={"temperature": 0.7, "do_sample": False},
    system_prompt=system_prompt,
    query_wrapper_prompt=query_wrapper_prompt,
    tokenizer_name="meta-llama/Meta-Llama-3-8B-Instruct",
    model_name="meta-llama/Meta-Llama-3-8B-Instruct",
    device_map="auto",
    stopping_ids=stopping_ids,
    tokenizer_kwargs={"max_length": 4096},
    # uncomment this if using CUDA to reduce memory usage
    # model_kwargs={"torch_dtype": torch.float16}
)

Settings.llm = llm
Settings.chunk_size = 512

实例化向量存储并加载向量嵌入

from IPython.display import Markdown, display
from llama_index.core import VectorStoreIndex
from llama_index.core import StorageContext
from llama_index.vector_stores.qdrant import QdrantVectorStore

client = qdrant_client.QdrantClient(
    # you can use :memory: mode for fast and light-weight experiments,
    # it does not require to have Qdrant deployed anywhere
    # but requires qdrant-client >= 1.1.1
    location=":memory:"
    # otherwise set Qdrant instance address with:
    # url="http://<host>:<port>"
    # otherwise set Qdrant instance with host and port:
    # host="localhost",
    # port=6333
    # set API KEY for Qdrant Cloud
    # api_key=<YOUR API KEY>
)

vector_store = QdrantVectorStore(client=client, collection_name="test")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)

实例化重排序模块


检索模型根据查询的嵌入相似性检索前k个文档。埌用嵌入进行检索有许多好处:

  • 它非常高效,特别是在计算点积时,因为在查询时不需要进行任何模型调用。
  • 尽管不是完美的,但嵌入可以充分编码文档和查询的语义。这导致嵌入式检索提供高度相关结果的查询子集。

然而,尽管具有这些优点,基于嵌入的检索有时可能不太准确,并返回与查询无关的上下文。这反过来降低了RAG系统的整体质量,而不论LLM的质量如何。

在这种方法中,我们实施了一个两阶段检索过程。

第一阶段采用了基于嵌入的检索,具有较高的top-k值,以优先考虑召回率,即使以较低的精度为代价。

随后,第二阶段采用了略微更具计算密集性的过程,强调精度而不是召回率。该阶段旨在“重新排列”最初检索到的候选项,增强最终结果的质量。

实例化查询引擎

import time
query_engine = index.as_query_engine(similarity_top_k=10, node_postprocessors=[rerank])

提问问题1

now = time.time()
response = query_engine.query("What is instruction finetuning?")
print(f"Response Generated: {response}")
print(f"Elapsed: {round(time.time() - now, 2)}s")

提问问题2

now = time.time()
response = query_engine.query("Describe the Feature-based Approach with BERT??")
print(f"Response Generated: {response}")
print(f"Elapsed: {round(time.time() - now, 2)}s")

提问问题3

now = time.time()
response = query_engine.query("What is SQuADv2.0?")
print(f"Response Generated: {response}")
print(f"Elapsed: {round(time.time() - now, 2)}s")

结论

在这里,我们开发了一个基于私有数据运行的高级RAG问答系统。

我们将LlamaIndex重新排列概念纳入其中,以优先考虑从检索器检索到的上下文中最相关的上下文。这种方法确保了生成响应的事实准确性。

通俗易懂讲解大模型系列

  • 重磅消息!《大模型面试宝典》(2024版) 正式发布!

  • 重磅消息!《大模型实战宝典》(2024版) 正式发布!

  • 做大模型也有1年多了,聊聊这段时间的感悟!

  • 用通俗易懂的方式讲解:大模型算法工程师最全面试题汇总

  • 用通俗易懂的方式讲解:不要再苦苦寻觅了!AI 大模型面试指南(含答案)的最全总结来了!

  • 用通俗易懂的方式讲解:我的大模型岗位面试总结:共24家,9个offer

  • 用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:一份保姆级的 Stable Diffusion 部署教程,开启你的炼丹之路

  • 用通俗易懂的方式讲解:LlamaIndex 官方发布高清大图,纵览高级 RAG技术

  • 用通俗易懂的方式讲解:为什么大模型 Advanced RAG 方法对于AI的未来至关重要?

  • 用通俗易懂的方式讲解:基于 Langchain 框架,利用 MongoDB 矢量搜索实现大模型 RAG 高级检索方法

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

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

相关文章

人脸图像生成(DCGAN)

一、理论基础 1.什么是深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Network&#xff0c;&#xff09; 深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Network&#xff0c;DCGAN&#xff09;是一种生成对抗网络&#xf…

跨域问题(服务器和浏览器之间)待补充

一、为什么产生&#xff1a; 同源策略&#xff08;域名&#xff0c;协议&#xff0c;端口&#xff09;&#xff0c;安全问题 二、怎么解决&#xff1a; 1、cros:修改响应头 2、jp&#xff1a;采用js标签 3、代理&#xff08;创建服务器&#xff0c;定义规则&#xff0c;服…

十二届蓝桥杯Python组1月中/高级试题 第五题

** 十二届蓝桥杯Python组1月中/高级试题 第五题 ** 第五题&#xff08;难度系数 5&#xff0c;35 个计分点&#xff09; 提示信息&#xff1a; 平均数&#xff1a;是指在一组数据中所有数据之和再除以这组数据的个数。 如&#xff1a;“1&#xff0c;2&#xff0c;3&#xf…

安防监控/视频汇聚系统EasyCVR+AI智能分析助力解决校园霸凌事件

一、方案背景 校园霸凌这一校园中不应存在的现象&#xff0c;却屡见不鲜&#xff0c;它像一把锋利的刀&#xff0c;深深地刺入那些无辜的心灵&#xff0c;让受害者承受着无尽的痛苦。随着科技的进步与发展&#xff0c;我们应该追求有效、进步的手段来阻止校园霸凌事件的发生&a…

达坦科技@了你,并邀请你参加2024开源之夏!

开源之夏&#xff08;英文简称“OSPP”&#xff09;是中科院软件所“开源软件供应链点亮计划”指导下的系列暑期活动。达坦科技自开源之夏创办首期起每年参与&#xff0c;积极鼓励在校学生积极参与开源软件的开发维护&#xff0c;培养和发掘更多优秀的开发者。今年&#xff0c;…

超越机械抓手:看多指机器人如何灵活运用触觉?

论文标题&#xff1a; Learning Visuotactile Skills with Two Multifingered Hands 论文作者&#xff1a; Toru Lin, Yu Zhang, Qiyang Li, Haozhi Qi, Brent Yi, Sergey Levine, and Jitendra Malik 1. 机器人新挑战&#xff1a;多指手指操作 在自动化和智能化日益普及的…

【Vulhub靶场】Nginx 中间件漏洞复现

【Vulhub靶场】Nginx 中间件漏洞复现 一、Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09;1. 影响版本2. 漏洞原理3. 漏洞复现 二、Nginx越界读取缓存漏洞&#xff08;CVE-2017-7529&#xff09;1. 漏洞详情2. 影响版本3. 漏洞复现 三、Nginx 配置错误导致漏洞&…

预告 | 飞凌嵌入式邀您共聚2024上海充换电展

第三届上海国际充电桩及换电站展览会&#xff08;CPSE&#xff09;&#xff0c;即将于5月22日~24日在上海汽车会展中心举行。届时&#xff0c;飞凌嵌入式将带来多款嵌入式核心板、开发板、充电桩TCU以及储能EMS网关产品&#xff0c;与来自全国的客户朋友及行业伙伴一同交流分享…

基于R语言绘图 | 转录代谢趋势图绘制教程

原文链接&#xff1a;基于R语言绘图 | 转录代谢趋势图绘制教程 本期教程 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组下游分析等内容。凡事在社群同学&#xff0c;可免费获得自2021年11月份至今全部…

【ArcGIS Pro微课1000例】0058:玩转NetCDF多维数据集

一、NetCDF介绍 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。NetCDF广泛应…

羊大师:当代年轻人如何应对压力

羊大师&#xff1a;当代年轻人如何应对压力 当代年轻人面临各种压力&#xff0c;包括工作、学习、人际关系、经济等方面的压力。以下是一些建议&#xff0c;帮助年轻人应对这些压力&#xff1a; 认识并接受压力&#xff1a; 首先要认识到压力是生活中不可避免的一部分。 尝试…

WPF之DataGird应用

1&#xff0c;DataGrid相关属性 GridLinesVisibility&#xff1a;DataGrid网格线是否显示或者显示的方式。HorizontalGridLinesBrush&#xff1a;水平网格线画刷。VerticalGridLinesBrush&#xff1a;垂直网格线画刷。HorizontalScrollBarVisibility&#xff1a;水平滚动条可见…

卷积通用模型的剪枝、蒸馏---蒸馏篇--RKD关系蒸馏(以deeplabv3+为例)

本文使用RKD实现对deeplabv3+模型的蒸馏;与上一篇KD蒸馏的方法有所不同,RKD是对展平层的特征做蒸馏,蒸馏的loss分为二阶的距离损失Distance-wise Loss和三阶的角度损失Angle-wise Loss。 一、RKD简介 RKD算法的核心是以教师模型的多个输出为结构单元,取代传统蒸馏学习中以教…

【经验总结】 常用的模型优化器

优化器是一种用于优化模型权重和偏差的算法&#xff0c;它根据训练数据更新模型参数&#xff0c;以模型的预测结果更加准确。 1. 常见的优化器 SGD&#xff08;Stochastic Gradient Descent&#xff09;&#xff1a;SGD是一种基本的优化算法&#xff0c;它在每次迭代中随机选择…

借势吃货节趣味小游戏的效果是什么

吃货节对食品、餐饮等行业厂家/商家来说非常利好&#xff0c;借势节日气氛能更快达成预期营销效果&#xff0c;除了传统方式外&#xff0c;线上趣味互动游戏营销也是重要形式。 搜索【雨科】平台拥有多款吃货节趣味抽奖h5小游戏形式&#xff0c;不同玩法和内容承载、渠道传播用…

简单的Python HTML 输出

1、问题背景 一名初学者在尝试将 Python 脚本输出到网页上时遇到了一些问题。他当前使用 Python 和 HTML 进行开发&#xff0c;并且遇到了以下问题&#xff1a; 担心自己的代码过于复杂&#xff0c;尤其是 WebOutput() 函数。希望通过 JavaScript 使用 HTML 模板文件更新数据。…

48. UE5 RPG 实现攻击伤害数字显示

在前面的文章中&#xff0c;我们实现了对敌人的攻击的受击效果&#xff0c;并且能够降低目标的血量&#xff0c;实现死亡效果。相对于正常的游戏&#xff0c;我们还需要实现技能或者攻击对敌人造成的伤害数值&#xff0c;并直观的显示出来。 所以&#xff0c;接下来&#xff0c…

【JAVA】JAVA的垃圾回收机制详解

对于Java的垃圾回收机制&#xff0c;它是Java虚拟机&#xff08;JVM&#xff09;提供的一种自动内存管理机制&#xff0c;主要负责回收不再使用的对象以释放内存空间。垃圾回收机制主要包括以下几个方面的内容&#xff1a; 垃圾对象的识别&#xff1a;Java虚拟机通过一些算法&…

MySQL索引优化(超详细)篇章2--索引调优

目录 1.索引失效状况2.性能分析3.表的索引信息--调整索引顺序4.删除冗余索引5.最佳左前缀法则5.1下面是一个实际的例子来说明这个概念&#xff1a; 6.数据长度和索引长度占用空间比较 1.索引失效状况 MySQL索引失效通常指的是查询语句无法有效地利用索引&#xff0c;而导致全表…

matlab打开文件对话框

在使用matlab GUI制作时&#xff0c;为了便于用户交互使用&#xff0c;经常设置文件打开对话框&#xff0c;让用户根据实际需要选择打开的文件。下面以打开一张图片为例&#xff0c;matlab代码如下&#xff1a; [temp_filepath,temp_filename]uigetfile(*.jpg,请选择要打开的图…