人工智能的概念
"真正的问题并不是智能机器能否产生情感,而是机器是否能够在没有情感基础的前提下产生智能。"——马文·明斯基(Marvin Minsky), 1986
Spring AI 中对 AI 相关概念解释我觉得非常不错,下面是对官方文档的翻译。
原文地址:https://docs.spring.io/spring-ai/reference/2.0/concepts.html
存档:AI Concepts : Spring AI Reference
引言
本节介绍 Spring AI 使用的核心概念。我们建议您仔细阅读,以理解 Spring AI 实现背后的思想。
模型
AI 模型是旨在处理和生成信息的算法,通常模仿人类的认知功能。通过从大型数据集中学习模式和洞察,这些模型可以进行预测、生成文本、图像或其他输出,从而增强各行各业的多种应用。
AI 模型有许多不同的类型,每种都适用于特定的用例。虽然 ChatGPT 及其生成式 AI 能力通过文本输入和输出吸引了用户,但许多模型和公司提供了多样化的输入和输出。在 ChatGPT 出现之前,许多人对 Midjourney 和 Stable Diffusion 等文本到图像的生成模型着迷。
下表根据输入和输出类型对几种模型进行了分类:

Spring AI 目前支持处理语言、图像和音频输入输出的模型。上表中的最后一行,接受文本作为输入并输出数字,通常被称为文本嵌入(embedding text),代表 AI 模型中使用的内部数据结构。Spring AI 支持嵌入以实现更高级的用例。
让 GPT 这类模型脱颖而出的是其预训练的特性,正如 GPT 中的 "P"(Pre-trained,预训练)所指——对话生成式预训练变换器。这种预训练特性将 AI 转变为一种通用的开发工具,不需要深厚的机器学习或模型训练背景。
提示词
提示词是引导 AI 模型生成特定输出的基于语言输入的基础。对于熟悉 ChatGPT 的人来说,提示词可能看起来仅仅是输入到对话框中并发送给 API 的文本。然而,它包含的内容远不止于此。在许多 AI 模型中,提示词的文本不仅仅是简单的字符串。
ChatGPT 的 API 在一个提示词中包含多个文本输入,每个文本输入被分配一个角色。例如,有系统角色,它告诉模型应该如何行为并设置交互的上下文。还有用户角色,通常是来自用户的输入。
编写有效的提示词既是一门艺术也是一门科学。ChatGPT 是为人类对话而设计的。这与使用 SQL 来"提问"的方式有很大不同。人们需要像与另一个人交谈一样与 AI 模型交流。
这种交互方式的重要性如此之高,以至于"提示词工程"已成为一门独立的学科。有越来越多的技术可以提高提示词的有效性。花时间精心雕琢提示词可以极大地改善输出结果。
分享提示词已成为一种社区实践,相关的学术研究也在积极进行中。举一个例子来说明创建有效提示词可能是多么违反直觉(例如与 SQL 对比),最近的一篇研究论文发现,你能使用的最有效的提示词之一是以"深吸一口气,一步一步地完成这个任务"开头的。这应该能让你了解语言为何如此重要。我们尚未完全理解如何最有效地使用这项技术的先前迭代版本(如 ChatGPT 3.5),更不用说正在开发的新版本了。
提示词模板
创建有效的提示词涉及建立请求的上下文, 并将请求的部分内容替换为特定于用户输入的值。
这个过程使用传统的基于文本的模板引擎来进行提示词的创建和管理。Spring AI 采用开源库 StringTemplate 来实现这一目的。
例如,考虑这个简单的提示词模板:
Tell me a {adjective} joke about {content}.
在 Spring AI 中,提示词模板可以类比为 Spring MVC 架构中的"View"。一个模型对象(通常是 java.util.Map)被提供来填充模板中的占位符。"渲染"后的字符串即成为提供给 AI 模型的提示词内容。
发送给模型的提示词的具体数据格式有相当大的变异性。最初以简单字符串的形式开始,提示词已经演变为包含多条消息,其中每条消息中的每个字符串代表模型的不同角色。
嵌入
嵌入是文本、图像或视频的数值化表示,用于捕捉输入之间的关系。
嵌入通过将文本、图像和视频转换为浮点数数组(称为向量)来工作。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度。
通过计算两段文本的向量表示之间的数值距离,应用程序可以判断用于生成嵌入向量的对 象之间的相似度。

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

也许更重要的是:令牌 = 金钱。在托管 AI 模型的背景下,您的费用由使用的令牌数量决定。输入和输出都计入总的令牌数。
此外,模型受令牌限制的约束,这限制了单次 API 调用中处理的文本量。这个阈值通常被称为"上下文窗口"。模型不会处理超出此限制的任何文本。
例如,ChatGPT3 有 4K 令牌限制,而 GPT4 提供多种选项,如 8K、16K 和 32K。Anthropic 的 Claude AI 模型具有 100K 令牌限制,而 Meta 最近的研究产生了 100 万令牌限制的模型。
要用 GPT4 总结莎士比亚的全集,您需要设计软件工程策略来切分数据并在模型的上下文窗口限制内呈现数据。Spring AI 项目可以帮助您完成这个任务。
结构化输出
AI 模型的输出传统上以 java.lang.String 的形式返回,即使您要求回复为 JSON 格式。它可能是正确的 JSON,但它不是 JSON 数据结构,只是一个字符串。而且,在提示词中要求"输出 JSON"并非 100% 准确。
这种复杂性催生了一个专门领域,涉及创建提示词以产生预期的输出,然后将生成的简单字符串转换为可用于应用程序集成的数据结构。

结构化输出转换采用了精心设计的提示词,通常需要与模型进行多次交互才能达到所需的格式。
将您的数据和 API 引入 AI 模型
如何为 AI 模型提供其未曾训练过的信息?
请注意,GPT 3.5/4.0 的数据集只延伸到 2021 年 9 月。因此,模型会说它不知道需要该日期之后知识的答案。一个有趣的冷知识是,这个数据集大约有 650GB。
存在三种技术可以定制 AI 模型以融入您的数据:
-
微调:这种传统的机器学习技术涉及定制模型并更改其内部权重。然而,对于机器学习专家来说这是一个具有挑战性的过程,并且对于像 GPT 这样的模型来说,由于其规模,极其耗费资源。此外,一些模型可能不提供此选项。
-
提示词填充:一种更实用的替代方法是将您的数据嵌入到提供给模型的提示词中。考虑到模型的令牌限制,需要使用一些技术来在模型的上下文窗口内呈现相关数据。这种方法通俗地称为"填充提示词"。Spring AI 库帮助您实现基于"填充提示词"技术的解决方案,该技术也被称为检索增强生成(RAG)。

- 工具调用:此技术允许注册工具(用户定义的服务),将大语言模型连接到外部系统的 API。Spring AI 极大地简化了支持工具调用所需的代码。
检索增强生成
一种称为检索增强生成(RAG)的技术已经出现,用于解决将相关数据纳入提示词以获得准确 AI 模型响应的挑战。
该方法涉及一种批处理风格的编程模型,其中作业从您的文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。从高层次来看,这是一个 ETL(提取、转换、加载)管道。向量数据库用于 RAG 技术的检索部分。
在将非结构化数据加载到向量数据库的过程中,最重要的转换之一是将原始文档拆分为更小的片段。将原始文档拆分为更小片段的过程有两个重要步骤:
-
将文档分割成部分,同时保留内容的语义边界。例如,对于包含段落和表格的文档,应避免在段落或表格中间分割文档。对于代码,避免在方法实现的中间分割代码。
-
将文档的部分进一步分割为大小仅为 AI 模型令牌限制一小部分的片段。
RAG 的下一阶段是处理用户输入。当 AI 模型要回答用户的问题时,问题和所有"相似"的文档片段被放入发送给 AI 模型的提示词中。这就是使用向量数据库的原因——它非常擅长查找相似内容。

-
ETL 管道提供了关于协调从数据源提取数据并将其存储在结构化向量存储中的流程的进一步信息,确保数据在传递给 AI 模型时处于最佳的检索格式。
-
ChatClient - RAG 解释了如何使用 QuestionAnswerAdvisor 在您的应用程序中启用 RAG 能力。
工具调用
大语言模型(LLM)在训练后被冻结,导致知识陈旧,且无法访问或修改外部数据。
工具调用机制解决了这些不足之处。它允许您将自己的服务注册为工具,将大语言模型连接到外部系统的 API。这些系统可以为 LLM 提供实时数据,并代表它们执行数据处理操作。
Spring AI 极大地简化了支持工具调用所需的代码。它为您处理工具调用的对话。您可以将您的工具作为 @Tool 注解的方法提供,并在提示词选项中提供它以使其对模型可用。此外,您可以在单个提示词中定义和引用多个工具。

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