AI 概念

本节描述 Spring AI 使用的核心概念。我们建议您仔细阅读本节,以了解 Spring AI 实现背后的理念。

模型

AI 模型是旨在处理和生成信息的算法,通常模仿人类的认知功能。通过学习大型数据集中的模式和见解,这些模型可以进行预测,生成文本、图像或其他输出,从而增强各个行业的各种应用。

存在许多不同类型的 AI 模型,每种模型都适用于特定的用例。虽然 ChatGPT 及其生成式 AI 功能通过文本输入和输出吸引了用户,但许多模型和公司都提供多样化的输入和输出。在 ChatGPT 之前,许多人对 Midjourney 和 Stable Diffusion 等文本到图像生成模型着迷。

下表根据模型的输入和输出类型对几个模型进行了分类。

Model types

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 模型的提示词的内容。

发送到模型的提示词的特定数据格式存在相当大的差异。最初只是简单的字符串,提示词已经发展到包含多个消息,其中每个消息中的每个字符串都代表模型的不同角色。

嵌入

嵌入是文本、图像或视频的数字表示,它捕获输入之间的关系。

嵌入通过将文本、图像和视频转换为浮点数数组(称为向量)来工作。这些向量旨在捕获文本、图像和视频的含义。嵌入数组的长度称为向量的维数。

通过计算两段文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象的相似性。

Embeddings

作为探索 AI 的 Java 开发人员,不必理解这些向量表示背后的复杂数学理论或特定实现。对它们在 AI 系统中的作用和功能的基本理解就足够了,尤其是在将 AI 功能集成到您的应用程序时。

嵌入在实际应用中尤其重要,例如检索增强生成 (RAG) 模式。它们能够将数据表示为语义空间中的点,这类似于欧几里得几何的二维空间,但在更高维度上。这意味着,就像欧几里得几何中平面上的点根据其坐标可以近或远一样,在语义空间中,点的邻近性反映了含义的相似性。关于类似主题的句子在这个多维空间中位置更接近,就像图上彼此靠近的点一样。这种邻近性有助于文本分类、语义搜索甚至产品推荐等任务,因为它允许 AI 根据其在这个扩展的语义环境中的“位置”来识别和分组相关的概念。

你可以将这个语义空间想象成一个向量。

标记 (Tokens)

标记是 AI 模型工作方式的基本组成部分。在输入时,模型将单词转换为标记;在输出时,它们将标记转换回单词。

在英语中,一个标记大约相当于一个单词的 75%。作为参考,莎士比亚的全部作品,总计约 900,000 个单词,转换为大约 120 万个标记。

Tokens

也许更重要的是,标记 = 金钱。在托管 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”作为提示的一部分并不完全准确。

这种复杂性导致了一个专门领域的出现,该领域涉及创建提示以产生预期的输出,然后将生成的简单字符串转换为可用于应用程序集成的可用数据结构。

Structured Output Converter Architecture

结构化输出转换 使用精心设计的提示,通常需要与模型进行多次交互才能实现所需的格式。

将你的数据和 API 引入 AI 模型

如何为 AI 模型配备其未经训练的信息?

请注意,GPT 3.5/4.0 数据集仅扩展到 2021 年 9 月。因此,该模型表示它不知道需要 9 月之后知识的问题的答案。一个有趣的花絮是,这个数据集大约有 650GB。

存在三种技术可以自定义 AI 模型以整合你的数据

  • 微调 (Fine Tuning):这种传统的机器学习技术涉及调整模型并更改其内部权重。但是,对于机器学习专家来说,这是一个具有挑战性的过程,对于像 GPT 这样的模型来说,由于其规模庞大,它也是极其资源密集型的。此外,某些模型可能不提供此选项。

  • 提示填充 (Prompt Stuffing):一种更实用的替代方法是将你的数据嵌入到提供给模型的提示中。考虑到模型的标记限制,需要一些技术才能在模型的上下文窗口内呈现相关数据。这种方法俗称为“填充提示”。Spring AI 库可以帮助你实现基于“填充提示”技术的解决方案,也称为 检索增强生成 (RAG)

Prompt stuffing
  • 函数调用 (Function Calling):此技术允许注册自定义用户函数,这些函数将大型语言模型连接到外部系统的 API。Spring AI 极大地简化了你需要编写的代码以支持 函数调用

检索增强生成 (Retrieval Augmented Generation)

一种名为检索增强生成 (RAG) 的技术已经出现,以应对将相关数据整合到提示中以获得准确的 AI 模型响应的挑战。

这种方法涉及一种批处理风格的编程模型,其中作业从你的文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。从高层次来看,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。

作为将非结构化数据加载到向量数据库的一部分,最重要的转换之一是将原始文档拆分成较小的片段。将原始文档拆分成较小片段的过程包含两个重要步骤:

  1. 在保留内容的语义边界的同时将文档拆分成多个部分。例如,对于包含段落和表格的文档,应避免在段落或表格中间拆分文档。对于代码,避免在方法实现的中间拆分代码。

  2. 将文档的各个部分进一步拆分成大小为 AI 模型标记限制的一小部分的部分。

RAG 的下一阶段是处理用户输入。当用户的提问需要由 AI 模型回答时,问题和所有“相似”的文档片段都将放入发送到 AI 模型的提示中。这就是使用向量数据库的原因。它非常擅长查找相似内容。

Spring AI RAG
  • ETL 管道 提供了有关协调从数据源提取数据并将其存储在结构化向量存储中的流程的更多信息,确保数据格式最适合在传递给 AI 模型时进行检索。

  • ChatClient - RAG 解释了如何使用QuestionAnswerAdvisor 在你的应用程序中启用 RAG 功能。

函数调用 (Function Calling)

大型语言模型 (LLM) 在训练后会被冻结,导致知识陈旧,并且它们无法访问或修改外部数据。

函数调用 机制解决了这些缺点。它允许你注册你自己的函数,以将大型语言模型连接到外部系统的 API。这些系统可以为 LLM 提供实时数据并代表它们执行数据处理操作。

Spring AI 极大地简化了你需要编写的代码以支持函数调用。它为你处理函数调用对话。你可以将你的函数作为@Bean提供,然后在你的提示选项中提供函数的 bean 名称以激活该函数。此外,你可以在单个提示中定义和引用多个函数。

Function calling
  1. 执行发送函数定义信息的聊天请求。后者提供namedescription(例如,解释模型何时应该调用该函数)和input parameters(例如,该函数的输入参数模式)。

  2. 当模型决定调用函数时,它将使用输入参数调用该函数并将输出返回给模型。

  3. Spring AI 为你处理此对话。它将函数调用分派到相应的函数并将结果返回给模型。

  4. 模型可以执行多次函数调用以检索所需的所有信息。

  5. 一旦获取所有所需信息,模型将生成响应。

请遵循 函数调用 文档,了解如何在不同的 AI 模型中使用此功能的更多信息。

评估 AI 响应

有效评估 AI 系统对用户请求的输出对于确保最终应用程序的准确性和实用性非常重要。一些新兴技术使能够为此目的使用预训练模型本身。

此评估过程包括分析生成的响应是否与用户的意图和查询的上下文一致。相关性、连贯性和事实正确性等指标用于衡量 AI 生成的响应的质量。

一种方法是将用户的请求和 AI 模型的响应都呈现给模型,询问响应是否与提供的数据一致。

此外,利用向量数据库中存储的信息作为补充数据可以增强评估过程,有助于确定响应的相关性。

Spring AI 项目提供了一个Evaluator API,目前可以访问用于评估模型响应的基本策略。请遵循 评估测试 文档以获取更多信息。