本文是一篇译文,从一个宏观的角度和大家分享 Spring AI 所具备的能力。原文地址:https://docs.spring.io/spring-ai/reference/concepts.html。
以下是正文。
本文主要介绍了 Spring AI 使用的核心概念,我们建议仔细阅读,以理解 Spring AI 实现背后的思想。
AI 模型是设计用于处理和生成信息的算法,通常模仿人类的认知功能。通过海量的数据进行学习,这些模型可以进行预测、生成文本、图像或其他输出,从而增强跨行业的各种应用程序。
目前存在许多不同类型的 AI 模型,每种都适用于特定的场景。
虽然 ChatGPT 及其生成式 AI 的能力通过文本输入和输出吸引了用户,但许多模型和公司提供了多样化的输入和输出。在 ChatGPT 之前,许多人就对像 Midjourney 和 Stable Diffusion 这样的文生图模型着迷。下表根据输入和输出类型对几种模型进行了分类:

Spring AI 目前支持处理输入和输出为语言、图像和音频的模型。上表中最后一行,接受文本输入并输出数字的模型,更常见的是被称为嵌入文本 (embedding text),它代表了在 AI 模型中使用的内部数据结构。Spring AI 提供对嵌入的支持,以实现更高级的用例(松哥注:即 Spring AI 支持快速接入向量模型)。
像 GPT 这样的模型之所以与众不同,在于其预训练性质,正如 GPT 中的“P”所示——Chat Generative Pre-trained Transformer。这种预训练特性将 AI 转变为一种通用的开发者工具,不需要广泛的机器学习或模型训练背景。
提示词是构成基于语言输入的基础,用于引导 AI 模型产生特定输出。对于那些熟悉 ChatGPT 的人来说,提示词可能看起来仅仅像是输入到对话框中并发送给 API 的文本。
然而,它远不止于此。
在许多 AI 模型中,提示词的文本并不只是一个简单的字符串。ChatGPT 的 API 在单个提示词中有多个文本输入,每个文本输入都被分配一个角色。例如,有系统角色 (system role),它告诉模型如何行动并为交互设置上下文。还有用户角色 (user role),通常是用户的输入。
制作有效的提示词既是一门艺术也是一门科学。ChatGPT 是为人类对话而设计的。这与使用像 SQL 这样的东西来“提问”大不相同。必须像与另一个人交谈一样与 AI 模型沟通。这种交互方式的重要性如此之大,以至于“提示词工程 (Prompt Engineering)”这个词已经作为一个独立的学科出现。有一系列不断增长的技术可以提高提示词的有效性,投入时间制作提示词可以显著改善最终输出。
分享提示词已成为一种社群实践,并且这方面正在进行积极的学术研究。举个例子来说明创建有效提示词可能是多么反直觉,最近的一篇研究论文发现,你可以使用的最有效的提示词之一是以短语“Take a deep breath and work on this step by step”(深呼吸,然后一步一步地解决这个问题)开头。这应该让你明白为什么语言如此重要。我们尚且未能完全理解如何最有效地利用 ChatGPT 3.5,更不用说正在开发的新版本了。
创建有效的提示词涉及建立请求的上下文,并用用户输入的值替换请求的某些部分。这个过程使用传统的基于文本的模板引擎来创建和管理提示。Spring AI 为此使用了 OSS 库 StringTemplate。
例如,考虑一个简单的提示词模板:
Tell me a {adjective} joke about {content}.
(给我讲一个关于{内容}的{形容词}笑话。)
在 Spring AI 中,提示词模板可以类比于 Spring MVC 架构中的“视图 (View)”。提供一个模型对象(通常是 java.util.Map)来填充模板中的占位符。“渲染”后的字符串成为提供给 AI 模型的提示内容。
发送给模型的提示词的具体数据格式存在相当大的变异性。提示词最初是简单的字符串,后来演变为包含多条消息,其中每条消息中的每个字符串都代表模型的一个独特角色。
向量化是文本、图像或视频的数值表示形式,用于捕捉输入之间的关系。向量化的工作原理是将文本、图像和视频转换为浮点数数组,称为向量 (vectors)。这些向量旨在捕获文本、图像和视频的含义。数组的长度称为向量的维度 (dimensionality)。
通过计算两段文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量对象之间的相似性。

作为探索 AI 的 Java 开发者,无需理解这些向量表示背后复杂的数学理论或具体实现。理解它们在 AI 系统中的作用和功能的基本知识就足够了,尤其是在将 AI 功能集成到应用程序中时。
向量化在像检索增强生成 (Retrieval Augmented Generation, RAG) 模式这样的实际应用中特别相关。它们能够将数据表示为语义空间中的点,这类似于欧几里得几何的 2D 空间,但维度更高。这意味着,就像欧几里得几何中平面上的点可以基于其坐标靠近或远离一样,在语义空间中,点的接近度反映了含义的相似性。关于相似主题的句子在这个多维空间中位置更近,就像在图表上彼此靠近的点一样。这种接近性有助于文本分类、语义搜索甚至产品推荐等任务,因为它允许 AI 根据它们在扩展的语义“景观”中的“位置”来辨别和分组相关概念。
你可以将这个语义空间想象成一个向量 (vector)。
令牌是 AI 模型工作原理的基础构件。在输入时,模型将单词转换为令牌。在输出时,它们将令牌转换回单词。在英语中,一个令牌大致相当于一个单词的 75%。作为参考,莎士比亚全集总计约 900,000 个单词,大约相当于 120 万个令牌。

也许更重要的是:令牌 = 金钱 (Tokens = Money)。在托管 AI 模型的背景下,你的费用由使用的令牌数量决定。输入和输出都计入总令牌数。
此外,模型受令牌限制,这限制了单次 API 调用中处理的文本量。这个阈值通常被称为“上下文窗口 (context window)”。模型不会处理超出此限制的任何文本。例如,ChatGPT3 有 4K 令牌限制,而 GPT4 提供不同的选项,如 8K、16K 和 32K。Anthropic 的 Claude AI 模型拥有 100K 令牌限制,而 Meta 最近的研究产生了一个 1M 令牌限制的模型。
要用 GPT4 总结莎士比亚全集,你需要设计软件工程策略来切分数据并在模型的上下文窗口限制内呈现数据。Spring AI 项目会在这方面帮助你。
AI 模型的输出传统上是以 java.lang.String 的形式到达,即使你要求回复是 JSON 格式。它可能是一个正确的 JSON,但它不是一个 JSON 数据结构。它只是一个字符串。而且,在提示中要求“输出 JSON”也不是 100% 准确的。
这种复杂性导致了一个专业领域的出现:创建提示词以产生预期的输出,然后将得到的简单字符串转换为可用于应用程序集成的数据结构。
结构化输出转换采用了精心制作的提示词,通常需要与模型进行多次交互才能实现所需的格式。
你如何为 AI 模型配备它未曾训练过的信息?请注意,GPT 3.5/4.0 的数据集只扩展到 2021 年 9 月。因此,对于需要了解该日期之后知识的问题,模型会回答说不知道答案。一个有趣的琐事是,这个数据集大约有 650GB。
有三种技术可以定制 AI 模型以整合你的数据:

一种称为检索增强生成 (RAG) 的技术应运而生,以解决将相关数据整合到提示中以获得准确 AI 模型响应的挑战。
该方法涉及一种批处理风格的编程模型,系统从你的文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。在高层次上,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。
作为将非结构化数据加载到向量数据库的一部分,最重要的转换之一是将原始文档分割成更小的片段。将原始文档分割成更小片段的过程有两个重要步骤:
RAG 的下一个阶段是处理用户输入。当需要由 AI 模型回答用户问题时,该问题和所有“相似”的文档片段会被放入发送给 AI 模型的提示词中。这就是使用向量数据库的原因。它非常擅长查找相似内容。

大型语言模型 (Large Language Models, LLMs) 在训练后被冻结,导致知识陈旧,并且它们无法访问或修改外部数据。
工具调用 (Tool Calling) 机制解决了这些缺点。它允许你将自己的服务注册为工具,将大型语言模型连接到外部系统的 API。这些系统可以为 LLMs 提供实时数据并代表它们执行数据处理操作。
Spring AI 极大地简化了支持工具调用所需编写的代码,它为你自动处理工具调用的对话。你可以提供一个带有 @Tool 注解的方法作为你的工具,并在你的提示词选项中提供它以使其对模型可用。此外,你可以在单个提示词中定义和引用多个工具。

当我们想让一个工具对模型可用时,我们在聊天请求中包含它的定义。每个工具定义包括一个名称、一个描述以及输入参数的架构。
当模型决定调用一个工具时,它会发送一个响应,其中包含工具名称和根据定义架构建模的输入参数。应用程序负责使用工具名称来识别并使用提供的输入参数执行该工具。工具调用的结果由应用程序处理。应用程序将工具调用结果发送回模型。模型使用工具调用结果作为附加上下文生成最终响应。
有效评估 AI 系统对用户请求的输出响应对于确保最终应用程序的准确性和实用性至关重要。几种新兴技术使得使用预训练模型本身进行这种评估成为可能。
这个评估过程涉及分析生成的响应是否与用户意图和查询上下文保持一致。诸如相关性 (relevance)、连贯性 (coherence) 和事实正确性 (factual correctness) 等指标用于衡量 AI 生成响应的质量。
一种方法是同时向模型提交用户的请求和 AI 模型的响应,询问该响应是否与提供的数据一致。此外,利用存储在向量数据库中的信息作为补充数据可以增强评估过程,有助于确定响应的相关性。
Spring AI 项目提供了一个评估器 API (Evaluator API),目前提供对基本策略的访问以评估模型响应。
完。