在探索大语言模型(LLM)应用的新架构时,知名投资公司 Andreessen Horowitz 提出了一个观点:向量数据库是预处理流程中系统层面上最关键的部分。它能够高效地存储、比较和检索高达数十亿个嵌入(也就是向量)。
那么,为什么要如此强调向量数据库的重要性呢?这是因为计算机虽然功能强大,但并不擅长直接理解文本、图像、音频等人类友好的数据格式。通过将这些数据转换成数值型的“向量”,我们能够让计算机更高效地处理它们。而普通的数据库并不是为了处理这样的向量而设计的,尽管现在随着生成式 AI 技术的普及,它们开始逐渐支持向量操作。
在深度学习领域,大语言模型(LLM)和嵌入模型是两个非常关键的组成部分。嵌入模型是将语言转化为向量空间的模型,而大语言模型则是一种能够生成自然流畅语言的深度学习模型。现有的嵌入模型已经在检索增强生成(RAG)等应用中取得了不错的效果,但在特定领域和任务中,它们的表现仍然存在缺陷。因此,在一些特定领域的场景下,定制化的微调训练嵌入模型也比较重要,可以根据特定的业务需求进行训练,更好地理解和把握业务语境,提升整体的业务表现。但由于训练个性化嵌入模型面临着成本高、复杂度高等挑战,所以一般我们在实际的业务场景落地的时候都会选择OpenAI提供的嵌入模型或一些开源的嵌入模型,这些模型都属于预先训练好的通用型的嵌入模型,适用于一般应用的嵌入模型,对于特定场景的语义会存在一定的空白。
不过,微软的研究者们在一篇新论文中提出了一项技术,这项技术大幅降低了训练个性化嵌入模型的成本和复杂度。该技术采用开源的大语言模型而不是BERT类的编码器作为基础,简化了重训练的步骤,并利用专有专有的大语言模型自动产生带标签的训练数据。这样的研究为新的LLM应用打开了大门,也使得各个组织能够根据自己的需求打造定制化的LLM。
接下来就让我们一起来简单回顾一下,为什么向量嵌入如此关键。本文将带你了解向量、向量嵌入以及向量数据库的基础知识,并介绍如何利用大语言模型(LLM)打造定制化的 Embedding 模型。
究竟什么是向量呢?向量是通过一组固定长度的数字来表征,这组数字既反映了量的大小,也指明了方向。至少需要两个维度的数据才能构成一个向量,比如在平面上的点 [1,1]。同理,三维空间中的点可以表示为 [1,1,1]:
在机器学习领域,一个向量可能包含成千上万个维度,这已经多到我们难以直观展示。但关键在于,一旦将对象转换为数学向量,我们就可以利用向量运算进行距离测量、相似度计算和变换等操作。这些运算对于相似性搜索、聚类、分类和揭示模式与趋势等多种任务至关重要。
向量嵌入,简称“嵌入”,是将通常无法直接量化的数据对象转化为数字向量形式。这些嵌入能够在一个更紧凑的格式中捕捉到原始数据的本质属性和相互关系,它们在机器学习领域有着广泛应用。
举个例子,一个包含数百万像素点的图像,每个像素点都有其独特颜色、色调和对比度,其向量嵌入可能只包含几百或几千个数值。这样,嵌入就能在一个更低维度的空间中有效编码原始数据的重要信息,从而实现数据的高效存储、检索和计算。简单的嵌入技术可能会产生稀疏嵌入(Sparse Embeddings),这意味着向量中许多值可能是0;而更为复杂和高级的嵌入技术则能创造出稠密嵌入(Dense Embeddings),几乎不含0值。但是,稀疏嵌入的维度通常比稠密嵌入要高,因此需要更多的存储空间。
与原始数据可能的复杂性和异质性不同,嵌入旨在以一种更规范和结构化的方式捕捉数据的精髓。这一转换过程由称为嵌入模型(Embedding Model)的工具完成,通常涉及到复杂的机器学习技术。
这些模型负责处理数据对象,从中提炼出有意义的模式和关系,并生成向量嵌入,这些嵌入随后可以被算法用来执行各种任务。
当我们掌握了这些向量嵌入技术之后,它可以帮我们完成哪些任务呢?
相似性搜索:通过比较嵌入之间的相似度,我们可以在自然语言处理(NLP)领域找出内容相近的文档或是互有关联的单词。
聚类与分类:将嵌入作为机器学习模型中的输入特征,帮助算法学会如何将相似的事物归为一组,并对各种对象进行分类。
信息检索:运用向量嵌入,我们可以打造出强大的搜索引擎,快速地根据用户的搜索需求找到他们想要的文档或多媒体内容。
推荐系统:基于用户以往的喜好和行为数据,通过向量嵌入技术为用户个性化推荐商品、文章或其他媒体内容。
可视化:在二维或三维空间中展示这些嵌入,让我们能直观地看到数据之间的关系和其中的模式。
迁移学习:利用已经训练好的嵌入作为新项目的跳板,借此发挥现有知识的力量,减少我们在新任务上的训练工作量。
嵌入模型能够生成数值化表示,从而捕捉输入数据的核心特征。例如,词嵌入揭示了词汇的语义含义,而句子嵌入则揭示了句子中词与词之间的关联。图像嵌入则代表了输入图像的视觉特质。这些嵌入对于各种任务都非常有用,比如比较两个单词、句子或文本之间的相似性。
其中一个重要的应用是结合大语言模型进行检索增强生成(RAG)。在RAG中,嵌入帮助寻找和获取与用户输入相关的文档。这些文档的内容被并入用户输入中,并指导大语言模型基于这些文档生成回应。RAG允许大语言模型避免生成不相关或错误信息,并解决需要超出其训练数据集范围信息的任务。
RAG的质量极度依赖于嵌入模型的优劣。如果嵌入未能正确抓取文档特征与用户输入相匹配,那么RAG系统就无法获取到相关文档。
在专有数据上训练嵌入模型是提升其在特定应用中质量的途径之一。但现行流行的方法是一个多阶段训练过程:首先在一个包含大量弱监督文本对的数据集上通过对比学习进行训练,接着在一个规模较小但高质量、标签明确的样本集上进行微调。
这种方法存在一个问题:它需要大量工程投入来策划相关文本对,并且依赖手动收集的数据集,这些数据集往往只覆盖有限的任务和语言,这就是为什么,大多数情况下,我们使用一些通用的嵌入模型效果不太理想的原因。
生成高级检索任务的提示(来源:arxiv)
微软提出了一种新技术,它可以在一个阶段内完成嵌入训练,这与传统的两阶段训练方法不同。他们利用了像GPT-4这样的专有大语言模型(LLM)来生成适用于各种嵌入任务的合成数据。
首先,研究人员会让GPT-4生成一系列可能的任务。然后,这些任务被用来生成训练用的数据样例。
提示生成检索任务的示例(来源:arxiv)
我在ForeFront平台上对这一过程进行了简化测试。ForeFront允许用户在GPT-4和Claude的基础上,轻松创建无需编程的工作流程。在测试的第一阶段,我得到了一系列抽象的任务描述:
[
"Retrieve case law that supports or opposes a specific legal argument.",
"Find recipes based on a list of ingredients provided in the query.",
"Search for news articles related to a particular event or phenomenon.",
"Locate scholarly articles that discuss the efficacy of a certain medical treatment.",
"Identify historical documents that mention a specific figure or event.",
"Gather financial reports related to a particular industry or company.",
… (redacted)
]
进入第二阶段,我将其中一个任务描述输入给GPT-4,并指导它构造出一个包含具体用户提示以及每个包含150个词的正反例子的JSON结构。除了在一个困难负面例子的最后一句出现了些许偏差外,整个结果接近完美,但这个小错误可能会对嵌入结果造成影响:
{
"user_query": "Looking for a vegetarian chili recipe that uses black beans, quinoa, and sweet potatoes",
"positive_document": "This hearty vegetarian chili is the perfect way to warm up on a chilly day. Begin by sautéing one diced onion and three cloves of minced garlic in olive oil until translucent. Add one diced bell pepper and two diced sweet potatoes and cook until slightly soft. Stir in two cups of vegetable broth, one can of black beans (rinsed and drained), one cup of cooked quinoa, one can of diced tomatoes, and one can of tomato paste. Season with two tablespoons of chili powder, one teaspoon of cumin, and salt and pepper to taste. Let the chili simmer for 30 minutes, stirring occasionally. Serve hot, garnished with avocado, cilantro, and a squeeze of lime juice.",
"hard_negative_document": "This delicious sweet potato and black bean burrito bowl is a great vegetarian meal. Start by roasting two diced sweet potatoes in the oven with olive oil, salt, and pepper until golden and tender. Meanwhile, cook one cup of quinoa as per package instructions. In a pan, cook one can of black beans with one diced onion, two cloves of garlic, and one tablespoon of cumin until heated through. Assemble your bowls by placing a scoop of quinoa at the bottom, followed by the roasted sweet potatoes, and the black bean mixture. Top with sliced avocado, fresh cilantro, and a dollop of sour cream. While this recipe shares ingredients with the user's query, it is not a chili recipe."
}
微软的研究团队并未公开他们实验的源代码或数据集。可以参考下文提供的脚本,展示了一个极其简化的实验流程。这个流程非常灵活,你可以根据自己的需求调整模板。
https://github.com/Crossme0809/frenzyTechAI/blob/main/embedding/Generate_Examples_for_Embedding_Training.ipynb
为了让数据集更加多元化,研究人员设计并应用了多种提示模板。最终,他们通过Azure OpenAI Service使用GPT-3.5和GPT-4生成了50万个训练样例,并设计了15万个独特任务指令。整个过程消耗了大约1.8亿个Token,成本约为5000美元。
值得注意的是,研究人员选择了对开源自回归模型进行微调,而不是常见的双向编码器模型如BERT。因为这些模型已经在大规模数据集上进行了预训练,所以可以以较低成本进行嵌入任务的微调。
他们在合成数据和13个公开数据集上对方法进行了测试。通过应用各种降低成本的技术,例如LoRA(一种低秩适应技术),他们取得了令人瞩目的成果。在多个公认的基准测试中,他们不仅达到了非常好的效果,甚至在RAG和嵌入质量基准上超过了OpenAI的Ada-002和Cohere的嵌入模型。
这篇论文的核心观点是,在训练如Mistral-7B这类自回归模型进行特征嵌入任务时,并不需要经历成本高昂的对比学习预训练阶段。
研究者指出:“广泛的自回归预训练让大语言模型(LLM)能够获取到优质的文本表示,并且仅需少量进一步优化就可以将其转换成高效的特征嵌入模型。”
从他们的研究结果表明,大语言模型应当能以极低的成本生成适合进一步优化特征嵌入模型所需的训练数据。这一点对于未来大语言模型应用可能具有重要意义,它使得各种组织能够为他们的应用定制特征嵌入方式。
研究者们提出:“我们认为,生成语言建模与文本特征嵌入是一枚硬币的两面,这两项任务都要求模型对自然语言有深刻的理解。在得到一个特征嵌入任务的定义后,一个真正强大的大语言模型应该能够自主生成训练数据,随后通过简单的精调变为一个特征嵌入模型。我们的实验为这一方向的潜力提供了线索,但还需要更多的研究去深入探讨。”
在大语言模型的应用场景中,定制化的嵌入模型的训练变得尤为重要。由于RAG等应用场景的检索准确性和生成质量高度依赖于嵌入模型的质量,因此,针对特定领域和任务的个性化嵌入模型的训练变得尤为重要。然而,训练个性化嵌入模型面临着成本高昂、复杂度高等问题。微软提出了一种新的技术,可以在一个阶段内完成嵌入训练,这与传统的两阶段训练方法不同。他们利用了像GPT-4这样的专有大语言模型(LLM)来生成适用于各种嵌入任务的合成数据。这种方法可以大幅降低训练个性化嵌入模型的成本和复杂度。因此,针对特定领域和任务的个性化嵌入模型的训练将成为未来大语言模型应用的重要方向。
[1]. Improving Text Embeddings with Large Language Models
https://arxiv.org/abs/2401.00368