基于云原生向量数据库 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 相关工具进行模糊搜索,与全局搜索相比,牺牲了一定的精度来实现毫秒级的搜索,进一步提高了查询效率。

PieCloudVector 架构设计

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

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 store
    embedding=embedding_function,  # used to convert the documents into embeddings
    connection_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
相关推荐
长囧鹿2 小时前
云原生之k8s服务管理
云原生·容器·kubernetes
怡雪~3 小时前
centos7.9搭建k8s集群
云原生·容器·kubernetes
我要用代码向我喜欢的女孩表白7 小时前
k8s入门(不教部署,部署跟着文档来就行了)
云原生·容器·kubernetes
桦仔7 小时前
全新向量数据库SQL Server 2025:带你迈入AI驱动的数据未来
向量数据库·ai数据库·sql server2025
晴子呀16 小时前
微服务系列概览
微服务·云原生·架构
努力的小陈^O^16 小时前
docker学习笔记跟常用命令总结
java·笔记·docker·云原生
长囧鹿16 小时前
k8s资源对象管理
云原生·容器·kubernetes
Zoran_卓18 小时前
在k8s上部署minio
云原生·容器·kubernetes
追梦不止~18 小时前
K8S基础概念和环境搭建
云原生·容器·kubernetes
Goboy1 天前
K8s 环境下搭建 Docker + Harbor 私有镜像仓库:部署SpringBoot应用与配置指南
后端·云原生·架构