Spring AI官方文档学习(二)-AI核心概念

100 阅读12分钟

本文阐述 Spring AI 的核心概念。建议您仔细阅读,以便深入理解 Spring AI 的实现原理。

一、模型

  人工智能模型是经过设计的算法,用于处理并生成信息,其运作机制常模拟人类的认知功能。这些模型通过从海量数据集中学习规律与深层洞察,能够生成预测结果、文本、图像或其他输出形式,从而赋能各行各业的应用场景。   人工智能模型存在多种类型,分别适用于特定应用场景。尽管ChatGPT及其生成式人工智能能力通过文本输入与输出功能吸引了广泛用户,实际上众多模型与企业提供着多元化的输入输出模式。在ChatGPT问世之前,文本到图像生成模型(如Midjourney和Stable Diffusion)早已令世人惊叹。 下表根据模型的输入与输出类型对几种模型进行了分类:

1.png

  Spring AI 目前支持处理语言、图像及音频输入与输出的模型。前表中最后一行所示的模型——接收文本输入并输出数字——更常见的名称是文本嵌入(embedding),它代表了AI模型中使用的内部数据结构。Spring AI 支持嵌入功能,以实现更高级的应用场景。

  诸如GPT这类模型的独特之处在于其预训练特性,这正体现在GPT(生成式预训练转换器)名称中的"P"上。这种预训练特性使AI转变为通用的开发工具,开发者无需具备深厚的机器学习或模型训练背景即可使用。

二、提示词

  提示词(Prompt)是引导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 架构中的"视图"。通过提供模型对象(通常是 java.util.Map)来填充模板中的占位符,经"渲染"生成的字符串将作为提示词内容提供给 AI 模型。

  发送至模型的提示词其具体数据格式存在显著差异。从最初简单的字符串形式,提示词已发展为包含多条消息的结构,其中每条消息中的字符串都代表模型需要扮演的特定角色。

四、Embeddings

  嵌入(Embedding)是对文本、图像或视频的数值化表示,能够捕捉输入内容之间的关联关系。嵌入通过将文本、图像和视频转换为浮点数数组(即向量)来实现。这些向量旨在捕捉原始文本、图像及视频的语义信息。嵌入数组的长度称为向量维度。通过计算两段文本对应向量表示之间的数值距离,应用程序可以判定生成这些嵌入向量的原始对象之间的相似程度。

2.png

  作为探索AI领域的Java开发者,您无需深入理解向量表示背后复杂的数学理论与具体实现。只需掌握其在AI系统中的角色与功能便已足够,特别是在将AI功能集成到应用程序时。

  嵌入在检索增强生成(RAG)等实际应用场景中尤为重要。它们能够将数据表示为语义空间中的点——类似于欧几里得几何的二维空间,但处于更高维度。正如欧氏几何中点的坐标决定其远近关系,在语义空间中,点的邻近度反映了含义的相似性。关于相同主题的语句在这个多维空间中位置更接近,就像图表中紧密相邻的数据点。这种邻近特性有助于文本分类、语义搜索乃至产品推荐等任务,使AI能够根据概念在这个扩展语义空间中的"位置"来识别和归类相关主题。

  您可以将这个语义空间理解为一个向量。

五、Tokens

  令牌(Token)是构成AI模型运作的基础单元。在输入阶段,模型将词语转换为令牌;在输出阶段,又将令牌还原为词语。以英语为例,一个令牌约等于0.75个单词。作为参考,莎士比亚全集约90万单词,对应约120万令牌。

3.png

  更关键的是:令牌数直接等同于费用。在使用托管型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"并不能保证百分之百的准确率。

  这种复杂性催生了一个专门的技术领域:通过精心设计提示词来获取目标输出,再将返回的原始字符串转换为可供应用程序集成的可用数据结构。

4.png

  结构化输出转换需要借助精心设计的提示词,通常还需与模型进行多轮交互才能实现目标格式。

七、让AI模型接入您的数据与API

  如何为AI模型提供其训练数据之外的信息?

  需要注意的是,GPT 3.5/4.0的训练数据仅更新至2021年9月。因此,当问题涉及该时间点之后的信息时,模型会表示无法回答。值得一提的是,该训练数据集容量约为650GB。

  目前存在三种将自定义数据集成到AI模型的技术方案:

  1. 模型微调:这种传统机器学习技术通过调整模型内部权重来实现定制化。但由于GPT类模型的庞大规模,该过程不仅对机器学习专家极具挑战性,更需消耗巨大资源。此外,部分模型可能不提供此功能选项。
  2. 提示词填充:更实用的替代方案是将数据直接嵌入到提示词中。鉴于模型的令牌限制,需要特定技术确保相关数据能适配模型的上下文窗口。这种方法通常被称为"提示词填充"。Spring AI库可帮助您基于此技术(即检索增强生成RAG)实现解决方案。

5.png 3. 工具调用:该技术支持注册工具(用户定义的服务),将大语言模型与外部系统的API相连接。Spring AI 极大简化了实现工具调用所需的代码编写。

八、RAG检索增强

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

  该方法采用批处理式编程模型:任务从文档中读取非结构化数据,经过转换后写入向量数据库。从宏观角度看,这本质上是一个ETL(抽取、转换、加载)流程。向量数据库在RAG技术中承担检索环节的核心功能。

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

  保持语义边界完整性的分割:例如对于包含段落和表格的文档,应避免从段落或表格中间截断;对于代码文档,则需确保不在方法实现中途进行分割

  尺寸优化分割:将文档片段进一步细分,确保每个片段的大小不超过AI模型令牌限制的较小百分比

  RAG的下一阶段是处理用户输入。当需要AI模型回答用户问题时,系统会将问题与所有"相似"的文档片段共同置入提示词中发送给AI模型。这正是使用向量数据库的关键原因——它极其擅长寻找语义相似的内容。

6.png

  ETL流水线章节详细阐述了如何协调从数据源抽取数据,并将其存储至结构化向量数据库的流程,确保数据在传递给AI模型时处于最优的检索就绪状态。   ChatClient - RAG章节则说明如何通过QuestionAnswerAdvisor在您的应用程序中启用RAG功能。

九、工具调用

  大型语言模型(LLM)在训练完成后便处于固化状态,这导致其知识存在滞后性,且无法访问或修改外部数据。工具调用机制正是为了弥补这些缺陷而设计。该功能允许您将自定义服务注册为工具,从而将大语言模型与外部系统的API相连接。这些系统既能向LLM提供实时数据,也能代其执行数据处理操作。

  Spring AI极大简化了支持工具调用所需的代码编写:它自动处理工具调用的对话流程。您只需将工具实现为带有@Tool注解的方法,并在提示词选项中配置即可供模型调用。此外,单次提示词中可同时定义并引用多个工具。

7.png

  1. 当需要向模型提供工具时,我们会在聊天请求中包含其定义。每个工具定义由名称、描述和输入参数 schema 三部分组成。
  2. 若模型决定调用某个工具,它将返回包含工具名称及遵循既定 schema 的输入参数的响应。
  3. 应用程序需根据工具名称识别对应工具,并使用传入参数执行该工具。
  4. 工具调用的结果由应用程序进行处理。
  5. 应用程序将工具调用结果返回给模型。
  6. 模型最终结合工具调用结果作为附加上下文生成最终响应。

有关如何在不同 AI 模型中使用此功能的详细说明,请参阅《工具调用》文档。

十、评估AI响应

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

  该评估流程需要分析生成响应是否符合用户意图及查询语境。通过相关性、连贯性和事实准确性等指标,可量化评估AI生成响应的质量。

  其中一种方法是:将用户原始请求与AI模型响应同时提交给模型,询问该响应是否与提供的数据相符。

  此外,利用向量数据库中存储的信息作为补充数据,能够增强评估效果,辅助判定响应的相关程度。

  Spring AI项目提供了评估器API,目前支持基础响应评估策略。详细使用说明请参阅《评估测试》技术文档。