编者按:随着大语言模型的广泛应用,如何存储和高效检索这些模型产生的大量向量表示成为一个较为关键的问题。本文深入探讨了向量数据库在提升语言模型应用性能方面的作用,并介绍了不同类型向量数据库的特点。
本文以简明扼要的方式全面概述了向量数据库的工作机制、应用场景和评估方法,对于在生产环境中应用语言模型的从业者具有重要的参考价值。作者首先阐述了向量表示在语言模型中的重要性,以及向量数据库如何通过语义缓存、长期记忆等机制增强语言模型的能力。然后,文章详细介绍了基于图的、基于文档的和键值型三种主流向量数据库,分析它们各自的应用场景和优缺点。
在生产环境部署语言模型应用时,作者建议从多个维度评估不同数据库的适用性。文章还提供了向量数据库基准测试和集成的最佳实践,帮助读者做出正确选择。
以下是译文,enjoy!
作者 | Stephen Oladele
编译 | 岳扬
图片来源:unsplash[1]
语言模型(Language models)是一种功能强大的人工智能算法,它们能够根据输入的 prompt 生成类似人类编写的文本。语言模型是在大量文本数据上预训练的通用神经网络,在这个过程中学习到了语言中的统计规律和关系(statistical patterns and relationships)。GPT、BERT和LLaMA是由OpenAI、Cohere和Hugging Face等大语言模型(LLM)提供商开发的主流语言模型。
这些模型在各行各业中都有广泛应用,例如文本生成、聊天机器人、语音助手、内容创建、语言翻译、情感分析和个性化推荐等领域。语言模型的应用非常广泛,并还在不断发展和改进,为我们带来了更多新的机遇。
01 向量在语言模型应用中的重要性
在人类日常对话中,语境(Context,亦常译作“上下文”)常发挥着极为重要的作用,它帮助人们顺畅地进行交流和理解他人的话语。
语言模型通过将对话编码为一种称为“向量”的数字表示形式,来捕捉语意和语义关系,以此利用语境信息。这些向量使得模型能够理解对话出现的语境,无论是特定的文化背景表达、正在讨论的话题背景,还是其他语境线索。
在机器学习和人工智能中,向量是一个非常重要的角色,主要原因如下:
- 对话式人工智能中的语境理解能力:通过捕捉对话中词语的含义和关系,聊天机器人和虚拟助理可以生成连贯且符合语境的回复,提高交互质量。
- 高效的搜索和推荐:向量通过捕捉用户发出的查询的语境,促进语境搜索和个性化推荐的质量(contextual search and recommendations)。它们使搜索引擎和推荐系统能够检索内容相关的且符合语境的结果,提高建议的准确性和相关性。
- 帮助测量语义相似度:自然语言处理向量通过测量单词和短语之间的语义相似度,从而实现拓展查询(query expansion)、聚类(clustering)和信息检索(information retrieval)等任务。向量有助于语言模型识别相关概念,并提高语言模型在理解和生成文本方面的准确性。
图 1:展示查询(query)和嵌入文档(embedded document)之间语义相似度的简化图[2]
- 支持迁移学习:自然语言处理向量支持迁移学习,预训练的语言模型为针对特定任务或领域进行微调奠定了基础。这些向量可以捕捉从大规模训练数据中学到的知识和模式,使模型能够泛化并能适应仅有较小数据集的新任务,从而提高性能。
本文将着重介绍向量数据库以及如何在生产环境中对它们进行评估。
02 向量数据库在语言模型应用中的作用
向量数据库是一种专门设计用于存储和高效检索向量表示(vector representations)的存储系统,例如单词嵌入(word embeddings)或文本数据的数字表示(numerical representations of textual data)等向量表示。向量数据库还是存储与单词或短语相关联的向量的仓库,可以根据相似性指标快速进行查找和比较操作。
向量数据库使得大规模向量空间的处理更加高效,同时优化了存储、检索和比较等操作。
图2. 向量数据库的类型[3]
03 向量数据库的典型特点和主要功能
数据库既能存储结构化数据,也能存储非结构化数据。关系型数据库和文档数据库通常用于存储结构化数据,如个人信息和财务数据等,但它们可能不适用于涉及非结构化数据(例如图像、文本、视频和音频)的ML/AI应用,因为这些数据的维度和大小都很高。
传统数据库可能会导致信息检索[4]出现延迟(delays in information retrieval),因此它们不太适合以自然语言处理为重点的AI应用。相比之下,向量数据库为存储和检索非结构化数据提供了更为有效的解决方案。它们可以高效地处理非结构化数据,并增强人工智能应用的能力。以下是向量数据库的主要功能:
- 高效检索(Efficient retrieval ) :向量数据库可根据查询(queries)或相似性指标(similarity measures)快速高效地检索向量表示(vector representations),使语言模型能够快速地访问向量嵌入(vector embeddings)。
- 索引和搜索(Indexing and search) :向量数据库提供索引和搜索功能,可根据具体标准(例如相似性搜索(similarity search)、最邻近搜索(nearest neighbor search)或范围查询(range queries))高效地查找和搜索向量。
- 可扩展性(Scalability): 向量数据库的设计初衷是处理大规模向量空间,它可以高效地存储和检索数百万甚至数十亿个向量。
- 相似度测量:向量数据库提供测量向量之间相似度或距离的功能,有助于完成语义相似度比较、聚类和推荐系统等任务。
- 支持高维向量:向量数据库可以处理语言模型中常见的高维向量,允许存储和检索复杂的向量表示。
向量数据库可以存储地理空间数据(geospatial data)、文本(text)、特征(features)、用户配置文件(user profiles)和与向量相关的元数据的哈希值(hashes as metadata associated with the vectors)。尽管向量数据库的设计重点是存储和查询向量数据,而非加密哈希值。
04 向量数据库如何增强语言模型应用能力?
向量数据库可显著增强语言模型应用能力,提高相关的性能指标,例如:
- 语义缓存(semantic caching)
- 长期记忆(long-term memory)
- 高性能架构(architecture)
- 整体性能(overall performance)
4.1 语义缓存
向量数据库擅长捕捉文本数据之间的语义关系和相似性。向量数据库通过存储文档、单词或短语的向量表示来实现高效的语义缓存[5]。一旦执行查询(query)并获得结果,相应的向量及其语义上下文(semantic context)就可以被缓存。之后如果出现类似的查询,就可以利用这个语义缓存来加速检索,从而缩短响应时间和提高查询性能。
4.2 长期记忆
长期记忆(long-term memory)通常可以增强语言模型的性能[6],使其能够在多次交互或查询中保留信息和上下文。向量数据库的架构,允许存储和检索与历史交互或训练数据相关的向量。这样,语言模型就能够访问和引用以前的上下文,生成更连贯和与语境更相关的响应。
4.3 高性能架构
向量数据库提供可扩展和分布式的架构[7],可以处理大规模的语言模型应用。它们支持并行处理和分布式存储,使我们能够高效地处理大量的文本数据。这种架构支持快速检索和处理向量表示,促进与语言模型的实时或准实时交互。
4.4 整体性能
向量数据库可通过多种方式提高语言模型应用的性能[8]。首先,向量表示(vector representations)可以减少相似度计算的复杂度,从而更快地检索出语义相似的文档或短语。其次,向量数据库的分布式可扩展架构可确保性能即便在数据集不断扩展的情况下也保持一致。最后,向量数据库的高效索引和检索机制增强了语言模型应用的整体能力和响应速度。
在语言模型应用中使用向量数据库,可以获得更高的性能,特别是在可扩展性和查询处理速度方面。这些改进有助于在语言驱动型应用中实现更准确、更贴近上下文的响应、更好的用户体验和更高的效率。
05 了解不同类型的向量数据库
向量数据库有多种不同的类型,如分布式向量数据库、基于处理的向量数据库(vector databases based on processing)(内存型向量数据库、GPU加速型向量数据库)或简单的向量搜索引擎。本文重点介绍以下几种:
- 基于图的向量数据库
- 基于文档的向量数据库
- 键值型向量数据库
5.1 基于图的向量数据库
基于图的向量数据库利用图结构来表示和存储向量。图中的节点或边与向量表示(vector representations)相关联。您可以使用最邻近搜索[9]、Personalized PageRank、图聚类等图算法来执行相似性搜索和遍历操作(traversal operations) 。
尽管基于图的向量数据库擅长捕捉关系(relationships),但在某些情况下,某些关系可能缺乏内在意义或相关性。在这种类型的数据库中,节点之间的关系可以基于任意的连接或关联。这说明基于图的向量数据库中并非所有的关系都有意义。
因此,需要正确地构建和设计数据库,以维系实体之间有意义的关系。这样可以更容易地查询数据库,以便更好地理解这些关系。
图 3. 一个复杂的图(graph)示意图,该图(graph)为某一个特定主题的节点和关系[10]
应用场景:
基于图的向量数据库非常适用于推荐系统、基于图的信息检索、网络映射(network mapping)和欺诈检测等领域。
(译者注:网络映射表示通过绘制网络拓扑图来描述和分析计算机网络中的设备和连接。通过进行网络映射,管理员可以更好地了解网络拓扑结构,识别潜在的安全漏洞和瓶颈,并进行网络规划和优化。此外,网络映射还可以用于网络故障排除和监控。)
5.2 基于文档的向量数据库
这种数据库存储相应文档或文本的向量表示,从而实现基于文档级语义的高效索引和检索。
可以利用词袋(TF-IDF)[11]、潜在狄利克雷分配(LDA)[12]、n-gram[13]、skip-thought vectors[14]和paragraph vectors(Doc2Vec)[15]等常见技术来生成文档嵌入。
(译者注:“skip-thought vectors”方法来自论文《Skip-Thought Vectors》,文章发表于2015年的NIPS,作者来自于多伦多大学。这篇论文提出了一种训练句表示的方法,在Bert出现之前,这篇论文的方法是获得高质量句向量的常用方法。在这篇论文发表之前,获得句向量的方式主要有两种,一种是基于词袋模型的句表示,比如通过TF-IDF得到词的权重,然后对句子中的词对应的词向量加权求和得到句向量;另一种是基于神经网络的句表示,常见的有基于语言模型学习得到句向量,或者是基于复述句匹配的句表示。
Paragraph Vector(段落向量)是一种用于生成文本嵌入的算法,也称为Doc2Vec。它是Word2Vec算法的扩展,可以为整个段落或文档生成固定长度的向量表示。与传统的基于词袋模型的方法不同,Paragraph Vector可以考虑上下文信息和文档结构,从而更好地捕捉文档的语义信息。在自然语言处理中,Paragraph Vector被广泛应用于文本分类、情感分析、信息检索等任务中。在文档数据库中,Paragraph Vector可以用于生成文档嵌入,从而实现高效的文档检索和相似性匹配。)
将文档嵌入(document embeddings)输入到数据库后,它们会被索引(indexing),然后以结构化的方式进行组织和存储。这种索引使得基于相似性或相关性的文档检索变得高效。在索引期间,数据库会优化存储和检索以提高性能。
为了增强大型语言应用程序的用户体验,可以设计一种充分利用数据库功能的系统架构。当提交查找相关内容的prompt时,该prompt会被转化为嵌入并用于查询文档,以识别类似的单词或关系。这可以更容易地检索相关信息,找到有用内容,例如修复特定工具或解决难题。
图 4. 演示大型语言应用程序如何利用基于文档的向量数据库为用户查询相关内容
应用场景:
基于文档的向量数据库在文档相似性搜索(document similarity search)、文档聚类、主题建模和内容推荐等任务中被广泛应用。
5.3 键值型向量数据库
键值型向量数据库将数据与唯一的键(可以是数字或数组)进行映射,以便根据键(keys)快速查找和检索向量。这些键可以是与文档(documents)、实体(entities)或其他数据点(data points)相关的标识符。
在需要根据键直接访问特定向量时,这种存储方式非常有用。就结构而言,它们是非关系型数据库,非常灵活。存储在此数据库中的值可以是字符串、数字、二进制对象或JSON文档,具体取决于实际情况。
键值型数据库优先考虑速度和效率,并针对高性能操作(如快速数据插入(data insertion)、快速检索(retrieval)和快速更新(update))进行了优化。键值型向量数据库通常提供低延迟的数据访问,因此其适用于需要实时处理和快速响应的使用场景。
图 5. 键值型向量数据库存储方式的简单示意图
应用场景:
键值型向量数据库可用于缓存系统、近似最近邻搜索(approximate nearest neighbor searches)以及存储和检索单词嵌入等应用中。
06 比较各种向量数据库
下面对向量数据库进行的比较仅供参考,因为向量数据库的选择取决于具体的使用场景。为了选择合适的向量数据库并实现最佳性能,我们最好参考以下对比。并根据实际情况进行选择:
基于图的向量数据库
- 优点:
- 基于图的高效相似性搜索,可以捕捉嵌入之间的复杂关系,非常适和推荐系统和图分析任务(graph analysis tasks)。
- 可以计算多个维度的关系。
缺点
- 维护图结构需要额外的性能开销,可能还需要专业的图形学算法和技术知识。
- 没有标准的查询语言(query languages),语法取决于所选择的平台。
基于文档的向量数据库
- 优点:
- 可以将文档的语义信息轻松整合到数据库,实现文档的相似度计算、聚类和推荐等任务。
- 一旦创建文档,维护简单。可能只需要定期更新文档。
缺点:
- 可能无法捕捉细粒度的单词级关系(word-level relationships);仅限于文档级操作。
- 在执行模式一致性(schema consistency)、文档间一致性(cross-document consistency)方面存在限制,可能需要手动检查或应用级检查(application-level checks)。
键值型向量数据库
- 优点:
- 基于键的向量查找和检索简单高效,适用于各种应用。
- 高性能、速度快,可快速检索信息。
缺点:
- 仅限于基于键的检索,可能无法提供高级相似性搜索功能。
- 不适用于复杂的查询和数据关系(queries and data relationships)。
下表说明了本文所介绍的各种向量数据库的优缺点。
根据具体的应用场景和需求选择合适类型的向量数据库非常重要。基于图的向量数据库非常适合处理与图相关的任务,基于文档的向量数据库在文档级操作方面表现出色,而键值型向量数据库则具有很强的适应性和灵活性,适合基于键的高效检索。因此,在选择向量数据库时,需要根据实际需求和具体使用场景来进行评估和选择。
07 在生产环境中评估向量数据库
仔细评估数据库性能指标,可以帮助我们做出较为明智的决策,选择满足生产环境特定需求的数据库类型,从而提高语言模型应用程序的成功率。在评估用于生产环境的向量数据库时,有以下几个重要因素需要考虑:
- 延迟和吞吐量(Latency and throughput):需要测量响应时间(延迟)和查询处理速率(吞吐量),以评估向量检索操作的速度和效率。
- 可扩展性和数据量(Scalability and data volume):需要评估向量数据库在处理不断增加的数据量和并发用户查询时,性能是否会明显下降或资源利用率是否会明显提高。
- 查询能力(Query capabilities):需要评估向量数据库执行各种查询操作的能力,例如精确匹配、范围查询、最邻近搜索和相似性搜索,以确保其满足语言模型应用程序的要求。
- 与现有基础设施的集成(Integration with existing infrastructure):需要考虑与生产环境中使用的现有系统、编程语言和开发框架集成和兼容的难易程度。
08 如何对向量数据库进行基准测试
向量数据库的基准测试非常重要,包括设计具有代表性的评估方案,并收集相关的性能指标,以评估其是否适合语言模型应用。通过进行系统的基准测试,可以明智地选择和优化所选的向量数据库。那么,如何进行基准测试呢?
- 首先,需要设计适当的评估场景。定义具有代表性的工作负载(workloads)和使用案例(use cases),以模拟语言模型应用程序的实际应用场景。这个过程包括确定数据集的类型和大小、查询(queries)的性质以及预期的并发级别。
- 其次,需要收集相关的性能指标。在评估场景下执行基准测试,并收集性能指标,例如查询延迟、吞吐量、内存使用、CPU利用率和存储要求等。这些指标应反映语言模型应用的工作负载和可扩展性要求。
以下是两个研究案例,可以作为参考:
8.1 研究案例1:评估用于推荐系统的基于图的向量数据库
在不同数据量和并发级别下,比较基于图的向量数据库进行相似性搜索操作的延迟和吞吐量。同时,逐步增加数据集大小,以评估基于图的向量数据库的可扩展性,并评估其对查询性能的影响。最后,评估其支持基于语义相似度的个性化推荐的有效性。
图 6. 基于图的推荐系统[16]
8.2 研究案例2:评估用于文本聚类的基于文档的向量数据库
主要测试其基于向量表示对相似文档进行聚类的能力。同时,需要通过评估数据库在文档数量增加和聚类规模变化时的性能,还需要评估数据库的可扩展性。此外,需要将基于文档的向量数据库的查询能力(例如文档相似性搜索和基于主题的检索)与预定义的基准进行比较。
这些真实案例包括设置适当的评估场景、收集性能指标和分析结果,以确定向量数据库对具体语言模型应用的适用性和性能。
图 7 文本聚类[17]
09 集成向量数据库的最佳实践
集成向量数据库时,应遵循最佳实践,以确保顺利平稳的进行集成,并最大限度的提高性能。这个过程可能包括设计可扩展的架构和数据模型、优化索引和查询策略,以及考虑与现有基础架构和工具的兼容性。
以下是针对使用场景需要考虑的一些事项:
9.1 为向量数据库集成准备数据
- 清理和预处理数据,以去除可能对向量表示产生负面影响的噪声、不一致数据和无关信息。
- 应用文本归一化技术[18],如统一转化为小写、去除标点符号和处理特殊字符,以确保向量表示的一致性。
- 确定如何处理向量数据库中不存在的单词,例如使用fallback embeddings或使用subword tokenization等技术。(译者注:fallback embeddings是指在向量数据库中找不到某个单词的向量表示时,使用备用的向量表示来代替。subword tokenization是一种文本预处理技术,用于将单词分解成更小的单元,称为子词(subwords)。这种技术通常用于处理未在词汇表中出现的单词,以便在向量数据库中为这些单词生成向量表示。subword tokenization的过程是将单词分解成子词,然后将每个子词映射到其对应的向量表示,最终将所有子词的向量表示组合成单词的向量表示。这种技术可以提高向量数据库的覆盖率,从而提高检索的准确性。常见的subword tokenization算法包括Byte Pair Encoding (BPE)和WordPiece等。)
9.2 为具体应用场景选择合适的向量数据库
- 考虑可扩展性、检索速度、内存使用等因素,以及对语义相似度或近似最近邻查找等专业操作的支持。
- 比较不同的向量数据库系统,考虑其功能、性能、社区支持程度和集成能力。
- 确保所选的向量数据库与技术栈保持一致,并能够与应用程序使用的编程语言和开发框架集成。
9.3 优化向量数据库性能
- 探索向量数据库提供的不同索引技术,以优化检索效率 (如分层索引[19]、基于图的索引[20]或局部敏感哈希(LSH)[21])。
- 应用降维技术,如主成分分析(PCA)或t-SNE,以减少向量的维数,同时保留重要信息,从而提高性能。
- 微调向量数据库的参数,以平衡索引速度、存储要求和检索准确性三者的性能。
- 利用批处理技术优化向量数据的插入或更新,减少开销并提高整体性能。
9.4 确保可扩展性和可靠性
- 配置向量数据库,分配工作负载在多台机器或节点上,实现可扩展性和容错性。
- 实施负载均衡,将查询或请求平均分配到向量数据库的多个实例中,确保最佳性能。
- 设置向量数据库的复制和定期备份,确保数据的持久性、可用性和在故障恢复能力。
9.5 监控和维护向量数据库
- 持续监测向量数据库的性能指标,如查询延迟、吞吐量和资源利用率,以识别瓶颈并优化性能。
- 实施处理数据更新或更改(data updates or changes)机制,如重新索引(reindexing)或增量更新(incremental updates),以保持向量数据库持续更新。
- 执行日常维护任务,如数据库优化、索引重建和定期清理未用的数据,以确保最佳性能和稳定性。
- 通过评估下游任务的性能或使用评估数据集,来识别未被发现的问题,并进行必要的改进,从而定期监测向量表示的质量和一致性,
通过这些最佳实践,可以有效地将向量数据库集成到流水线中,以准确高效地实现向量检索,并最大化NLP应用的性能和可扩展性。
10 结语
总而言之,了解和评估向量数据库对于提升生产环境中的语言模型应用的性能非常重要。通过考虑延迟、可扩展性、查询能力以及与现有基础架构的集成等因素,我们可以在选择哪种向量数据库和向量数据库优化方案时做出明智的决策。
此外,通过对这些数据库进行基准测试并遵循最佳实践进行集成,可以进一步提升它们在LLM应用中的性能和适用性,释放其全部潜力,并在您感兴趣的领域取得有影响力的成果。
END
参考资料
1.https://unsplash.com/photos/TIUyoNGM0no
2.https://huggingface.co/learn/nlp-course/chapter5/6?fw=tf
3.https://www.pinecone.io/learn/vector-database-old/
4.https://www.geeksforgeeks.org/what-is-information-retrieval/
5.https://zilliz.com/glossary/semantic-cache
6.https://thenewstack.io/vector-databases-long-term-memory-for-...
7.https://milvus.io/blog/deep-dive-1-milvus-architecture-overvi...
8.https://thenewstack.io/how-large-language-models-fuel-the-ris...
9.https://www.cs.cmu.edu/~15451-s19/lectures/lec22-nearest-neig...
10.https://neo4j.com/blog/buzzfeed-trumpworld-dataset-neo4j/
11.https://machinelearningmastery.com/gentle-introduction-bag-wo...
12.https://www.jmlr.org/papers/volume3/blei03a/blei03a.pdf
13.https://www.analyticsvidhya.com/blog/2021/09/what-are-n-grams...,(Natural+Language+Processing)+tasks.
14.https://arxiv.org/abs/1506.06726
15.https://medium.com/wisio/a-gentle-introduction-to-doc2vec-db3...
16.https://www.nebula-graph.io/posts/use-cases-of-graph-database...
17.https://www.codeproject.com/Articles/439890/Text-Documents-Cl...
18.https://towardsdatascience.com/text-normalization-for-natural...
19.https://www.integrate.io/glossary/what-is-hierarchical-indexing/
20.https://community.neo4j.com/t/why-graph-indexing-is-important...
21.https://www.pinecone.io/learn/locality-sensitive-hashing/
本文经原作者授权,由Baihai IDP编译。如需转载译文,请联系获取授权。
原文链接:
https://mlops.community/empowering-language-model-application...