RAG 全链路实战(1):RAG 快速入门

向量数据库大模型关系型数据库

从本篇内容开始,我们会开启一个新的专题 —— RAG 全链路实战。

在大模型飞速发展的当下,相信大家对于 RAG 系统应该都不陌生, 它上手简单、落地难度较低、且有成熟的应用场景,可以说是传统程序员转型大模型应用开发的最佳入门方式。

但是,行业内还有一种论调,是说随着大模型的能力日趋完善、上下文长度逐渐提升,RAG 会成为一种被淘汰的技术。那么到底是不是这样呢?我们又该如何客观地评估 RAG 的定位和发展趋势呢?相信随着专题的深入,大家一定会得出自己的结论。

本篇文章作为专题的开篇,会快速介绍一下 RAG 系统核心概念与整体架构,并利用 LlamaIndex 框架,快速搭建一个简单的 RAG 系统,让大家对 RAG 有个全景式的认知。后面随着专题的推进,我们会具体拆解每一项技术,并进行针对性地改造与优化。

话不多说,我们开始吧~

  1. 什么是 RAG ==========

我们在各大技术平台、媒体专栏上,都经常听说 RAG 系统,那么到底什么是 RAG 呢?

RAG(Retrieval Augmented Generation,检索增强生成),使开发者能够在无需为每个特定任务重新训练或微调大模型的情况下,通过连接外部知识库和文档,为模型注入额外的非参数化知识,从而显著提升其在专业领域的能力和回答精度。RAG 技术赋予大模型在各行各业和各种垂直场景中巨大的效率和体验价值,有望成为最快涌现的“杀手级应用”,已成为大模型应用落地最热门的方向之一。

一句话总结:RAG 技术通过将非参数化的外部知识库、文档与大模型相结合,使模型在生成内容之前,能够先检索相关信息,从而为大模型提供私有数据与领域知识,进而生成更加完整和可信的内容。

RAG 技术主要有以下几方面的优势:

  • 领域知识与私有数据:可以基于企业的私有数据、或者行业的领域知识,构建知识库,为大模型提供有效的内容来源。

  • 数据实时更新:可以根据特定的业务需求,实时更新数据,摆脱了大模型预训练成本的限制。

  • 降低大模型幻觉:由于在生成时为大模型提供了相关的知识库文档,可以在很大程度上降低大模型的幻觉问题,基本不会出现“一本正经的胡说八道”的情况。

  • 增强数据安全:企业可以自行维护和管理知识库,增强了数据的安全性。

    广义上来说,凡是能够利用大模型的能力,来进行有效的信息检索相关的技术,都可以认为是 RAG 技术。

    下面我列出了一张图,可以全面地展示 RAG 系统的关键流程与核心技术,后面的内容也将围绕这张图片展开。

picture.image

(图片来源:黄佳@极客时间RAG训练营)

  1. RAG 系统核心流程 =============

一个功能完善的 RAG 系统,通常包含如下的核心处理流程:

picture.image

(图片来源:黄佳@极客时间RAG训练营)

我们需要重点关注以下核心组件:

  • 知识嵌入(Embedding):负责将文本知识转化为向量表示,捕捉语义信息。

  • 向量数据库(Vector DB):存储由知识嵌入模块生成的向量表示。

  • 检索器(Retriever):接收用户查询并将其转化为向量,然后从向量数据库中检索相似的文档。

  • 生成器(Generator):基于检索到的相关上下文信息生成流畅且可信的回答。

  1. 使用 LlamaIndex 快速实现简单 RAG 系统 ==============================

介绍完了 RAG 的相关概念,我们来快速上手实战一个简单的 RAG 系统,以便于建立起一个感性的认知。这里的代码细节大家无需过多关注,重点在于体会 RAG 系统的核心处理流程。

首先看下,当我们向大模型提问一个较新的问题时,如果没有经过 RAG,模型的生成结果是什么样的。

我们以 DeepSeek 模型为例:我们问它最近大火的《哪吒2》的剧情。

picture.image

picture.image

因为 DeepSeek 的预训练数据截止到2023年10月,因此 DeepSeek 基于已有的知识,无法回答这个问题。 这里也可以看出,DeepSeek 的能力确实很强,它没有像其它一些模型一样胡乱回答,而是直接告诉我们没有相关信息。

接下来,我们使用 LlamaIndex 框架,快速构建一个简单的 RAG 系统。具体代码如下:

LlamaIndex(也称为llama-index)是一个非常强大的工具,它可以帮助你构建自己的“第二大脑”资料库,将你的数据集交给AI进行索引,从而获得一个专属于你自己的AI。这个工具不仅支持各种各样的DataConnector去加载数据,后端也支持多种形式的索引,例如Faiss、Pinecone、Weaviate等。

  
import os  
  
import dotenv  
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader  
from llama_index.embeddings.huggingface import HuggingFaceEmbedding  
from llama_index.llms.deepseek import DeepSeek    
  
# 加载.env文件中的环境变量  
dotenv.load_dotenv()  
  
# 从HuggingFace上加载开源的Embedding模型  
embeddings = HuggingFaceEmbedding(  
    model_name="BAAI/bge-small-zh"  # 模型路径和名称(首次执行时会从HuggingFace下载)  
)  
  
# 创建Deepseek  
# 这里使用阿里通义百炼的DeepSeek-R1模型  
llm = DeepSeek(  
    api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",  
    model="deepseek-r1",  # 使用最新的推理模型R1  
    api_key=os.getenv("DASHSCOPE_API_KEY"),  # 从环境变量获取API key  
)  
  
# 加载文档  
documents = SimpleDirectoryReader(  
    input_files=["../docs/哪吒2/剧情介绍.txt"]).load_data()  
  
# 构建索引  
index = VectorStoreIndex.from_documents(  
    documents,  # 指定文档列表  
    embed_model=embeddings,  # 指定Embedding模型  
    # llm=llm  # 设置构建索引时的语言模型(通常可以省略)  
)  
  
# 创建问答引擎  
query_engine = index.as_query_engine(  
    llm=llm  # 设置生成模型  
)  
  
# 开始问答  
print(query_engine.query("帮我介绍下哪吒2的剧情"))  

最终生成结果如下:

  
《哪吒2:魔童闹海》延续了前作的神话世界观,围绕哪吒与敖丙在天劫后的冒险展开全新篇章。两位主角因肉身濒临消散,在太乙真人帮助下踏上重塑身躯的艰难旅程。这场救赎之旅因东海龙王与申公豹的复仇行动陷入危机——误以为敖丙身亡的龙族掀起滔天巨浪,联合海底妖兽围攻陈塘关,导致敖丙的肉身再生过程遭受致命破坏。  
  
影片通过双线叙事展现角色成长:哪吒为救挚友勇闯昆仑秘境,展现出超越宿命的热血情义;敖丙则在家族仇恨与道义抉择间挣扎,逐步挣脱身份枷锁。随着南极仙翁黑化与天庭阴谋浮出水面,两人被迫联手对抗四海龙王的惊世海啸,更需直面仙翁操控的炼丹危机。在最终决战中,他们合力摧毁关键法器,哪吒在情感爆发中突破自我,完成从叛逆魔童到守护英雄的蜕变。  
  
故事内核实现了从对抗天命到认知本我的升华,通过三位主要角色在善恶边缘的挣扎,探讨身份认同与人性复杂面,以现代视角重构传统神话,打造出兼具视觉震撼与哲学深度的动画史诗。

可以看到,经过 RAG 系统之后,我利用外挂的知识库为大模型提供数据来源,大模型就可以基于这些知识生成可靠的回答,从而增强了模型的生成能力。

  1. 小结 =====

本篇文章我们介绍了 RAG 系统的核心概念与关键组件,并使用 LlamaIndex 框架快速构建了简单的 RAG 系统,相信可以让大家快速建立起对 RAG 的整体认知。

后面,我们会针对其中的每个环节进行系统地梳理与讲解,让大家可以快速梳理 RAG 的全链路开发流程!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论