SpringAI 01 – AI概念

模型 Model

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

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

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

AI模型类型分类

Spring AI 目前支持将输入和输出处理为语言、图像和音频的模型。上表中的最后一行,即接受文本作为输入并输出数字的那行,通常被称为嵌入文本,代表 AI 模型中使用的内部数据结构。Spring AI 支持嵌入(Embedding)以支持更先进的用例。

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

提示 Prompt

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

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

创建有效的提示既是科学也是艺术。ChatGPT 是为人类对话而设计的。这与使用 SQL 等特定的数据库查询语言来进行 “提问” 有很大不同。与 AI 模型进行交流必须要像与另一个真实的人交谈一样。

这种交互方式非常重要,以至于出现了像 “提示工程” 这样类似一门学科的名词。有大量提高提示有效性的技术正在涌现。花时间精心设计提示可以极大地改善最终输出的结果。

共享提示已成为一种常用的做法,并且在这个主题上正在进行积极的学术研究。作为创建有效提示可能有多违反直觉的一个例子(例如,与SQL比较),最近的一篇研究论文发现,最有效的一个提示可以用这样的语句开头: “深呼吸,一步一步地做这个”。这应该可以让你了解为什么语言如此重要。不幸的是我们还不完全理解如何最有效地利用这项技术,即使是在之前的迭代版本中(如 ChatGPT 3.5),更不用说正在开发的新版本了。

提示模板 Prompt Template

创建有效提示涉及建立请求的上下文,并将请求中指定的部分内容替换为让用户输入的值。

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

例如下面就是一个简单的提示模板:

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

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

发送给模型的提示的具体数据格式有很大差异。最初是简单的字符串,现在提示已经发展到包括多个消息,一条消息中的每个字符串代表模型的一个不同角色。

嵌入 Embedding

嵌入是文本、图像或视频的数值表示,用于捕获输入之间的关系。

嵌入通过将文本、图像和视频转换为浮点数数组(称为向量)来工作。这些向量被用来捕获文本、图像和视频的含义。嵌入数组的长度称为向量的维度。

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

AI Embedding

作为探索 AI 的 Java 开发人员,不需要理解这些向量表示(vector representations)背后的复杂数学理论或具体实现,只需要对它们在 AI 系统中的作用和功能有基本的了解就足够了,特别是当你将 AI 功能集成到应用程序中时。

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

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

Token

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

在英语中,一个token大约对应 75% 的单词。作为参考,莎士比亚的全部作品,总计约 90 万字,可以转换为大约 120 万个token。

AI Token

也许更重要的是,token = 费用。在托管 AI 模型的上下文中,消耗的费用由使用的令牌数量决定。输入和输出都会被计入使用的总token数。

此外,模型也会受到token的影响,因为它限制了在单个 API 调用中处理的文本量。这个阈值通常称为 “上下文窗口”。模型不会处理超过此限制的文本。

例如,ChatGPT3 的token限制为 4K,而 GPT4 提供不同的选项,如 8K、16K 和 32K。Anthropic 的 Claude AI 模型的token限制为 100K,另外Meta 最近的研究产生了一个 100 万token限制的模型。

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

结构化输出 Structured Output

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

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

Structured Output

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

将数据和 API 引入 AI 模型

如何让 AI 模型获得它未经过训练的信息?

请注意,GPT 3.5/4.0 数据集仅延伸到 2021 年 9 月(今天2025年2月22日,学习得完了 o(╥﹏╥)o)。因此,该模型会说它不知道需要该日期之后的知识相关问题的答案。一个有趣的小知识是这个数据集大约为 650GB。

有三种技术可以将自定义 AI 模型用于你的数据:

  • 微调(fine Tuning):这种传统的机器学习技术涉及调整模型并更改其内部权重。然而,即使对于机器学习专家来说这也是一个具有挑战性的过程——尤其是对于像 GPT 这样的大型的极其资源密集的模型。此外,一些模型可能不提供此选项。
  • 提示填充(Promt Stuffing):这是一种更实用的替代方法,涉及将你的数据嵌入到提供给模型的提示中。鉴于模型的token限制,在模型的上下文窗口内呈现相关数据时需要技术处理。这种方法通俗地称为 “填充提示”。Spring AI 库可帮助你实现基于 “填充提示” 技术(也称为检索增强生成(RAG))的解决方案。Prompt Stuffing
  • 函数调用:此技术允许注册自定义用户函数,将大型语言模型连接到外部系统的 API。Spring AI 极大地简化了实现自定义函数调用的过程。

检索增强生成 RAG

面对将相关数据纳入提示以获得准确 AI 模型响应的挑战,检索增强生成(RAG Retrieval Augmented Generation)技术是一种解决方案。
该方法涉及批处理风格的编程模型,其中Job用于从文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。从高层次来看,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。
在将非结构化数据加载到向量数据库的过程中,最重要的转换之一是将原始文档分割成较小的部分。将原始文档分割成较小部分的过程有两个重要步骤:

  1. 在保留内容语义边界的同时将文档分割成片段。例如,对于包含段落和表格的文档,应避免在段落或表格中间分割文档。对于代码,避免在方法实现中间分割代码。
  2. 将文档分割后的片段进一步分割成大小满足 AI 模型token限制的碎片。

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

AI RAG

  • ETL Pipeline 这一节中进一步解释了如何编排从数据源解析数据以及将数据保存到结构化向量存储的流程,以确保在将数据传递给AI模型时,数据处于最佳检索格式。
  • ChatClient – RAG 这一节介绍了如何使用 QuestionAnswerAdvisor 在应用程序中启用 RAG 功能。

函数调用 Tool Calling

大型语言模型(LLM)在训练后是固定的,这会导致知识变陈旧,并且它们也无法访问或修改外部数据。

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

Spring AI 极大地简化了你需要编写以支持函数调用的代码。它为你处理函数调用对话。你可以将你的函数作为 @Tool 注解的方法,然后在提示选项中激活。此外,还可以在单个提示中定义和引用多个函数。

Tool Calling

解释下上图中各个步骤:

  • ① 当我们想在模型中使用函数时,我们会将函数的定义放到对话请求中。每个函数的定义中包含了名称、描述(例如,解释模型何时应调用该函数)和输入参数(例如,函数的输入参数模式)的信息
  • ② 当模型决定调用函数时,它会按照定义格式将函数名称以及参数信息发送到响应信息中
  • ③ 应用程序负责确认函数并用收到的参数信息执行函数
  • ④ 应用程序处理函数的调用结果
  • ⑤ 应用程序将函数调用结果返回给模型
  • ⑥ 模型将函数调用结果作为补充上下文用于产出最终的结果

参考函数调用文档来获取更多的信息以在更多不同的AI模型中使用这个功能。

评估 AI 响应

有效地评估 AI 系统响应用户请求的输出对于确保最终应用程序的准确性和可用性非常重要。有几种新兴技术使预训练模型本身可用于此目的。

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

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

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

Spring AI 项目提供了一个 Evaluator API,目前提供了评估模型响应的基本策略。参考 Evaluation Testing 文档获取更多的信息。

END!!

发表评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.