Spring AI 核心概念

AI Concepts

⚠️以下基于 Spring AI 1.0.0 M3 版本的文档进行翻译。

本节介绍 Spring AI 使用的核心概念。我们建议仔细阅读它,以了解 Spring AI 是如何实现的。

Models 模型

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

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

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

模型分类

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

像 GPT 这样的模型的不同之处在于它们的预训练性质,如 GPT 中的"P"所示(Chat Generative Pre-trained Transformer )。不需要广泛的机器学习或模型训练背景,此预训练功能就可以将 AI 转换为通用的开发人员的工具。

Prompts 提示词

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

ChatGPT 的 API 在一个提示中有多个文本输入,每个文本输入都分配了一个角色。例如,有 system 角色,它告诉模型如何行为并设置交互的上下文。还有user角色,通常是来自用户的输入。

制作有效的提示词既是一门艺术,也是一门科学。ChatGPT 专为人类对话而设计,这与使用 SQL 之类的东西来 "ask a question" 完全不同。一个人与 AI 模型进行交流,需要类似于与另一个人交谈。

正是这种交互方式的重要性,以至于"Prompt Engineering"一词已经成为一门独立的学科。有一系列新兴的技术可以提高提示词的有效性。投入时间制作提示词可以大大提高结果输出。

分享提示词已成为一种公共实践,并且正在积极地进行关于这一主题的学术研究。例如,创建有效的提示(例如,与 SQL 形成对比)是多么违反直觉,最近的一篇研究论文发现,您可以使用的最有效的提示之一以短语"深呼吸并逐步完成此工作"开头。这应该可以告诉你为什么语言如此重要。我们还不完全了解如何最有效地利用这项技术的先前迭代,例如 ChatGPT 3.5,更不用说正在开发的新版本了。

论文标题为:《Large Language Models are Zero-Shot Reasoners》 大语言模型是零样本推理机

Prompt Templates 提示模板

创建有效的提示词包括建立请求的上下文,并将请求的各个部分替换为特定于用户输入的值。

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

什么是StringTemplate? StringTemplate 是一个 Java 模板引擎(带有 C#、Objective-C、JavaScript、Scala 的端口),用于生成源代码、网页、电子邮件或任何其他格式化的文本输出。StringTemplate 特别擅长代码生成器、多站点皮肤和国际化/本地化。StringTemplate 还支持 ANTLR(ANother Tool for Language Recognition)。

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

Tell me a {adjective} joke about {content}. 告诉我一个{adjective}笑话关于 {content}。

在 Spring AI 中,提示模板可以比作 Spring MVC 架构中的 "V 视图"。提供模型对象(通常是 java.util.Map)来填充模板中的占位符。"预填充的" 字符串成为提供给 AI 模型的提示的内容。

预填充的原文为rendered

发送到模型的提示的特定数据格式存在相当大的变化。提示最初从简单字符串开始,现在已经发展到包含多条消息,其中每条消息中的每个字符串代表模型的不同角色。

Embeddings 嵌入模型

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

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

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

文本或图片转为向量

作为探索 AI 的 Java 开发人员,没有必要理解复杂的数学理论或这些向量表示背后的具体实现。对它们在 AI 系统中的角色和功能有基本的了解就足够了,尤其是在您将 AI 功能集成到应用程序中时。

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

您可以将此语义空间视为一个向量。

Tokens 词元

Tokens 在 LLM 中没有什么特别好的翻译,一般不翻译。

Tokens 是 AI 模型工作原理的构建块。在输入时,模型将字词转换为 Tokens。在输出时,他们将Tokens转换回字词。

Tokens拆解

也许更重要的是Tokens = 货币。在SaaS AI 模型的领域中,您的费用由使用的Tokens数量决定。输入和输出都会影响总Tokens计数。

此外,模型还受 Tokens 限制的约束,这些限制限制了在单个 API 调用中处理的文本量。此阈值通常称为 "上下文窗口(context window)"。模型不会处理任何超过此限制的文本。

例如,ChatGPT3 有 4K Tokens限制,而 GPT4 提供不同的选项,例如 8K、16K 和 32K。Anthropic 的 Claude AI 模型具有 100K Tokens限制,而 Meta 最近的研究产生了 1M Tokens限制模型。

如果要使用 GPT4 总结莎士比亚的汇总的作品,您需要设计软件工程策略来切碎数据并在模型的上下文窗口限制内呈现数据。Spring AI 项目可帮助您完成此任务。

Structured Output 结构化输出

AI 模型的输出传统上以 java.lang.String 的形式响应,即使您要求以 JSON 格式回复也是如此。它可能是正确的 JSON,但不是 JSON 结构,只是一个字符串。所以,在提示词中请求 "使用 JSON" 并不是 100% 生效的。

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

结构化输出

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

Bringing Your Data & APIs to the AI Model 将您的数据和 API 引入 AI 模型

如何为 AI 模型配备尚未训练的信息?

请注意,GPT 3.5/4.0 数据集仅延长至 2021 年 9 月。因此,该模型表示它不知道需要该日期之后知识的问题的答案。一个有趣的琐事是,这个数据集大约有 650GB。

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

  • Fine Tuning 微调:这种传统的机器学习技术涉及定制模型和更改其内部权重。然而,对于机器学习专家来说,这是一个具有挑战性的过程,并且由于 GPT 等模型的大小,它非常耗费资源。此外,某些模型可能不提供此选项。
  • Prompt Stuffing 提示词填充:一种更实用的替代方案涉及将数据嵌入到提供给模型的提示中。给定模型的 token 限制,需要技术在模型的上下文窗口中呈现相关数据。这种方法俗称 "填充提示"。Spring AI 可帮助您实现基于"填充提示"技术(也称为检索增强生成 (RAG))的解决方案。

RAG

  • Function Calling 函数调用:此技术允许注册自定义的用户函数,这些函数将大型语言模型连接到外部系统的 API。Spring AI 极大地简化了您需要编写以支持函数调用的代码。

RAG 检索增强生成

一种称为检索增强生成 (Retrieval Augmented Generation) 的技术已经出现,用于解决将相关数据纳入提示词以实现准确 AI 模型响应的挑战。

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

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

  • 将文档拆分为多个部分,同时保留内容的语义边界。例如,对于包含段落和表格的文档,应避免在段落或表格的中间拆分文档。对于代码,请避免在方法实现的中间拆分代码。
  • 将文档的各个部分进一步拆分为大小占 AI 模型Tokens限制的一小部分。

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

RAG 流程

  • ETL 管道提供了有关编排从数据源提取数据并将其存储在结构化向量存储中的流程的更多信息,从而确保数据在传递给 AI 模型时处于最佳检索格式。
  • ChatClient - RAG 项目介绍了如何使用 QuestionAnswerAdvisor 在应用程序中启用 RAG 功能。

Function Calling 函数调用

大型语言模型 (LLMs) 在训练后被冻结,导致知识过时,并且无法访问或修改外部数据。

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

Spring AI 大大简化了您需要编写以支持函数调用的代码。它为您处理函数调用对话。您可以将函数作为@Bean提供,然后在提示选项中提供函数的 Bean 名称以激活该函数。此外,您可以在单个提示中定义和引用多个函数。

函数调用

①发送 chat 请求,发送函数定义信息。提供name、description (例如解释模型何时应该调用函数)和输入参数(例如函数的输入参数架构)。

②当 Model 决定调用该函数时,它将使用输入参数调用该函数,并将输出返回给 Model。

③Spring AI 为您处理此对话。它将函数调用调度给相应的函数,并将结果返回给模型。

④Model 可以执行多个函数调用来检索它需要的所有信息。

⑤获取到所需的所有信息后,模型将生成响应结果。

有关如何将此功能与不同 AI 模型一起使用的更多信息,请遵循函数调用文档。

Evaluating AI responses 评估 AI 响应

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

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

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

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

Spring AI 项目提供了一个 Evaluator API,它目前可以访问评估模型响应的基本策略。有关详细信息,请遵循评估测试文档。

相关推荐
xiaolyuh1233 分钟前
Arthas修改类(如加日志)的实现原理
java
栗子叶7 分钟前
Java对象创建的过程
java·开发语言·jvm
学历真的很重要16 分钟前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
有一个好名字17 分钟前
力扣-从字符串中移除星号
java·算法·leetcode
IT=>小脑虎17 分钟前
Python零基础衔接进阶知识点【详解版】
开发语言·人工智能·python
zfj32126 分钟前
CyclicBarrier、CountDownLatch、Semaphore 各自的作用和用法区别
java·开发语言·countdownlatch·semaphore·cyclicbarrier
黄焖鸡能干四碗27 分钟前
智能制造工业大数据应用及探索方案(PPT文件)
大数据·运维·人工智能·制造·需求分析
2501_9167665432 分钟前
【JVM】类的加载机制
java·jvm
Sag_ever33 分钟前
Java数组详解
java
张np33 分钟前
java基础-ConcurrentHashMap
java·开发语言