随着人工智能技术的快速发展,检索增强生成(RAG)作为一种结合检索与生成的创新技术,正在重新定义信息检索的方式,RAG 的核心原理及其在实际应用中的挑战与解决方案,通用大模型在知识局限性、幻觉问题和数据安全性等方面的不足,随后详细介绍了 RAG 通过 “检索 + 生成” 模式如何有效解决这些问题,RAG 利用向量数据库高效存储与检索目标知识,并结合大模型生成合理答案,RAG 的关键技术进行了全面解析,包括文本清洗、文本切块、向量嵌入、召回优化及提示词工程等环节,针对 RAG 系统的召回效果与模型回答质量,本文提出了多种评估方法,为实际开发提供了重要参考
一、人工智能术语或书籍
LLM,chatGPT,RAG,Agent 等等的术语,AI:Artificial Intelligence 的缩写,指 “人工智能”,AIGC:AI Generated Content 的缩写,意指由人工智能生成的内容。在算法和数码内容制作领域,AIGC 涉及使用人工智能技术生成各种形式的内容,比如文字、图像、视频、音乐,
Transformer:一种用于自然语言处理(NLP)任务的深度学习模型
BERT:Bidirectional Encoder Representations from Transformers 的缩写,是一种自然语言处理(NLP)的预训练模型
PEFT:Parameter-Efficient Fine-Tuning 的缩写,中文高效参数微调
LoRA:Low-Rank Adaptation 的缩写,一种用于微调大规模语言模型的一种技术
LLM:Large Language Model 的缩写,指 “大语言模型”
RAG:Retrieval-Augmented Generation 的缩写,指 “检索增强生成”,这是一个跨越检索和生成任务的框架,通过先从数据库或文档集合中检索到相关信息
Agent:中文叫智能体,一个能独立执行任务和做出决策的实体,在人工智能中
GPT:Generative Pre-trained Transformer 的缩写,指 “生成式预训练变换器”
LLaMA:Large Language Model Meta AI 的缩写,是由 Meta 开发的一系列大型自然语言处理模型
chatGPT:由 OpenAI 开发的一种基于 GPT(生成预训练变换模型)架构的人工智能聊天机器人
Prompt:指的是提供给模型的一段初始文本,用于引导模型生成后续的内容
Embedding:中文叫嵌入,是一种将高维数据映射到低维空间的技术,但仍尽可能保留原数据的特征和结构。嵌入技术通常用于处理和表示复杂的数据如文本、图像、音乐以及其他高维度的数据类型
二、向量数据库
非结构化数据呈现出高速增长的趋势。图片、音频、视频等非结构化数据的存储和检索需求也变得越来越多
IDC DataSphere 数据显示 IDC FutureScape:2024年中国数据和分析市场十大预测
为了更有效地管理非结构化数据,常见的做法是将其转换为向量表示,并存储在向量数据库中。这种转换过程通常被称为向量化或嵌入(Embedding)。通过将文本、图像或其他非结构化数据映射到高维向量空间,我们可以捕捉数据的语义特征和潜在关系。向量数据库通过在「向量表示」上构建索引,实现快速的相似性搜索。
向量数据库是用于存储和查询高维向量数据的数据库,通常在搜索、推荐系统、图像识别、自然语言处理等领域中广泛使用。
常用的向量数据库
1. Faiss (Facebook AI Similarity Search):
-
开发者:Facebook AI Research
-
特点:高效的相似性搜索和密集向量聚类,支持 CPU 和 GPU 加速。
-
适用场景:图像相似性搜索、大规模推荐系统等。
2. Annoy (Approximate Nearest Neighbors Oh Yeah):
-
开发者:Spotify
-
特点:基于内存的高效最近邻搜索,使用构建的可持久化树数据结构。
-
适用场景:音乐推荐、快速搜索等。
3. HNSW (Hierarchical Navigable Small World):
-
开发者:Yury Malkov(和其他社区贡献者)
-
特点:小世界图算法,高效的近似最近邻搜索,支持动态插入和删除。
-
适用场景:实时搜索和推荐系统。
4. Elasticsearch with k-NN Plugin:
-
开发者:Elastic
-
特点:在 Elasticsearch 之上添加 k-NN 搜索功能,结合全文搜索和向量搜索。
-
适用场景:综合搜索引擎,需要同时支持文本和向量查询的场景。
5. Milvus:
-
开发者:ZILLIZ
-
特点:分布式、高性能向量数据库,支持大规模数据管理和检索。
-
适用场景:图像、视频、文本等大规模向量数据的存储和检索。
6. Pinecone:
-
开发者:Pinecone
-
特点:专用于机器学习应用程序的向量数据库,易于集成和扩展。
-
适用场景:个性化推荐、语义搜索、实时机器学习应用等。
7. Weaviate:
-
开发者:SeMI Technologies
-
特点:开源的向量搜索引擎,支持上下文感知的语义搜索,扩展性强。
-
适用场景:知识图谱构建、语义搜索、推荐系统。
8. Vectara:
-
开发者:Vectara, Inc.
-
特点:基于向量的全托管搜索服务,专注于语义搜索和相关性。
-
适用场景:搜索引擎优化、自然语言处理应用。
在向量数据的存储成本、召回率等方面都面临较大的挑战。随着非结构化数据的进一步增长,成本和召回率的挑战会变得困难
1. 存储和索引优化
-
量化技术:使用向量量化(Vector Quantization, VQ)技术,例如产品量化(Product Quantization, PQ)或乘积量化(Additive Quantization, AQ),可以在保证精度的同时大幅度减少存储和计算资源。
-
压缩向量:采用哈希方法如局部敏感哈希(Locality-Sensitive Hashing, LSH)来减少存储消耗,并加速相似性搜索。
-
分布式存储:使用分布式文件系统和数据库(如 Apache Hadoop、Cassandra)可以优化存储和查询的大规模向量数据。
-
存储器级别调整:利用固态硬盘(SSD)甚至是新兴的持久化内存(Persistent Memory, PMEM)来在内存和磁盘之间找到平衡,优化存储成本。
2. 召回率优化
-
混合搜索技术:结合粗粒度和细粒度的索引,例如先使用粗滤技术快速缩小搜索范围,然后进行精确查找。
-
近似最近邻查找(ANN)算法:如 HNSW(Hierarchical Navigable Small World)图、FAISS 中使用的 ANN 算法可以在保证高召回率的基础上优化搜索速度。
-
多层次检索:分层结构的检索方法,从粗到细进行,逐步提高召回率和精度。
4. 专用硬件加速
-
GPU 和 TPU:使用专门的硬件加速器,如 GPU(图形处理单元)或 TPU(张量处理单元),以加速向量计算和相似性搜索。
-
FPGA:使用可编程门阵列(FPGA)为特定向量计算任务定制硬件加速,以提高效率和降低延迟。
5. 持续优化和更新模型
-
动态索引更新:随着非结构化数据的增长和变化,保持索引和向量表示的及时性,使用在线或增量更新的方法管理索引。
-
自适应模型:利用机器学习和深度学习模型不断优化向量表示的嵌入质量,使得向量检索更加精准有效
6. 先进的嵌入技术
-
预训练模型:使用当前的预训练语言模型(如 BERT、GPT-3)进行上下文嵌入,捕捉复杂的语义信息。
-
多模态嵌入:对于不同类型的数据(如文本、图像、视频),使用多模态嵌入模型来统一表示和处理,提升检索性能。
-
AutoGen 框架
AutoGen 是一个能让多个 Agent 进行沟通协作的 Python 开源框架。核心解决两个问题:
第一个问题:如何设计用户可定制、可重用的、能够互相协作的 Agent。AutoGen 是要设计为一个通用的能够适用多种场景的框架,在 AutoGen 的官网 Examples 中给出了在多种场景下能够解决问题的例子,此外在 git 仓库中的 notbook 目录中有 50 + 例子。有解决数学问题场景、有通过开发代码进行分析的场景(比如上一章节的列子)、还有通过五六个 Agent 讨论分析开放问题的场景。所以 Agent 的扩展能力是需要重要考虑问题,AutoGen 中通过支持多种外部工具、不同 LLM、支持 human in the loop 的方式,Agent 之间能够通信的方式来解决扩展问题。
第二个问题:如何让 Agent 能灵活支持不同模式的会话方式。不同的场景,根据复杂度、问题的类型需要不同的 Agent 会话模式。这里的 “模式” 包括了单轮对话 or 多轮对话、自动选择每轮的 speaker or 通过规则选择、通过自然语言控制逻辑 or 通过代码控制,此外设计需要考虑多个 Agent 之间如何灵活 “组网”,比如三人一组,每组一个 leader,组内互相通信,leader 能够通信的方式。
为了解决这两个问题,AutoGen 抽象了一些基础概念。
Conversable Agents
旨在用于在复杂任务中进行多轮交互。这些智能体能够理解和处理用户输入,维护上下文,并生成合适的响应。Conversable Agents 通常集成了自然语言处理技术,包括自然语言理解(NLU)和自然语言生成(NLG),以提高对话的流畅性和智能性
Conversation Programming
旨在通过自然语言与人工智能系统进行交互,来实现编程和任务自动化。这个概念试图简化编程过程,使得用户无需深厚的编程背景也能使用自然语言描述需求,进而生成可执行的代码或自动化脚本。
MetaGPT 的主要工作流程和特点包括:
-
角色定义(Role Definitions):MetaGPT 通过定义不同的角色(如产品经理、架构师、项目经理等)来封装每个角色的特定技能和业务流程。这些角色类继承自一个基础角色类,具有名称、简介、目标、约束和描述等关键属性。角色定义帮助 LLM 生成符合特定角色要求的行为。
-
任务分解(Task Decomposition):MetaGPT 将复杂的软件开发任务分解成更小、更易于管理的部分,然后将这些子任务分配给合适的智能体执行。
-
流程标准化(Process Standardization):MetaGPT 定义了一系列标准化操作,每个操作都具有前缀、LLM 代理、标准化输出模式、执行内容、重试机制等属性。这些标准化操作确保了智能体之间的协作是一致的,输出的结果也是结构化的。
-
知识共享(Knowledge Sharing):MetaGPT 通过环境日志复制消息,智能体可以根据自己的角色订阅感兴趣的消息类型。这种方式使智能体可以主动获取相关信息,而不是被动地通过对话获取。
-
端到端开发(End-to-End Development):从产品需求到技术设计,再到具体编码,MetaGPT 通过多智能体的协作可以完成整个软件开发生命周期。
RAG 的工作流程涉及 3 个主要阶段:数据准备、数据召回和答案生成。数据准备阶段包括识别数据源、从数据源提取数据、清洗数据并将其存储在数据库中。数据召回阶段包括根据用户输入的查询条件从数据库中检索相关数据。答案生成阶段则是利用检索到的数据和用户输入的查询条件生成输出结果。输出质量的高低取决于数据质量和检索策略。
-
数据准备
根据 LLM 需要处理的任务类型,数据准备通常包括识别数据源、从数据源中提取数据、清洗数据并将其存储在数据库中等环节。用于存储数据的数据库类型和准备数据的步骤可能会因应用场景和检索方法的不同而有所变化。例如,如果使用像 Faiss 这样的向量存储库,需要为数据创建嵌入并将其存储在向量存储库中;如果使用像 Elasticsearch 这样的搜索引擎,需要将数据索引到搜索引擎中;如果使用像 Neo4j 这样的图数据库,需要为数据创建节点和边,并将它们存储到图数据库中
RAG 的优点。
高质量的答案生成,降低答案生成的幻觉
RAG 的一个优点是它能够生成高质量的回答。因为在生成过程中,检索器可以从大量文档中检索问题相关的信息,然后基于这些信息生成回答。这使得整个系统能够充分利用现有知识生成更准确、更具深度的回答,也意味着模型出现幻觉答案的概率更小。
五、大模型框架
LangChain 是一个开源的应用开发框架,目前支持 Python 和 TypeScript 两种编程语言。它赋予 LLM 两大核心能力:数据感知,将语言模型与其他数据源相连接;代理能力,允许语言模型与其环境互动。
来源
-
《大模型 RAG 实战:RAG 原理、应用与系统构建》:https://m.douban.com/book/subject/37104428/
-
《从 AIGC 典型客户实践揭秘云原生向量数据库内核设计与智能创新》: https://www.infoq.cn/article/5frz8imatl9yevqjofct
-
AutoGen Blog 官网: https://microsoft.github.io/autogen/0.2/blog/
-
《AI Agent【项目实战】:MetaGPT 遇上元编程,重塑复杂多智能体协作的边界》: https://xie.infoq.cn/article/a9977d01e3131bf951ba28e72