为什么做AI产品工程研发要充分掌握AI技术?
我在企业中成功打造过 ToC 和 ToB 的 AI 产品,深知 AI 产品从 MVP(Minimum Viable Product, 最小可用产品)到 PMF(Product-Market Fit, 产品市场契合)的演进过程中所面临的挑战。做一个 AI 产品的 Demo 容易,但要把它打造成好用的产品却极为困难。
PMF,产品和市场的最佳契合点,是产品满足市场需求令客户满意的里程碑,也是产品成功和业务增长的起点。要实现 AI 产品的 PMF,首先需要充分了解 AI 技术,明确技术的边界,避免盲目乐观或悲观,找到合适 AI 技术的应用场景。其次,深刻理解业务是关键,用户需求决定产品方向,AI 技术则是为业务服务的工具。在验证阶段,优先使用最佳 AI 模型以确保产品满足市场需求,确认后再逐步降低模型成本。
在整个过程中,要始终坚持业务优先、价值至上的原则,避免团队走向纯 AI 科研化,脱离实际应用场景做 AI 技术选型。最关键的是,通过构建 AI 产品的独特壁垒,有效抵御增长过程中竞争者的模仿与复制。

为什么选择RAG技术?
在由OpenAI ChatGPT引领的AI 2.0大模型时代, 我们见证了大模型(LLM, Large Language Model)在知识, 逻辑, 推理能力上的突破,其通识理解能力已超越许多人类专家,并且仍在飞速进步,尚未达到顶峰。
尽管大模型功能强大,但它当前仍存在幻觉、知识时效性、领域知识不足及数据安全问题的局限性。RAG(Retrieval Augmented Generation,检索增强生成)技术正是在这样的背景下应运而生,成为了当前大模型应用的重要技术方向,文档问答类 LLM RAG 应用也被认为是 AI 2.0 时代最早落地的应用类型之一。
RAG 技术使开发者能够在无需为每个特定任务重新训练或微调大模型的情况下,通过连接外部知识库和文档,为模型注入额外的非参数化知识,从而显著提升其在专业领域的能力和回答精度。RAG 技术赋予大模型在各行各业和各种垂直场景中巨大的效率和体验价值,有望成为最快涌现的“杀手级应用”,已成为大模型应用落地最热门的方向之一。

局限性
随着 ChatGPT、文心一言、通义千问、LLama 系列等大模型的广泛应用,各行业尝试将其引入业务流程。这些模型在知识、理解和推理方面展现了卓越的能力,在复杂交互场景中表现尤为突出。然而,这些模型仍然存在一些无法忽视的局限性。
其中,领域知识缺乏是最明显的问题。大模型的知识来源于训练数据,这些数据主要来自公开的互联网和开源数据集,无法覆盖特定领域或高度专业化的内部知识。信息过时则指模型难以处理实时信息,因为训练过程耗时且成本高昂,模型一旦训练完成,就难以获取和处理新信息。此外,幻觉问题是另一个显著的局限,模型基于概率生成文本,有时会输出看似合理但实际错误的答案。最后,数据安全性在企业应用中尤为重要,如何在确保数据安全的前提下,使大模型有效利用私有数据进行推理和生成,是一个具有挑战性的问题。

RAG技术的定义
RAG 技术是一种结合检索与生成的自然语言处理(NLP)模型架构。这个技术由 Facebook AI 于 2022 年提出,旨在提升生成式模型在处理开放域问答、对话生成等复杂任务中的性能。RAG 通过引入外部知识库,利用检索模块(Retriever)从大量文档中提取相关信息,并将这些信息传递给生成模块(Generator),从而生成更准确且有用的回答。
RAG 模型的核心思想在于通过检索与生成的有机结合,弥补大模型在处理领域问题和实时任务时的不足。传统的生成模型在面对复杂问题时,往往由于知识储备不足,生成出错误或无关的回答。而 RAG 通过检索模块获取相关的背景信息,使生成模块能够参考这些信息,从而生成更具可信度和准确性的答案。这种方法不仅增强了生成内容的准确性,还提高了模型在应对特定领域知识和动态信息时的适应能力。
RAG技术的应用场景
RAG 技术凭借其将检索与生成相结合的优势,可广泛应用于多个领域和场景,满足了在大模型应用中实时性、高准确性和领域专有知识获取的需求。
企业或领域知识管理与问答系统
RAG 能够实时从企业或领域的私有知识库中检索相关信息,确保生成的回答不仅准确且符合企业内部的最新动态,解决了大模型在处理特定领域知识时的局限性。
客户支持与智能客服系统
RAG 可以动态地将用户的询问与最新的产品信息、客服知识等外部数据相结合,生成的回答更加贴合客户的实际需求,且满足企业要求。
医疗、金融等对数据准确性、时效性要求极高的专业领域中尤为重要。
通过实时检索最新的研究成果、市场动态或文档资料,RAG 确保了生成的内容不仅基于最新信息,同时具备领域专有知识的深度分析能力。这些场景中,RAG 的应用有效优化了大模型的固有缺陷,为大模型应用提供了更高的可靠性和场景可落地性。
RAG标准技术流程

RAG 标准流程由索引(Indexing)、检索(Retriever)和生成(Generation)三个核心阶段组成。
索引阶段,通过处理多种来源多种格式的文档提取其中文本,将其切分为标准长度的文本块(chunk),并进行嵌入向量化(embedding),向量存储在向量数据库(vector database)中。
检索阶段,用户输入的查询(query)被转化为向量表示,通过相似度匹配从向量数据库中检索出最相关的文本块。
最后生成阶段,检索到的相关文本与原始查询共同构成提示词(Prompt),输入大语言模型(LLM),生成精确且具备上下文关联的回答。
通过这一流程,RAG 实现了检索与生成的有机结合,显著提升了 LLM 在领域任务中的准确性和实时性。
索引是 RAG 系统的基础环节,包含四个关键步骤。
首先,将各类数据源及其格式(如书籍、教材、领域数据、企业文档等,txt、markdown、doc、ppt、excel、pdf、html、json 等格式)统一解析为纯文本格式。
接着,根据文本的语义或文档结构,将文档分割为小而语义完整的文本块(chunks),确保系统能够高效检索和利用这些块中包含的信息。
然后,使用文本嵌入模型(embedding model),将这些文本块向量化,生成高维稠密向量,转换为计算机可理解的语义表示。
最后,将这些向量存储在向量数据库 (vector database) 中,并构建索引,完成知识库的构建。这一流程成功将外部文档转化为可检索的向量,支撑后续的检索和生成环节。
检索是连接用户查询与知识库的核心环节。首先,用户输入的问题通过同样的文本嵌入模型转换为向量表示,将查询映射到与知识库内容相同的向量空间中。通过相似度度量方法,检索模块从向量数据库中筛选出与查询最相关的前 K 个文本块,这些文本块将作为生成阶段输入的一部分。通过相似性搜索,检索模块有效获取了与用户查询切实相关的外部知识,为生成阶段提供了精确且有意义的上下文支持。
生成是 RAG 流程中的最终环节,将检索到的相关文本块与用户的原始查询整合为增强提示词(Prompt),并输入到大语言模型(LLM)中。LLM 基于这些输入生成最终的回答,确保生成内容既符合用户的查询意图,又充分利用了检索到的上下文信息,使得回答更加准确和相关,充分使用到知识库中的知识。通过这一过程,RAG 实现了具备领域知识和私有信息的精确内容生成。
RAG与微调的选择

在大模型专业领域场景的应用中,RAG 与微调都是可行的选择,选择的关键在于应用场景更注重外部知识的需求还是模型领域能力的需求。
RAG 擅长于高效整合外部知识,尤其在频繁处理实时信息,或者需要回答复杂且依赖外部知识的问题、回答需要具备可解释性需求时,RAG 通过结合检索系统和生成模型,能够实时利用最新信息,生成上下文相关且准确的答案。因此,当应用场景对外部知识的利用有较高需求时,RAG 是更为适宜的方案。
微调更适合需求稳定、领域知识固定且不需要频繁更新知识库的场景。通过使用特定领域的数据对模型进行深度优化,微调可以提升模型在特定任务或领域中的推理能力,确保输出内容的专业性和一致性。因此,当任务侧重于某一特定领域,并且对实时信息的依赖较低时,微调更能满足这些需求。
总的来说,RAG 更适用于需要动态响应、频繁更新外部知识的场景,而微调则适合固定领域内的深度优化与推理。当应用场景中既需要利用最新的外部知识,又需要保持高水平的领域推理能力时,可以考虑结合使用 RAG 和微调,以实现最优的性能和效果。
小结
这节课我们探讨了在开发 LLM 应用时所面临的挑战及 RAG 技术价值,介绍了 RAG 技术的定义、应用场景、标准技术流程及与微调的选择。主要内容如下:
LLM 的局限性:LLM 应用场景存在领域知识缺乏、信息过时、幻觉问题和数据安全问题。
RAG 技术价值:为了解决这些局限性,RAG 利用检索外部文档提升生成结果质量,充分利用领域知识和私有数据、实时数据,减少生成不确定性,并增强数据安全。
RAG 技术定义:通过引入外部知识库,利用检索模型从大量文档中提取相关信息,Prompt 组合问题和外部信息,生成更精准且实时的回答。
RAG 应用场景:企业或领域知识管理与问答、客户支持与智能客服系统,以及医疗、金融等对数据实时性、精准性要求极高的专业领域等等。
RAG 标准流程:索引流程、检索流程、生成流程 3 个关键环节。
RAG 与微调的选择:RAG 注重高效整合外部知识,微调适合领域知识固定且对领域推理能力要求高的场景,综合上述需求的场景可以选择 RAG 与微调结合。
分块策略与Embedding技术
文档数据(Documents)经过解析后,通过分块技术将信息内容划分为适当大小的文档片段(chunks),从而使 RAG 系统能够高效处理和精准检索这些片段信息。分块的本质在于依据一定逻辑或语义原则,将较长文本拆解为更小的单元。分块策略有多种,各有侧重,选择适合特定场景的分块策略是提升 RAG 系统召回率的关键。
嵌入模型(Embedding Model)负责将文本数据映射到高维向量空间中,将输入的文档片段转换为对应的嵌入向量(embedding vectors)。这些向量捕捉了文本的语义信息,并被存储在向量库(VectorStore)中,以便后续检索使用。用户查询(Query)同样通过嵌入模型的处理生成查询嵌入向量,这些向量用于在向量数据库中通过向量检索(Vector Retrieval)匹配最相似的文档片段。根据不同的场景需求,评估并选择最优的嵌入模型,以确保 RAG 的检索性能符合要求。

为什么分块很重要
文档通常包含丰富的上下文信息和复杂的语义结构,通过将文档分块,模型可以更有效地提取关键信息,并减少不相关内容的干扰。分块的目标在于确保每个片段在保留核心语义的同时,具备相对独立的语义完整性,从而使模型在处理时不必依赖广泛的上下文信息,增强检索召回的准确性。
分块的重要性在于它直接影响 RAG 系统的生成质量。
首先,合理的分块能够确保检索到的片段与用户查询信息高度匹配,避免信息冗余或丢失。
其次,分块有助于提升生成内容的连贯性,精心设计的独立语义片段可以降低模型对上下文的依赖,从而增强生成的逻辑性与一致性。
最后,分块策略的选择还会影响系统的响应速度与效率,模型能够更快、更准确地处理和生成内容。
分块策略最大的挑战在于确定分块的大小。如果片段过大,可能导致向量无法精确捕捉内容的特定细节并且计算成本增加;若片段过小,则可能丢失上下文信息,导致句子碎片化和语义不连贯。较小的块适用于需要细粒度分析的任务,例如情感分析,能够精确捕捉特定短语或句子的细节。更大的块则更为合适需要保留更广泛上下文的场景,例如文档摘要或主题检测。因此,块大小的确定必须在计算效率和上下文信息之间取得平衡。

分块策略
最佳的分块策略取决于具体的应用场景,而非行业内的统一标准。根据场景中文档内容的特点和查询问题的需求,选择最合适该场景的分块策略,以确保 RAG 系统中大模型能够更精确地处理和检索数据。
多种分块策略从本质上来看,由以下三个关键组成部分构成:
大小:每个文档块所允许的最大字符数。
重叠:在相邻数据块之间,重叠字符的数量。
拆分:通过段落边界、分隔符、标记,或语义边界来确定块边界的位置。
上述三个组成部分共同决定了分块策略的特性及其适用场景。基于这些组成部分,常见的分块策略包括:固定大小分块(Fixed Size Chunking)、重叠分块(Overlap Chunking)、递归分块(Recursive Chunking)、文档特定分块(Document Specific Chunking)、语义分块(Semantic Chunking)、混合分块(Mix Chunking)。下面我将对这些策略逐一进行介绍。

固定大小分块
最基本的方法是将文档按固定大小进行分块,通常作为分块策略的基准线使用。
Chunk Size 100 字符(每种颜色为一个文本块,Chunk 切分可视化呈现链接:https://chunkviz.up.railway.app/)

Chunk Size 50 字符

适用场景
作为分块策略的基准线;
对大型数据集进行初步分析;
实现简单且可预测性高,分块便于管理;
适用于格式和大小相似的同质数据集,如新闻文章或博客文章。
问题
不考虑内容上下文,可能在句子或段落中断内容,导致无意义的文本块,例如上面图示中的“大模 / 型”“边际成 / 本”等词组被中断;
缺乏灵活性,无法适应文本的自然结构。
重叠分块(Overlap Chunking)
通过滑动窗口技术切分文本块,使新文本块与前一个块的内容部分重叠,从而保留块边界处的重要上下文信息,增强系统的语义相关性。虽然这种方法增加了存储需求和冗余信息,但它有效避免了在块之间丢失关键语义或句法结构。
Chunk Size 100 字符,Chunk overlap 20 字符(绿色)

适用场景
需要深入理解语义并保持上下文完整性的文档,如法律文档、技术手册或科研论文;
提升分块内容的连贯性,以提高分析质量。
问题
计算复杂度增加,处理效率降低;
冗余信息的存储和管理成为负担。
递归分块(Recursive Chunking)
通过预定义的文本分隔符(如换行符\n\n、\n ,句号、逗号、感叹号、空格等)迭代地将文本分解为更小的块,以实现段大小的均匀性和语义完整性。此过程中,文本首先按较大的逻辑单元分割(如段落 \n\n),然后逐步递归到较小单元(如句子 \n 和单词),确保在分块大小限制内保留最强的语义片段。
Chunk Size 100 字符

适用场景
需要深入理解语义并保持上下文完整性的文档,如法律文档、技术手册或科研论文;
提升分块内容的连贯性,以提高分析质量。
问题
计算复杂度增加,处理效率降低;
冗余信息的存储和管理成为负担。
文档特定分块(Document Specific Chunking)
根据文档的格式(如 Markdown、Latex、或编程语言如 Python 等)进行定制化分割的技术。此方法依据文档的特定格式和结构规则,例如 Markdown 的标题、列表项,或 Python 代码中的函数和类定义等,来确定分块边界。通过这种方式,确保分块能够准确反映文档的格式特点,优化保留这些语义完整的单元,提升后续的处理和分析效果。
Chunk Size 100 字符,Markdown 特定分块

Chunk Size 100 字符,Python 特定分块

这种方法可以根据特定的文档结构,进行准确的语义内容切分,在编程语言、Markdown、Latex 等结构文档中表现出色。但文档特定分块的方式格式依赖性强,不同格式之间的分块策略不通用,并且无法处理格式不规范及混合多种格式的情况。
语义分块(Semantic Chunking)
基于文本的自然语言边界(如句子、段落或主题中断)进行分段的技术,需要使用 NLP 技术根据语义分词分句,旨在确保每个分块都包含语义连贯的信息单元。语义分块保留了较高的上下文保留,并确保每个块都包含连贯的信息,但需要更多的计算资源。常用的分块策略有 spaCy 和 NLTK 的 NLP 库,spaCy 适用于需要高效、精准语义切分的大规模文本处理,NLTK 更适合教学、研究和需要灵活自定义的语义切分任务。
spaCy 语义分块

适用场景
确保每个文档块的信息完整且语义连贯;
提高检索结果的相关性和准确性;
适用于复杂文档和上下文敏感的精细化分析。
问题
需要额外的高计算资源,特别是在处理大型或动态变化的文档数据时;
处理效率降低。
混合分块(Mix Chunking)
混合分块是一种结合多种分块方法的技术,通过综合利用不同分块技术的优势,提高分块的精准性和效率。
例如,在初始阶段使用固定长度分块快速整理大量文档,而在后续阶段使用语义分块进行更精细的分类和主题提取。根据实际业务场景,设计多种分块策略的混合,能够灵活适应各种需求,提供更强大的分块方案。
适用场景
适用于多层次的精细化分块场景;
数据集动态变化,包含多种文档格式与结构;
平衡处理速度与准确性的场景。
问题
实现复杂度高;
策略调优难度高;
资源消耗增加。
什么是词嵌入
Embedding 嵌入是指将文本、图像、音频、视频等形式的信息映射为高维空间中的密集向量表示。这些向量在语义空间中起到坐标的作用,捕捉对象之间的语义关系和隐含的意义。通过在向量空间中进行计算(例如余弦相似度),可以量化和衡量这些对象之间的语义相似性。
在具体实现中,嵌入的每个维度通常对应文本的某种特征,例如性别、类别、数量等。通过多维度的数值表示,计算机能够理解并解析文本的复杂语义结构。例如,“man”和“woman”在描述性别维度上具有相似性,而“king”和“queen”则在性别和王室身份等维度上表现出相似的语义特征。
向量是一组在高维空间中定义点的数值数组,而嵌入则是将信息(如文本)转化为这种向量表示的过程。这些向量能够捕捉数据的语义及其他重要特征,使得语义相近的对象在向量空间中彼此邻近,而语义相异的对象则相距较远。
向量检索(Vector Retrieval)是一种基于向量表示的搜索技术,通过计算查询向量与已知文本向量的相似度来识别最相关的文本数据。向量检索的高效性在于,它能在大规模数据集中快速、准确地找到与查询最相关的内容,这得益于向量表示中蕴含的丰富语义信息。

Embedding Model嵌入模型
自 2013 年以来,word2vec、GloVe、fastText 等嵌入模型通过分析大量文本数据,学习得出单词的嵌入向量。近年来,随着 transformer 模型的突破,嵌入技术以惊人的速度发展。BERT、RoBERTa、ELECTRA 等模型将词嵌入推进到上下文敏感的阶段。这些模型在为文本中的每个单词生成嵌入时,会充分考虑其上下文环境,因此同一个单词在不同语境下的嵌入向量可以有所不同,从而大大提升了模型理解复杂语言结构的能力。
在 RAG 系统中,Embedding Model 嵌入模型扮演着关键角色,负责将文本数据映射到高维向量空间,以便高效检索和处理。具体而言,Embedding Model 将输入的文档片段(Chunks)和查询文本(Query)转换为嵌入向量(Vectors),这些向量捕捉了文本的语义信息,并可在向量空间中与其他嵌入向量进行比较。
在 RAG 流程中,文档首先被分割成多个片段,每个片段随后通过 Embedding Model 进行嵌入处理。生成的文档嵌入向量被存储在 VectorStore 中,供后续检索使用。用户查询会通过 Embedding Model 转换为查询嵌入向量,这些向量用于在向量数据库中匹配最相似的文档片段,最终组合生成指令(Prompt),大模型生成回答。

正如图中所示,嵌入模型是 RAG 流程的核心。既然如此重要,市面上有非常多的嵌入模型,我们该如何为我们的业务场景选择最合适的嵌入模型呢?
Embedding Model嵌入模型评估
在选择适合的嵌入模型时,需要综合考虑多个因素,包括特定领域的适用性、检索精度、支持的语言、文本块长度、模型大小以及检索效率等因素。同时以广泛受到认可的 MTEB(Massive Text Embedding Benchmark)和 C-MTEB(Chinese Massive Text Embedding Benchmark)榜单作为参考,通过涵盖分类、聚类、语义文本相似性、重排序和检索等多个数据集的评测,开发者可以根据不同任务的需求,评估并选择最优的向量模型,以确保在特定应用场景中的最佳性能。


榜单每日更新,上图展示的是 2024 年 8 月 28 日的榜单。点击“Overall”,切换语言为 Chinese,可以看到中文嵌入模型的排名。由于 RAG 是一项检索任务,我们需要按“Retrieval Average”(检索平均值)列对排行榜进行排序,图中显示的就是检索任务效果排序后的结果。在检索任务中,我们需要在榜单顶部看到最佳的检索模型,并且专注于以下几个关键列:
Retrieval Average 检索平均值:较高的检索平均值表示模型更擅长在检索结果列表中将相关项目排在较高的位置,检索效果更好。
Model Size 模型大小:模型的大小(以 GB 为单位)。虽然检索性能随模型大小而变化,但要注意,模型大小也会对延迟产生直接影响。因此,在选择模型时,建议筛选掉那些在硬件资源有限的情况下不可行的过大模型。在生产环境中,性能与效率之间的权衡尤为重要。
Max Tokens 最大 Token 数:可压缩到单个文本块中的最大 Token 数。因为文档块我们希望不要过大而降低目标信息块的精准度,因此,即使最大 tokens 数为 512 的模型在大部分场景下也足够使用。
Embedding Dimensions:嵌入向量的维度。越少的嵌入维度提供更快的推理速度,存储效率更高,而更多的维度可以捕获数据中的细微特征。我们需要在模型的性能和效率之间取得良好的权衡。
实验至关重要,在排行榜上表现良好的模型不一定在你的任务上表现良好,试验各种高得分的模型至关重要。我们参考 MTEB 排行榜,选择多个适合我们场景的嵌入模型作为备选,并在我们的业务场景数据集上进行评估测试,以选出最适合我们 RAG 系统的嵌入模型。
向量数据库
分类
第一类是开源的专用向量数据库,如 Chroma、Vespa、LanceDB、Marqo、Qdrant 和 Milvus,这些数据库专门设计用于处理向量数据。
第二类是支持向量搜索的开源数据库,如 OpenSearch、PostgreSQL、ClickHouse 和 Cassandra,它们是常规数据库,但支持向量搜索功能。
第三类是商用的专用向量数据库,如 Weaviate 和 Pinecone,它们专门用于处理向量数据,但属于商业产品或通过商业许可获得源码。
第四类是支持向量搜索的商用数据库,如 Elasticsearch、Redis、Rockset 和 SingleStore,这些常规数据库支持向量搜索功能,同时属于商业产品或可通过商业许可获得源码。

为什么需要向量数据库

传统数据库通常分为关系型(SQL)数据库和非关系型(NoSQL)数据库,其中存储复杂、非结构化或半结构化信息的需求主要依赖于非关系型数据库的能力。图中展示了三种非关系型数据库类型与向量数据库:
键值数据库(Key-Value):通常用于简单的数据存储,通过键来快速访问数据。
文档数据库(Document):用于存储文档结构的数据,如 JSON 格式。
图数据库(Graph):用于表示和存储复杂的关系数据,常用于社交网络、推荐等场景。
向量数据库(Vector):用于存储和检索基于向量表示的数据,用于 AI 模型的高维度和复杂的嵌入向量。
那在什么场景下该选择什么样的数据库呢?举个例子,如果你想要找到一本特定的书,只需通过书名来精准定位信息,键值数据库是最理想的选择。而如果你需要查询一本书的详细章节内容、作者简介等复杂的结构化信息,文档数据库则更为适用。如果你的目标是了解书籍之间的推荐关系,或者探索作者之间的合作网络,图数据库可以高效存储和查询这些复杂的关系数据。最后,如果你希望找到与某本书内容相似的书籍,比如基于主题、风格等特征进行相似性搜索,向量数据库则能够通过计算书籍内容语义在向量空间中的距离,为你提供语义最相关的数据信息。
向量数据库的核心在于其能够基于向量之间的相似性,快速、精确地定位和检索数据。这类数据库不仅为向量嵌入提供了优化的存储和查询功能,同时也继承了传统数据库的诸多优势,如性能、可扩展性和灵活性,满足了充分利用大规模数据的需求。相比之下,传统的基于标量的数据库由于无法应对数据复杂性和规模化处理的挑战,难以有效提取洞察并实现实时分析。
向量数据库的主要优势体现在以下几个方面:
数据管理:向量数据库提供了易于使用的数据存储功能,如插入、删除和更新操作。与独立的向量索引工具(如 Faiss)相比,这使得向量数据的管理和维护更加简便,因为 Faiss 需要额外的工作才能与存储解决方案集成。
元数据存储和筛选:向量数据库能够存储与每个向量条目关联的元数据,用户可以基于这些元数据进行更细粒度的查询,从而提升查询的精确度和灵活性。
可扩展性:向量数据库设计旨在应对不断增长的数据量和用户需求,支持分布式和并行处理,并通过无服务器架构优化大规模场景下的成本。
实时更新:向量数据库通常支持实时数据更新,允许动态修改数据以确保检索结果的时效性和准确性。
备份与恢复:向量数据库具备完善的备份机制
向量数据库是如何工作的
向量数据库是一种专门用于存储和检索多维向量的数据库类型,与传统的基于行列结构的数据库不同,它主要处理高维空间中的数据点。传统数据库通常处理字符串、数字等标量数据,并通过精确匹配来查询数据。然而,向量数据库的操作逻辑则是基于相似性搜索,即在查询时,应用特定的相似性度量(如余弦相似度、欧几里得距离等)来查找与查询向量最相似的向量。
向量数据库的核心在于其高效的索引和搜索机制。为了优化查询性能,它采用了如哈希、量化和基于图形的多种算法。这些算法通过构建如层次化可导航小世界(HNSW)图、产品量化(PQ)和位置敏感哈希(LSH)等索引结构,显著提升了查询速度。这种搜索过程并非追求绝对精确,而是通过近似最近邻(ANN)算法在速度与准确性之间进行权衡,从而实现快速响应。
向量数据库的索引结构可以理解为一种预处理步骤,类似于为图书馆中的书籍编制索引,方便快速找到所需内容。HNSW 图通过在多层结构中将相似向量连接在一起,快速缩小搜索范围。PQ 则通过压缩高维向量,减少内存占用并加速检索,而 LSH 则通过哈希函数将相似向量聚集在一起,便于快速定位。
向量数据库的搜索机制不是追求精确匹配,而是通过近似最近邻(ANN)算法在速度与准确性之间找到最佳平衡。ANN 算法通过允许一定程度的误差,在显著提高搜索速度的同时,依然能够找到与查询相似度较高的向量。这种策略对于需要实时、高精度响应的应用场景尤为重要。
向量数据库的工作流程涵盖了从数据处理、向量化、向量存储、向量索引到最终检索的全链条操作,确保在复杂的数据环境中实现高效的存储、索引和相似性搜索。具体流程如下:

数据处理与向量化原始数据首先被处理并转化为向量嵌入。这一步通过嵌入模型实现,模型利用深度学习算法提取数据的语义特征,生成适合后续处理的高维向量表示。
向量存储转化后的向量嵌入存储在数据库中。这一环节确保数据在高效检索的同时,能够以优化的方式管理和维护存储资源,以适应不同规模和复杂度的应用需求。
向量索引存储的向量嵌入需要经过索引处理,以便在后续查询中快速定位相关数据。索引过程通过构建特定的结构,使得数据库能够在大规模数据集上实现高效的查询响应。
向量搜索在接收到查询后,数据库通过已建立的索引结构执行相似性搜索,找出与查询向量最为接近的数据点。这一阶段的重点在于平衡搜索的速度与准确性,确保在大数据环境下提供快速且相关的查询结果。常见的向量搜索方法包括余弦相似度、欧几里得距离和曼哈顿距离。其中,余弦相似度主要用于文本处理和信息检索,关注向量之间的角度,以捕捉语义相似性;欧几里得距离则测量向量之间的实际距离,适用于密集特征集的聚类或分类;而曼哈顿距离则通过计算笛卡尔坐标中的绝对差值之和,适用于稀疏数据的处理。
数据检索最后,数据库从匹配的向量中检索出对应的原始数据,并根据特定的需求进行必要的后处理。这一步骤确保最终结果能够准确反映用户的查询意图,并提供有意义的输出。
在 RAG 系统中,向量数据库起着重要的作用。其主要功能在于索引过程中,建立高效的向量索引结构,以便快速定位与查询相关的向量数据。在查询阶段,系统将输入的提示转化为向量表示形式,并从数据库中检索出与之最相关的向量及其对应的分块数据。通过这种索引和检索机制,检索到的向量为生成模型提供了必要的上下文信息,使模型能够依据当前的语义上下文生成更加精准和相关的响应。

常用的向量数据库

根据上面所示特点,对于需要快速开发和轻量化部署的项目,Chroma、Qdrant 是不错的选择。而对于追求高性能和可扩展性的企业级应用,可以考虑 Milvus/Zilliz。FAISS 是适合对性能有极致要求、不要求持久化和数据管理的场景。Weaviate、LanceDB 在处理多模态数据方面表现突出,适用于需要管理多种数据类型(如图像、文本、音频等)的 AI 应用。如果需要无缝集成现有数据库并进行向量搜索,PGVector、Elasticsearch、Redis 是理想的方案。而不希望管理基础设施的用户则可以选择 Pinecone 这样的全托管服务。
混合检索和重排序
当前主流的 RAG 检索方式主要采用向量检索(Vector Search),通过语义相似度来匹配文本切块。这种方法在我们之前的课程中已经深入探讨过了。然而,向量检索并非万能,它在某些场景下无法替代传统关键词检索的优势。
例如,当你需要精准搜索某个订单 ID、品牌名称或地址,或者搜索特定人物或物品的名字(如伊隆·马斯克、iPhone 15)时,向量检索的准确性往往不如关键词检索。此外,当用户输入的问题非常简短,仅包含几个单词时,比如搜索缩写词或短语(如 RAG、LLM),语义匹配的效果也可能不尽理想。
这些正是传统关键词检索的优势所在。关键词检索(Keyword Search)在几个场景中表现尤为出色:精确匹配,如产品名称、姓名、产品编号;少量字符的匹配,用户习惯于输入几个关键词,而少量字符进行向量检索时效果可能较差;以及低频词汇的匹配,低频词汇往往承载了关键意义,如在“你想跟我去喝咖啡吗?”这句话中,“喝”“咖啡”比“你”“吗”更具重要性。

在上述案例中,虽然依靠关键词检索可以精确找到与“订单 12345”匹配的特定信息,但它无法提供与订单相关的更广泛上下文。另一方面,语义匹配虽然能够识别“订单”和“配送”等相关概念,但在处理具体的订单 ID 时,往往容易出错。
混合检索(Hybrid Search)通过结合关键词检索和语义匹配的优势,可以首先利用关键词检索精确定位到“订单 12345”的信息,然后通过语义匹配扩展与该订单相关的其他上下文或客户操作的信息,例如“12 开头的订单、包装破损严重”等。这样不仅能够获取精确的订单详情,还能获得与之相关的额外有用信息。
在 RAG 检索场景中,首要目标是确保最相关的结果能够出现在候选列表中。向量检索和关键词检索各有其独特优势,混合检索通过结合这多种检索技术,弥补了各自的不足,提供了一种更加全面的搜索方案。仅具备混合检索的能力还不足以满足需求,检索到的结果还需要经过优化排序。
重排序(Reranking)的目的是将混合检索的结果进行整合,并将与用户问题语义最契合的结果排在前列。在上述案例中,由于缺乏有效的排序,我们期望的结果位于第一和第四位,尽管依然可以被检索到,但理想情况下,如果检索方式更为精确,该结果应该被优先排序在前两位。

在这个案例中,我们通过重排序技术成功找到了与问题语义最契合的结果。系统评分显示,“订单 12345 于 2023 年 8 月 15 日在上海,客户不满意。”与“该 12 开头的订单客户不满意的地方在于包装破损严重。”这两个文档块的相关性分别为 0.9 和 0.8,排序为第一和第二位。
重排序技术在检索系统中扮演着至关重要的角色。即使检索算法已经能够捕捉到所有相关的结果,重排序过程依然不可或缺。它确保最符合用户意图和查询语义的结果优先展示,从而提升用户的搜索体验和结果的准确性。通过重排序,检索系统不仅能找到相关信息,还能智能地将最重要的信息呈现在用户面前。
混合检索实际上并没有严格限定必须包含哪几种检索方式。这节课我们以向量检索和关键词检索的组合为例,但实际上可以包含多种检索方式的组合。如果我们将其他搜索算法结合在一起,也同样可以称为“混合检索”。例如,可以将知识图谱技术用于检索实体关系,并与向量检索技术相结合。更多的 RAG 检索方式还包括多重提问检索、上下文压缩检索、集成检索、多向量检索、自查询检索等,每种检索方式说明如下:

重排序优势
优化检索结果
在 RAG 系统中,初始的检索结果通常来自于向量搜索或基于关键词的检索方法。然而,这些初始检索结果可能包含大量的冗余信息或与查询不完全相关的文档。通过重排序技术,我们可以对这些初步检索到的文档进行进一步的筛选和排序,将最相关、最重要的文档置于前列。
增强上下文相关性
RAG 系统依赖于检索到的文档作为生成模型的上下文。因此,上下文的质量直接影响生成的结果。重排序技术通过重新评估文档与查询的相关性,确保生成模型优先使用那些与查询最相关的文档,从而提高了生成内容的准确性和连贯性。
应对复杂查询
对于复杂的查询,初始检索可能会返回一些表面上相关但实际上不太匹配的文档。重排序技术可以根据查询的复杂性和具体需求,对这些结果进行更细致的分析和排序,优先展示那些能够提供深入见解或关键信息的文档。
重排序模型
RAG 流程有两个概念,粗排和精排。粗排检索效率较快,但是召回的内容并不一定强相关。而精排效率较低,因此适合在粗排的基础上进行进一步优化。精排的代表就是重排序(Reranking)。
重排序模型(Reranking Model)查询与每个文档块计算对应的相关性分数,并根据这些分数对文档进行重新排序,确保文档按照从最相关到最不相关的顺序排列,并返回前 top-k 个结果。

与嵌入模型不同,重排序模型将用户的查询(Query)和文档块作为输入,直接输出相似度评分,而非生成嵌入向量。目前,市面上可用的重排序模型并不多,商用的有 Cohere,开源的有 BGE、Sentence、Mixedbread、T5-Reranker 等,甚至可以使用指令(Prompt)让大模型(GPT、Claude、通义千问、文心一言等)进行重排,大模型指令参考如下:
以下是与查询 {问题} 相关的文档块:
[1] {文档块1}
[2] {文档块2}
(更多文档块)请根据这些文档块与查询的相关性进行排序,以 “1,2,3,4”(文档块数字及逗号隔开的形式),输出排序结果。
在生产环境中使用重排序模型会面临资源和效率问题,包括计算资源消耗高、推理速度慢以及模型参数量大等问题。这些问题主要源于重排序模型在对候选项进行精细排序时,因其较大参数量而导致的高计算需求和复杂耗时的推理过程,从而对 RAG 系统的响应时间和整体效率产生负面影响。因此,在实际应用中,需要根据实际资源情况,在精度与效率之间进行平衡。
评论