基于云原生向量数据库 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.mzph.cn/pingmian/53381.shtml

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

相关文章

用Boot写mybatis的增删改查

一、总览 项目结构: 图一 1、JavaBean文件 2、数据库操作 3、Java测试 4、SpringBoot启动类 5、SpringBoot数据库配置 二、配置数据库 在项目资源包中新建名为application.yml的文件,如图一。 建好文件我们就要开始写…

【MySQL00】【 杂七杂八】

文章目录 一、前言二、MySQL 文件1. 参数文件2. 日志文件3. 套接字文件4. pid 文件5. 表结构定义文件6. InnoDB 存储引擎文件 二、BTree 索引排序三、InnoDB 关键特性1. 插入缓冲1.1 Insert Buffer 和 Change Buffer1.1 缓冲合并 2. 两次写2. 自适应哈希索引3. 异步IO4. 刷新邻…

江协科技STM32学习- P9 OLED调试工具

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

# VMware 共享文件

VMware tools快速安装 VMware 提供了 open-vm-tools,这是 VMware 官方推荐的开源工具包,通常不需要手动安装 VMware Tools,因为大多数 Linux 发行版(包括 Ubuntu、CentOS 等)都包含了 open-vm-tools,并且已…

Linux网络编程IO管理

网络 IO 涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,一个是内核空间的内核系统,比如发生 IO 操作 read 时,它会经历两个阶段: 等待内核协议栈的数据准备就绪;将内核中的数据拷贝到用户态的…

Kafka【八】如何保证消息发送的可靠性、重复性、有序性

【1】消息发送的可靠性保证 对于生产者发送的数据,我们有的时候是不关心数据是否已经发送成功的,我们只要发送就可以了。在这种场景中,消息可能会因为某些故障或问题导致丢失,我们将这种情况称之为消息不可靠。虽然消息数据可能会…

Spring框架基础介绍2.0

目录 AOP概述 面向切面思想 优点: 核心原理: 使用案例: AOP 的基本概念 springAOP 实现 AspectJ 中常用的通知 Spring事物管理 数据库事务管理? spring 事务管理? Spring中的事物管理分为两种形式: 1、编程式事物管理 2、声明…

低空经济如此火爆,新手如何分一杯羹?

低空经济的火爆为新手提供了诸多参与和分一杯羹的机会。以下是一些具体的建议,帮助新手在这一领域找到切入点: 1. 了解行业概况与趋势 定义与范围:低空经济是指在3000米以下空域内进行各种有人和无人驾驶航空器活动的经济形态,涉…

dubbo的SPI机制

一.dubbo的SPI机制 SPI机制是一个服务发现机制,通过接口的全限定名找到指定目录下对应的文件,然后加载对应的实现类注册到系统中进行使用。 在Java原生跟mysql的驱动加载也使用了这个机制,但是他们只能进行全部实现类的加载(遍历…

最新HTML5中的文件详解

第5章 HTML5中的文件 5.1选择文件 可以创建一个file类型的input,添加multiple属性为true,可以实现多个文件上传。 5.1.1 选择单个文件 1.功能描述 创建file类型input元素,页面中不再有文本框,而是 选择文件 按钮,右侧是上次文件的名称&a…

数据分析面试题:客户投保问题分析

目录 0 场景描述 1 数据准备 2 问题分析 2.1 计算小微公司的平均经营时长 2.2 计算小微公司且角色为投保人,保险起期在18年的总保费 2.3 假设,DWD_CUSTOMER_REL客户关联关系表中,存在部分客户保单数很多,部分客户保单数很少的情况,此时DWD_CUSTOMER_BASE表关联,程序…

百度智能云向量数据库创新和应用实践分享

本文整理自第 15 届中国数据库技术大会 DTCC 2024 演讲《百度智能云向量数据库创新和应用实践分享》 在 IT 行业,数据库有超过 70 年的历史了。对于快速发展的 IT 行业来说,一个超过 70 年历史的技术,感觉像恐龙一样,非常稀有和少…

Anaconda Prompt 安装paddle2.6报错

bug描述 python 3.11.9 通过 pip install paddlepaddle2.6.1 安装后,运行 paddle.utils.run_check() 则出现下面的错误: 解决办法 方法一:使用paddle 3的版本 这里要注意我的python版本 方法二:使用低版本的python python3.9…

Lombok jar包引入和用法

大家好,今天分享一个在编写代码时的快捷方法。 当我们在封装实体类时,会使用set、get等一些方法。如下图,不但费事还影响代码的美观。 那么如何才能减少代码的冗余呢,首先lib中导入lombok的jar包并添加库。 此处我已导入&#xf…

Jenkins+Svn+Vue自动化构建部署前端项目(保姆级图文教程)

目录 介绍 准备工作 配置jenkins 构建部署任务 常见问题 介绍 在平常开发前端vue项目时,我们通常需要将vue项目进行打包构建,将打包好的dist目录下的静态文件上传到服务器上,但是这种繁琐的操作是比较浪费时间的,可以使用jenkins进行自动化构建部署前端vue 准备工作 准备…

《粮食科技与经济》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问:《粮食科技与经济》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《粮食科技与经济》级别? 答:省级。主管单位: 湖南省粮食和物资储备局 …

bat批处理实现从特定文件夹中提取文件内容并以父文件夹名存储

1、需求分析 标题是bat批处理实现从特定文件夹中提取文件内容并以父文件夹名存储。这里面我们要做的工作是: ①、批处理脚本使用的是bat文件; ②、文件夹下面有很多子文件夹,然后子文件夹下仍然有相同的文件结构,我们需要从三级…

halcon 自定义距离10的一阶导数幅图,摆脱sobel的3掩码困境

一,为什么要摆脱3的掩码 在处理图像的过程中,会用到平滑算子,很容易破坏边际,所谓的一阶导数sobel只计算掩码为3的差分,在幅度图分割中,往往是很难把握的。 举个例子-现在图像头平滑好了,缺陷…

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加…

Codeforces Round (Div.3) C.Sort (前缀和的应用)

原题: time limit per test:5 seconds memory limit per test:256 megabytes You are given two strings a and b of length n. Then, you are (forced against your will) to answer q queries. For each query, you are given a range …