基于云原生向量数据库 PieCloudVector 的 RAG 实践

近年来,人工智能生成内容(AIGC)已然成为最热门的话题之一。工业界出现了各种内容生成工具,能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现,归功于创新的算法、模型规模的大幅扩展,以及海量的高质量数据集。然而 AIGC 依然面临一系列挑战,检索增强生成(RAG)技术作为 LLM 的一项重要补充被提出。本文将结合实例演示,和大家一起探索基于 PieCloudVector 的 RAG 实践。

AIGC 强调内容是通过先进的生成模型,而非人类或基于规则的方法来产生的。近年来,AIGC 技术飞速发展,序列到序列的任务,已经从依赖长短期记忆网络(LSTM)转变为采用基于 Transformer 的模型,而图像生成任务,也从生成对抗网络(GANs)转向了潜在扩散模型(LDMs)。

基础模型的架构,最初由数百万参数构成,现在已经扩展到数十亿甚至数万亿参数。这些进步得益于丰富且高质量的数据集,它们为模型参数的全面优化提供了充足的训练样本。

信息检索是计算机科学中的另一个核心应用,它与内容生成不同,其目标是在海量资源中定位相关的现有对象。目前,高效的信息检索系统能够处理达到数十亿数量级的文档集合,检索技术也被应用于多种不同的模态。

尽管 AIGC 取得了巨大进步,但仍面临一些挑战,如保持知识更新、整合长尾知识以及防止私人训练数据泄露等。为了应对这些挑战,检索增强生成(RAG)的概念被提出。RAG 通过其灵活的数据存储库,可以作为非参数记忆,容易修改,能够广泛地整合长尾知识,并且能够安全地编码敏感数据。此外,RAG 还能够降低生成成本,比如减小大型生成模型的规模,支持长文本的生成,并简化某些生成步骤。

1 什么是 RAG?

检索增强生成(RAG)技术是对大型语言模型(LLM)的一项重要补充,它允许 LLM 在生成响应之前,访问超出其训练数据范围的特定领域或组织内部的权威知识库,优化 LLM 的输出,这一过程无需对模型进行重新训练,从而提供了一种成本效益高且灵活的方式来提升 LLM 的性能。通过这种方式,可以将通用的大型语言模型“定制化”,使其更好地适应特定的业务需求和用例场景。

在没有 RAG 的情况下,用户输入会直接传递给 LLM,模型将基于其训练数据或已知信息生成输出。而 RAG 的引入,为这一过程增加了一个关键的信息检索组件,当接收到用户输入时,RAG 首先利用信息检索组件,根据输入内容提取相关信息,这些信息随后作为上下文信息,与用户查询一起提供给 LLM。

LLM 结合提供的上下文信息和其训练数据,共同作用于输出的生成过程。这种结合了检索和生成的方法,不仅提高了输出的相关性和准确性,还增强了模型对特定领域知识的利用。也就是说,相比于模型重新训练和微调,RAG 会展现出以下显著优势

  • 成本效益: 与传统的模型重新训练相比,RAG 提供了一种更为经济高效的方式来引入新数据。它避免了高昂的硬件成本和计算资源消耗,使得生成式人工智能技术更加普及和易于获取。

  • 实时更新: RAG 能够实现 LLM 与社交媒体、新闻网站等实时数据源的连接,确保模型能够基于最新信息为用户提供推理结果。这种能力显著提升了模型输出内容的时效性和相关性。

  • 增强可信度: 通过 RAG,LLM 的输出可以包含对权威数据源的引用,这不仅提高了结果的可信度,也允许用户追溯至原始文档以验证信息。这种透明度有助于增强用户对生成式人工智能的信任。

  • 输入控制: RAG 允许根据任务需求和权限级别,精确控制模型的输入信息。这种灵活性确保了敏感数据的安全性,同时允许模型在保护隐私的前提下,处理不同敏感度的数据。

2 什么是 PieCloudVector?

云原生向量数据库 PieCloudVector 作为拓数派大模型数据计算系统的核心计算引擎之一,是大模型时代分析型数据库的升维之作,专为多模态大模型 AI 应用而生。

PieCloudVector 的技术路线是将业界成熟开源算法实现与自研的基于 postgres 内核的关系型数据库对接起来,拥有完整的 ACID 数据管理能力,支持标量与向量的混合查询。PieCloudVector 支持主流的近似最近邻(ANN)算法和向量编码或压缩算法,支持 SIMD/GPU 加速,并兼容 LangChain 等大模型工具生态。相较于传统数据库,PieCloudVector 实现了向量化存储和计算资源的弹性扩缩,提高了易用性和性能,增强了元数据变更功能,解决了数据一致性问题,并克服了安全性、可靠性和在线性方面的技术难题。

在架构设计方面,PieCloudVector 的每个执行器(Executor)对应一个 PieCloudVector 实例,从而实现向量存储和相似性搜索服务的高性能、可扩展性和可靠性。借助 PieCloudVector,用户不仅可以存储和管理原始数据对应的向量,还可以调用 PieCloudVector 相关工具进行模糊搜索,与全局搜索相比,牺牲了一定的精度来实现毫秒级的搜索,进一步提高了查询效率。

image.png

PieCloudVector 架构设计

在 RAG 的应用实践中,PieCloudVector 展示了一种高效的方法来结合用户查询和相关数据,以生成精确且权威的响应。以下是其 RAG 工作流程的详细步骤:

image.png

RAG 工作流程

  • 外部数据源的创建: 首先识别并集成了位于 LLM 原始训练数据集之外的新数据,这些被称为外部数据。它们可能来源于 API、数据库或文档存储库,并且可能以多种格式存在,如文件、数据库记录或文本,以及向量形式的嵌入。这些外部数据被存储在 PieCloudVector 中,其中既保留了原始文本,也保存了对应的文本嵌入信息。

  • 用户输入的处理: 对于用户提出的查询(Query),在查询外部数据源之前,对其进行预处理。这可能包括提取用户的查询文本的嵌入表示,以便通过向量相似性搜索在外部数据源中检索相关上下文数据。

  • 执行相关性搜索: 一旦用户输入被转换为嵌入向量,就可以利用这些向量在外部数据源中执行相关性搜索。PieCloudVector 支持多种高效的向量索引技术,如 HNSW、IVFFLAT、IVFQD 等,以加速这一过程。

  • 构建模型输入上下文: 利用从外部数据源检索到的与用户查询相似的数据,构建了模型的输入上下文。例如,可以选择最相似的 top k 条数据的原始文本,以此构建模型的输入上下文。

  • 模型输入: 将用户的原始查询和检索到的相关上下文信息一并作为输入提供给模型。

  • 模型输出: 模型结合用户提供的查询和检索到的上下文信息,生成响应。

接下来,我们通过一个实例,以 PieCloudVector 来存放外部数据,语言模型使用 Llama2, 基于 LangChain 实现一个完整的 RAG 工作流程。

3 基于 PieCloudVector 的 RAG 实例演示

3.1 准备外部数据源和模型

本实例所使用的外部数据来源于拓数派官网发布的一系列博客文章,这些数据已被我们整理并构建成一个内部数据集。该数据集中的每一条记录仅包含了一段独立的英文文本,其格式如下所示:

Openpie is dedicated to "Data Computing for New Discoveries" and has successfully completed three rounds of strategic financing....OpenPie's flagship product, PieCloudDB realizes cutting-edge data warehouse virtualization technology  ....With continuous innovation of artificial intelligence (AI) technology, we can observe its increasingly widespread applications ...

我们采用 LangChain 提供的 VectorStore 接口对 PieCloudVector 进行了封装,将其封装为 VectorStore 的一个实现类,以便于与 PieCloudVector 进行交互。通过使用 Langchain 的 API,我们对外部数据进行了必要的预处理,包括文本切分和提取 embedding 等步骤。处理后的数据,包括原始文本数据和对应的 embedding 数据,被存储到 PieCloudVector 中。同时,为了提高相似向量检索的效率,我们还创建了 HNSW 索引。以下是实现这一功能的核心代码:

raw_doc_path = "./RAG-data/context-text"
loader = DirectoryLoader(raw_doc_path)
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
doc_splits = text_splitter.split_documents(docs)
model_name = "BAAI/bge-base-en"
encode_kwargs = {'normalize_embeddings': True}  # set True to compute cosine similarity
embedding_function = HuggingFaceBgeEmbeddings(model_name=model_name,model_kwargs={'device': 'cuda'},encode_kwargs=encode_kwargs
)
CONNECTION_STRING = "postgresql+psycopg2://openpie@xx.xx.xx.xx:5432/openpie"
vectordb = PieCloudVector.from_documents(documents=doc_splits,  # text data that you want to embed and storeembedding=embedding_function,  # used to convert the documents into embeddingsconnection_string=CONNECTION_STRING,collection_name="docs_v1"
)
vectordb.create_hnsw_index(dims=768, index_key="HNSW32", ef_construction=40, ef_search=16)

外部数据被成功写入到 PieCloudVector 后,每条记录都由两个重要字段:embedding 和 document, 格式如下所示:

{                                                                                                                   "embedding": [-0.0087991655,-0.027009273,0.0033726105,0.018299054,0549,0.045432627,-0.038479857,...],"document": "Openpie is dedicated to 'Data Computing for New Discoveries' and ... ",
}

使用 huggingface 的 transformers 库加载 Llama2 模型,并构造任务流水线:

MODEL_NAME = "NousResearch/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME,trust_remote_code=True,use_fast=True,add_eos_token=True,
)
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME,use_safetensors=True,trust_remote_code=True,device_map='auto',load_in_8bit=True,
)
pipe = pipeline("text-generation",model=model,tokenizer=tokenizer,max_new_tokens=512,temperature=0.7,top_p=0.95,repetition_penalty=1.15,
)llm = HuggingFacePipeline(pipeline=pipe) 

3.2 推理过程

LangChain 定义了一个 Retriever 接口,对于给定的用户查询,其封装了检索相似文档的逻辑。推理阶段中,首先将基于 PieCloudVector 实现的 vectordb 实例转换为一个 Retriever 对象 。针对每个查询,该 Retriever 会在 PieCloudVector 中进行检索,返回最相似的三条数据。接着,整合大模型,外部数据源构造问答任务链。最后,输入问题执行推理任务。

retriever = vectordb.as_retriever(search_kwargs={"k": 3})
retrieval_qa_chain = RetrievalQA.from_chain_type(llm=llm,chain_type="stuff",retriever=retriever,return_source_documents=True
)query = "What is PieCloudVector? and any advantages of PieCloudVector?  please describe in short words"
response = retrieval_qa_chain(query)

使用了 RAG 后,对于问题 :

“What is PieCloudVector? and any advantages of PieCloudVector? please describe in short words”

模型的输入不仅包含了问题信息, 必要的提示,还包含了从外部数据源检索到的问题的上下文信息,具体形式如下所示:

{
"Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know,don't try to make up an answer.",'PieCloudVector vector database has the capability to perform fast queries on trillion-scale vector databases. It supports single-node multi-threaded index creation, effectively utilizing all available hardware computational resources.This results in a five-fold improvement in index creation performance, a six-fold improvement in retrieval performance, and a three-fold improvement in interactive response speed.PieCloudVector, in conjunction with Soochow Securities Xiucai GPT, forms the overall RAG architecture. PieCloudVector primarily stores the embedded vector data while also supporting storage of scalar data for applications. Additionally,  ....', 'Question: What is PieCloudVector? and any advantages of PieCloudVector?  please describe in short words',
}

3.3 推理结果

使用了 RAG 后, 对于问题:

“What is PieCloudVector? and any advantages of PieCloudVector? please describe in short words”

输出如下所示。可见 Llama2 模型根据输入的上下文信息,基本可以输出一个正确结果。

'Helpful Answer:
PieCloudVector is a distributed vector database developed by OpenPie. 
It offers high scalability, low latency, and efficient query processing, 
making it suitable for large-scale vector data analysis tasks such as 
recommendation systems, image recognition, and natural language processing.
Some key features include support for multiple indexing methods (e.g., B+ tree, hash table), 
parallelized query execution, and fault tolerance through replication and redundancy techniques. 
Overall, PieCloudVector can help organizations process massive amounts of 
unstructured data quickly and efficiently, leading to 
improved decision-making and better customer experiences.'

而如果不使用 RAG,直接将问题输入 Llama2, 得到的输出如下:

Question: What is PieCloudVector? and any advantages of PieCloudVector?  please describe in short words.
Answer: Comment: @user1095108 I've added a link to the documentation, which should answer your questions.

由于 Llama2 的训练数据中缺少与 PieCloudVector 相关的知识,这一回答是情理之中的,这实际上也反应了 RAG 技术的重要性和强大之处。RAG 通过补充模型训练数据之外的知识,显著提升了模型对特定查询的处理能力和准确性。

PieCloudVector 凭借其卓越的性能和广泛适用性,已成功在各行各业的大模型领域中落地应用,特别是在金融大模型领域展现了显著的优势。未来,拓数派将持续关注市场和技术的发展动态,不断探索和创新,聚焦数据库在多模态大模型系统中更多的应用场景。

参考链接

  1. Retrieval-Augmented Generation for AI-Generated Content: A Survey
  2. Introducing PieCloudVector: A Cloud-Native Vector Computing Engine for Large Language Models
  3. 什么是 RAG(检索增强生成)?
  4. Inference code for Llama models
  5. 快速开始 LangChain

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…

【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道

安全数据交换系统是一种专门设计用于在不同的网络、系统或组织之间安全地传输数据的软件或硬件解决方案。这种系统通常包含多种安全特性&#xff0c;以确保数据在传输过程中的保密性、完整性和可用性。 安全数据交换系统可以解决哪些问题&#xff1f; 安全数据交换系统主要解…

图分类!!!

deepwalk 使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系&#xff0c;DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样,RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问…

CogView-3-Plus:深度解锁智谱AI的图像生成新力量

一、引言&#xff1a;AI助力创意与效率的全面提升 在如今这个瞬息万变的科技时代&#xff0c;AI大模型早就不是实验室里的“神秘武器”&#xff0c;它们已经实实在在地融入到我们的日常工作中了&#xff0c;尤其是在图像生成和内容创作这块儿&#xff0c;简直是效率神器。只要几…

微软 Power Apps MDA 模型驱动应用解决Image字段查询出来缩略图问题变原图方法(c#+Plugin方式)

微软 Power Apps MDA 模型驱动应用解决Image字段查询出来缩略图问题变原图方法&#xff08;c#Plugin方式&#xff09; 在某些特定的场景中&#xff0c;需要将Image字段中的图片取出来&#xff0c;一般来说直接查询这个字段可以直接取&#xff0c;取出来的就是一个Base64格式的图…

OpenHarmony鸿蒙( Beta5.0)智能窗户通风设备开发详解

鸿蒙开发往期必看&#xff1a; 一分钟了解”纯血版&#xff01;鸿蒙HarmonyOS Next应用开发&#xff01; “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…

springboot luttuc redis 集成protobuf,手动序列化反序列化

前置需知&#xff1a; 1.本文章和网上大部分博客配置不太一样&#xff0c;各位看官要分析一下自己的需求。集成protobuf 本文章主要是手动调用protobuf的序列化方法&#xff0c;而不是交由springboot 去做&#xff0c;会偏向原生java 使用方式 2.由于为了和公司其他的项目达成…

工业机器人9公里远距离图传模块,无人机低延迟高清视界,跨过距离限制

在科技日新月异的今天&#xff0c;无线通信技术正以未有的速度发展&#xff0c;其中&#xff0c;图传模块作为连接现实与数字世界的桥梁&#xff0c;正逐步展现出其巨大的潜力和应用价值。今天&#xff0c;我们将聚焦一款引人注目的产品——飞睿智能9公里远距离图传模块&#x…

前端Excel热成像数据展示及插值算法

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏:《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 目录 &#x1f4d8; 前言 &#x1f4d8;一、热成像数…

Linux s3c2440 开发板上的操作系统实现 ubuntu

使用s3c2440开发板 使用ubuntu 1.ubuntu中的tftp&#xff0c;和nfs Trivial File Transfer Protocol,简单文件 传输协议。 通过网络在客户端与服务器之间进行简单文件 传输。提供不复杂、开销不大的文件传输服务。 Network File System&#xff0c;网络文件系统。通过 网络…

如何显示Dialog窗口

文章目录 1. 概念介绍2. 使用方法2.1 Overlay效果2.1 Dialog效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示snackBar"相关的内容&#xff0c;本章回中将介绍使用get显示Dialog.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

深入剖析嵌套调用和链式访问,以及函数的声明和定义(超全面覆盖)

1. 前情提要 在上一篇博客中&#xff0c;我们大致了解了函数的种类&#xff0c;以及自定义函数中形参和实参的具体区别 我们知道实参是需要传递给形参的&#xff0c;但其实形参和实参占据的是完全独立的内存空间 x&#xff0c;y在执行过程中会得到a和b的值&#xff0c;但是x…

Redis的数据类型以及应用场景

Redis - 数据类型 Redis是一种开源的内存数据结构存储&#xff0c;用作数据库、缓存和消息代理。 它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。 1. 字符串&#xff08;String&#xff09; Redis 的字符串&#xff08;String&#xff09;数据类型…

SQL(结构性查询语句)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、SQL是什么&#xff1f;二、DDL三、DML四、DQL五、DCL总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、SQL是什么&#xff…

Linux之Shell编程规范与变量

Shell编程规范与变量 本章结构 Shel脚本概述 Shell的作用Shel编程规范重定向与管道 Shell脚本变量 自定义变量特殊变量 Shel脚本概述 Shel脚本的概念 将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作 Shel脚本应…

二叉树(中)

目录 二叉树的基本操作 设置基本变量 获取树中结点的个数 获取叶子结点个数 获取第K层结点的个数 获取二叉树高度 检测值为value的元素是否存在 二叉树的基本操作 如果需要了解树和二叉树的基本内容&#xff0c;可以转至&#xff1a;二叉树&#xff08;上&#xff09;-CSDN…

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 大语言模型已被广泛采用&#xff0c;但推理时需要大量的GPU内…

CentOS7 使用yum报错:[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。

CentOS7 使用yum报错&#xff1a;[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。 CentOS镜像下载、VM虚拟机下载 下载地址&#xff1a;www.macfxb.cn 一、问题描述 安装完CentOS7 后 使用yum报错 如下图 二、解决方案 1.查看自己的系统架构 我的是aarch64 uname …

CCPC赛后补题-线性基

模板题&#xff1a;https://www.luogu.com.cn/problem/P3812 线性基可以用一个长度为$ \log_2N $的数组描述值域[1,N]&#xff0c;0的情况需要特判。 一个长度为64的线性基可以描述所有的64位整数。 在2024年CCPC网络赛中&#xff0c;考到了线性基。没学过&#xff0c;追悔莫…

Vulnhub靶场 DC-2

靶机地址:https://www.vulnhub.com/entry/dc-2,311/ 导入到VMware里面去, 设置NAT模式 namp扫描一下c段获取ip地址, 然后再扫描ip地址获取详细的信息 得到ip 192.168.75.134 无法访问 按照下面这个方法可以访问了 在kali上的处理 flag1 网站上就存在 提示了一个cewl工具,…