跳到主要内容

AI 概念

DeepSeek V3 中英对照 AI Concepts

本节介绍了 Spring AI 使用的核心概念。我们建议仔细阅读本节内容,以理解 Spring AI 实现背后的思想。

模型

AI 模型是设计用于处理和生成信息的算法,通常模仿人类的认知功能。通过从大数据集中学习模式和洞察力,这些模型能够进行预测、生成文本、图像或其他输出,从而增强跨行业的各种应用。

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

下表根据输入和输出类型对几种模型进行了分类:

模型类型

Spring AI 目前支持处理输入和输出为语言、图像和音频的模型。上表中最后一行,接受文本作为输入并输出数字,通常被称为文本嵌入,代表了 AI 模型中使用的内部数据结构。Spring AI 支持嵌入功能,以实现更高级的用例。

像 GPT 这样的模型的独特之处在于它们的预训练性质,正如 GPT 中的 "P" 所表示的那样——Chat Generative Pre-trained Transformer。这种预训练特性将 AI 转变为一种通用的开发工具,不需要广泛的机器学习或模型训练背景。

提示

提示(Prompts)是指导 AI 模型生成特定输出的基于语言的输入的基础。对于那些熟悉 ChatGPT 的人来说,提示可能看起来只是输入到对话框中并发送到 API 的文本。然而,它远不止于此。在许多 AI 模型中,提示的文本不仅仅是一个简单的字符串。

ChatGPT 的 API 在提示中有多个文本输入,每个文本输入都被分配了一个角色。例如,有系统角色(system role),它告诉模型如何表现并设置交互的上下文。还有用户角色(user role),通常是用户的输入。

制作有效的提示既是一门艺术,也是一门科学。ChatGPT 是为人类对话而设计的。这与使用 SQL 等工具来“提问”有很大不同。必须像与另一个人交谈一样与 AI 模型进行交流。

这种交互方式的重要性如此之高,以至于“提示工程”(Prompt Engineering)已经作为一个独立的学科出现。目前有大量不断增长的技术可以提高提示的有效性。投入时间精心设计提示可以极大地改善输出结果。

分享提示词已经成为一种社区实践,并且有积极的学术研究正在进行。作为一个例子,说明创建一个有效的提示词可能有多么违反直觉(例如,与 SQL 形成对比),最近的一篇研究论文发现,你可以使用的最有效的提示词之一以“深呼吸,一步一步地解决这个问题”开头。这应该能让你明白为什么语言如此重要。我们还没有完全理解如何最有效地利用这项技术的先前迭代版本,例如 ChatGPT 3.5,更不用说正在开发的新版本了。

提示模板

创建有效的提示(prompts)需要建立请求的上下文,并用与用户输入相关的具体值替换请求的部分内容。

此过程使用传统的基于文本的模板引擎来创建和管理提示。Spring AI 为此采用了 OSS 库 StringTemplate

例如,考虑以下简单的提示模板:

Tell me a {adjective} joke about {content}.
none

在 Spring AI 中,提示模板可以类比为 Spring MVC 架构中的 "View"。通常提供一个模型对象(通常是 java.util.Map)来填充模板中的占位符。经过 "渲染" 后的字符串将成为提供给 AI 模型的提示内容。

发送给模型的提示(prompt)的具体数据格式存在相当大的变异性。最初,提示只是简单的字符串,现在已经发展为包含多条消息,其中每条消息中的每个字符串代表模型的不同角色。

嵌入

Embeddings 是文本、图像或视频的数值表示,能够捕捉输入之间的关系。

嵌入(Embeddings)的工作原理是将文本、图像和视频转换为浮点数数组,称为向量。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度。

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

嵌入

作为一名探索 AI 的 Java 开发者,你无需深入理解这些向量表示背后的复杂数学理论或具体实现。只需对它们在 AI 系统中的角色和功能有一个基本的了解,尤其是在将 AI 功能集成到你的应用程序中时,这就足够了。

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

你可以将这个语义空间视为一个向量。

代币

Token 是 AI 模型运作的基本构建单元。在输入时,模型会将单词转换为 token。在输出时,模型会将 token 转换回单词。

在英语中,一个 token 大约对应一个单词的 75%。作为参考,莎士比亚的完整作品集大约有 90 万个单词,转换为大约 120 万个 token。

Tokens

也许更重要的是,Tokens = 钱。在托管 AI 模型的背景下,你的费用取决于使用的 token 数量。输入和输出都会计入总 token 数。

此外,模型受到令牌限制的约束,这限制了单个 API 调用中处理的文本量。这个阈值通常被称为“上下文窗口”。模型不会处理任何超出此限制的文本。

例如,ChatGPT3 的 token 限制为 4K,而 GPT4 提供了不同的选项,如 8K、16K 和 32K。Anthropic 的 Claude AI 模型的 token 限制为 100K,而 Meta 最近的研究则推出了一个 1M token 限制的模型。

要使用 GPT4 总结莎士比亚的文集,你需要设计软件工程策略来分割数据,并在模型的上下文窗口限制内展示数据。Spring AI 项目可以帮助你完成这项任务。

结构化输出

AI 模型的输出传统上是以 java.lang.String 的形式返回的,即使你要求回复为 JSON 格式。它可能是一个正确的 JSON,但它并不是一个 JSON 数据结构。它只是一个字符串。此外,在提示中要求“返回 JSON”并不是 100% 准确的。

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

结构化输出转换器架构

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

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

你如何为 AI 模型提供其未训练过的信息?

请注意,GPT 3.5/4.0 的数据集仅更新至 2021 年 9 月。因此,对于需要了解该日期之后信息的问题,模型会表示不知道答案。一个有趣的小知识是,这个数据集的大小约为 650GB。

有三种技术可用于自定义 AI 模型以整合您的数据:

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

  • 提示填充(Prompt Stuffing): 一种更实用的替代方法是将您的数据嵌入到提供给模型的提示中。鉴于模型的令牌限制,需要一些技术来在模型的上下文窗口中呈现相关数据。这种方法在口语中被称为“填充提示”。Spring AI 库帮助您实现基于“提示填充”技术的解决方案,也称为检索增强生成(Retrieval Augmented Generation, RAG)

提示填充

  • 工具调用: 该技术允许注册工具(用户定义的服务),将大语言模型连接到外部系统的 API。Spring AI 极大地简化了支持工具调用所需的代码编写。

检索增强生成

一种称为检索增强生成(Retrieval Augmented Generation, RAG)的技术应运而生,旨在解决将相关数据整合到提示中以获得准确 AI 模型响应的挑战。

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

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

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

  2. 将文档的各个部分进一步分割成多个小部分,每个部分的大小为 AI 模型 token 限制的一小部分。

RAG 的下一个阶段是处理用户输入。当 AI 模型需要回答用户的问题时,问题和所有“相似”的文档片段会被放入发送给 AI 模型的提示中。这就是使用向量数据库的原因。它在查找相似内容方面非常出色。

Spring AI RAG

  • ETL Pipeline 提供了关于从数据源提取数据并将其存储在结构化向量存储中的流程编排的更多信息,确保在将数据传递给 AI 模型时,数据处于最佳的检索格式。

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

工具调用

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

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

Spring AI 极大地简化了支持工具调用所需的代码编写工作。它会为你处理工具调用的对话。你可以将你的工具作为一个带有 @Tool 注解的方法提供,并在你的提示选项中提供它,使其可供模型使用。此外,你还可以在单个提示中定义并引用多个工具。

工具调用的主要操作序列

  1. 当我们希望让模型使用某个工具时,我们会在聊天请求中包含其定义。每个工具定义包括名称、描述以及输入参数的 schema。

  2. 当模型决定调用某个工具时,它会发送一个响应,其中包含工具名称和根据定义的 schema 建模的输入参数。

  3. 应用程序负责使用工具名称来识别并使用提供的输入参数执行该工具。

  4. 工具调用的结果由应用程序处理。

  5. 应用程序将工具调用结果发送回模型。

  6. 模型使用工具调用结果作为额外上下文生成最终响应。

有关如何在不同 AI 模型中使用此功能的更多信息,请参阅 Tool Calling 文档。

评估 AI 响应

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

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

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

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

Spring AI 项目提供了一个 Evaluator API,目前该 API 提供了评估模型响应的基本策略。更多信息请参阅 评估测试 文档。