AI 概念
本节介绍 Spring AI 使用的核心概念。我们建议您仔细阅读本节,以了解 Spring AI 实现背后的理念。
模型
AI 模型是旨在处理和生成信息的算法,通常模仿人类认知功能。通过从大型数据集学习模式和见解,这些模型可以进行预测、生成文本、图像或其他输出,从而增强各个行业中的各种应用。
存在许多不同类型的 AI 模型,每种模型都适合特定的用例。虽然 ChatGPT 及其生成式 AI 功能通过文本输入和输出吸引了用户,但许多模型和公司提供了不同的输入和输出。在 ChatGPT 之前,许多人对 Midjourney 和 Stable Diffusion 等文本到图像生成模型感到着迷。
下表根据模型的输入和输出类型对几种模型进行了分类
输入 | 输出 | 示例 |
---|---|---|
语言/代码/图像(多模态) |
语言/代码 |
GPT4 - OpenAI,Google Gemini |
语言/代码 |
语言/代码 |
GPT 3.5 - OpenAI-Azure OpenAI,Google Bard,Meta Llama |
语言 |
图像 |
Dall-E - OpenAI + Azure,深度 AI |
语言/图像 |
图像 |
Midjourney,Stable Diffusion,RunwayML |
语言 |
音频 |
OpenAI,Azure OpenAI |
音频 |
语言 |
OpenAI,Azure OpenAI |
文本 |
数字 |
许多(也称为嵌入) |
Spring AI 目前支持处理语言、图像和音频作为输入和输出的模型。上一张表中的最后一行接受文本作为输入并输出数字,更常见的是称为嵌入文本,它代表了 AI 模型中使用的内部数据结构。Spring AI 支持嵌入以支持更高级的用例。
像 GPT 这样的模型的独特之处在于它们的预训练性质,如 GPT 中的“P”所示——Chat Generative Pre-trained Transformer。这种预训练功能将 AI 转变为通用的开发工具,不需要广泛的机器学习或模型训练背景。
提示
提示是基于语言的输入的基础,它指导 AI 模型生成特定的输出。对于熟悉 ChatGPT 的人来说,提示可能仅仅是输入到对话框中的文本,然后发送到 API。然而,它包含的内容远不止这些。在许多 AI 模型中,提示的文本不仅仅是一个简单的字符串。
ChatGPT 的 API 在一个提示中有多个文本输入,每个文本输入都分配了一个角色。例如,有一个系统角色,它告诉模型如何表现并为交互设置上下文。还有一个用户角色,通常是用户的输入。
创建有效的提示既是一门艺术,也是一门科学。ChatGPT 是为人类对话而设计的。这与使用类似 SQL 的东西来“'提出问题'”有很大不同。必须像与另一个人交谈一样与 AI 模型进行交流。
这种交互风格的重要性如此之大,以至于“提示工程”一词已成为其自身的学科。正在兴起的一系列技术可以提高提示的有效性。花时间精心设计提示可以极大地提高最终的输出。
分享提示已成为一种共同的实践,并且正在对这一主题进行积极的学术研究。作为如何创建有效提示的直观示例(例如,与 SQL 相比),一篇最近的研究论文发现,您可以使用的最有效的提示之一以“深呼吸,一步一步地完成这个步骤”这句话开头。这应该让你了解为什么语言如此重要。我们还没有完全理解如何最有效地利用这项技术的先前迭代,例如 ChatGPT 3.5,更不用说正在开发的新版本了。
提示模板
创建有效的提示涉及建立请求的上下文并将请求的某些部分替换为特定于用户输入的值。
此流程使用传统的基于文本的模板引擎来创建和管理提示。Spring AI 为此目的采用了 OSS 库 StringTemplate。
例如,考虑以下简单的提示模板
Tell me a {adjective} joke about {content}.
在 Spring AI 中,提示模板可以比作 Spring MVC 架构中的“视图”。一个模型对象,通常是 java.util.Map
,被提供来填充模板中的占位符。“渲染”后的字符串成为提供给 AI 模型的提示的内容。
发送到模型的提示的特定数据格式存在相当大的差异。最初,提示只是简单的字符串,但后来发展到包含多个消息,其中每个消息中的每个字符串代表模型的独特角色。
嵌入
嵌入将文本转换为数值数组或向量,使 AI 模型能够处理和解释语言数据。这种从文本到数字再到文本的转换是 AI 与人类语言交互和理解的关键要素。作为探索 AI 的 Java 开发人员,无需理解这些向量表示背后的复杂数学理论或具体实现。对它们在 AI 系统中的作用和功能有一个基本的了解就足够了,尤其是在将 AI 功能集成到应用程序时。
嵌入在检索增强生成 (RAG) 模式等实际应用中尤为重要。它们能够将数据表示为语义空间中的点,这类似于欧几里得几何的二维空间,但在更高维度。这意味着,就像欧几里得几何中平面上的点可以根据其坐标近或远一样,在语义空间中,点的接近程度反映了含义的相似性。关于类似主题的句子在这个多维空间中被定位得更近,就像在图上彼此靠近的点一样。这种接近性有助于文本分类、语义搜索,甚至产品推荐等任务,因为它允许 AI 根据这些概念在扩展的语义景观中的“位置”来识别和分组相关概念。
你可以将这个语义空间想象成一个向量。
标记
标记是 AI 模型工作方式的基础。在输入时,模型将单词转换为标记。在输出时,它们将标记转换回单词。
在英语中,一个标记大约对应于一个单词的 75%。作为参考,莎士比亚的全部作品,总共约 900,000 个单词,相当于大约 120 万个标记。
也许更重要的是,标记 = 金钱。
在托管 AI 模型的背景下,您的费用由使用的标记数量决定。输入和输出都会影响总标记数。
此外,模型会受到令牌限制的约束,这限制了单个 API 调用中处理的文本量。此阈值通常被称为“上下文窗口”。模型不会处理超过此限制的任何文本。
例如,ChatGPT3 的令牌限制为 4K,而 GPT4 提供了不同的选项,例如 8K、16K 和 32K。Anthropic 的 Claude AI 模型的令牌限制为 100K,而 Meta 最近的研究产生了 1M 令牌限制模型。
要使用 GPT4 总结莎士比亚的全部作品,您需要设计软件工程策略来分割数据并在模型的上下文窗口限制内呈现数据。Spring AI 项目可以帮助您完成此任务。
结构化输出
即使您要求以 JSON 格式回复,AI 模型的输出也通常以 java.lang.String
的形式出现。它可能是正确的 JSON,但它不是 JSON 数据结构。它只是一个字符串。此外,在提示中要求“以 JSON 格式”并不完全准确。
这种复杂性导致了一个专门领域的出现,该领域涉及创建提示以产生预期输出,然后将生成的简单字符串转换为可用于应用程序集成的可用数据结构。
结构化输出转换 采用精心设计的提示,通常需要与模型进行多次交互才能实现所需的格式。
将您的数据带到 AI 模型
如何为 AI 模型提供它没有接受过训练的信息?
请注意,GPT 3.5/4.0 数据集仅扩展到 2021 年 9 月。因此,该模型表示它不知道需要超出该日期的知识的问题的答案。一个有趣的小知识是,该数据集大约有 650GB。
有三种技术可以自定义 AI 模型以合并您的数据
-
微调
:这种传统的机器学习技术涉及调整模型并更改其内部权重。但是,对于机器学习专家来说,这是一个具有挑战性的过程,对于像 GPT 这样的模型来说,由于其规模庞大,因此资源消耗非常大。此外,某些模型可能不提供此选项。 -
提示填充
:一种更实用的替代方法是将您的数据嵌入到提供给模型的提示中。鉴于模型的令牌限制,需要使用技术在模型的上下文窗口内呈现相关数据。这种方法俗称“填充提示”。Spring AI 库可以帮助您实现基于“填充提示”技术的解决方案,也称为检索增强生成 (RAG)。 -
函数调用
:这种技术允许注册自定义用户函数,这些函数将大型语言模型连接到外部系统的 API。Spring AI 极大地简化了您需要编写的代码以支持 函数调用。
检索增强生成 (RAG)
检索增强生成 (RAG) 是一种新兴技术,旨在解决将相关数据纳入提示以获得准确的 AI 模型响应的挑战。
这种方法涉及一种批处理风格的编程模型,其中作业从您的文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。从高层次来看,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。
作为将非结构化数据加载到向量数据库的一部分,最重要的转换之一是将原始文档拆分为更小的片段。将原始文档拆分为更小片段的过程包含两个重要步骤
-
将文档拆分为多个部分,同时保留内容的语义边界。例如,对于包含段落和表格的文档,应避免在段落或表格中间拆分文档。对于代码,避免在方法实现中间拆分代码。
-
将文档的各个部分进一步拆分为大小为 AI 模型令牌限制的一小部分的片段。
RAG 中的下一阶段是处理用户输入。当用户的问题需要由 AI 模型回答时,问题和所有“相似”的文档片段将被放入发送到 AI 模型的提示中。这就是使用向量数据库的原因。它非常擅长查找相似内容。
在实现 RAG 时使用了几个概念。这些概念映射到 Spring AI 中的类
-
DocumentReader
:一个 Java 函数式接口,负责从数据源加载List<Document>
。常见的数据源包括 PDF、Markdown 和 JSON。 -
Document
:数据源的文本表示,还包含描述内容的元数据。 -
DocumentTransformer
:负责以各种方式处理数据(例如,将文档拆分为更小的片段或向Document
添加其他元数据)。 -
DocumentWriter
:允许您将文档持久化到数据库(在 AI 堆栈中,最常见的是向量数据库)。 -
Embedding
:数据的表示形式,以List<Double>
的形式表示,向量数据库使用它来计算用户查询与相关文档的“相似度”。