跳到主要内容

AI 概念

Deepseek 3.2 中英对照 AI Concepts

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

模型

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

人工智能模型种类繁多,每种都适用于特定的应用场景。虽然ChatGPT及其生成式人工智能功能通过文本输入和输出吸引了众多用户,但许多模型和公司提供了多样化的输入输出形式。在ChatGPT问世之前,许多人曾被Midjourney和Stable Diffusion等文生图模型深深吸引。

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

模型类型

Spring AI 当前支持处理语言、图像和音频输入输出的模型。前表中最后一行——接受文本输入并输出数字——更常见的说法是文本嵌入,它代表了AI模型中使用的内部数据结构。Spring AI 支持嵌入功能,以实现更高级的应用场景。

GPT这类模型的独特之处在于其预训练特性,正如GPT(Chat Generative Pre-trained Transformer)中的"P"所示。这种预训练特性将人工智能转变为一种通用的开发工具,使用者无需具备深入的机器学习或模型训练背景。

提示词

提示词是引导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

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

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

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

嵌入向量

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

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

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

令牌

令牌是人工智能模型运作的基本构件。在输入时,模型将词语转换为令牌;在输出时,再将令牌转换回词语。

在英语中,一个token大约对应0.75个单词。作为参考,莎士比亚全集总计约90万词,约等于120万个token。

Tokens

或许更重要的是,Token = 金钱。在托管AI模型的语境中,您的费用是由使用的Token数量决定的。输入和输出都会计入总Token数量。

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

例如,ChatGPT3 拥有 4K 的 token 限制,而 GPT4 则提供了多种选项,如 8K、16K 和 32K。Anthropic 的 Claude AI 模型具备 100K 的 token 限制,而 Meta 近期的研究更是推出了一个 1M token 限制的模型。

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

结构化输出

传统上,AI模型的输出以java.lang.String的形式呈现,即使你要求回复为JSON格式。它可能是正确的JSON,但并非JSON数据结构本身,而只是一个字符串。此外,在提示中要求“生成JSON”也并非百分之百准确。

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

结构化输出转换器架构

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

将您的数据与 API 接入 AI 模型

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

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

将您的数据整合到AI模型中进行定制,有三种技术方法:

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

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

提示词填充

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

检索增强生成

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

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

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

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

  2. 将文档的各个部分进一步拆分为更小的部分,使其大小占 AI 模型标记限制的较小百分比。

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

Spring AI RAG

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

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

工具调用

大型语言模型(LLMs)在训练完成后处于冻结状态,这导致其知识陈旧,且无法访问或修改外部数据。

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

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

工具调用的主要动作序列

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

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

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

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

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

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

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

评估AI回复

有效评估AI系统对用户请求的响应输出,对于确保最终应用的准确性和实用性至关重要。目前已有多种新兴技术能够利用预训练模型自身来实现这一目标。

该评估流程包括分析生成的回复是否与用户意图及查询语境相符。通过相关性、连贯性及事实准确性等指标来衡量人工智能生成回复的质量。

一种方法是同时向模型展示用户的请求和AI模型的回复,询问该回复是否与提供的数据相符。

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

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