【Spring AI】核心概念

272 阅读9分钟

Model

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

有许多不同类型的 AI 模型,每种模型都适用于特定的用例。 虽然 ChatGPT 及其生成式 AI 功能通过文本输入和输出吸引了用户,但许多模型和公司提供多样化的输入和输出。

image.png

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

GPT 等模型的不同之处在于它们的预训练性质,正如 GPT 中的“P”所示——聊天生成预训练转换器。 这种预训练功能将 AI 转变为通用的开发人员工具,不需要大量的机器学习或模型训练背景。

不同 AI 模型中使用的内部数据结构是否不同?

Promt

Promt 即提示。提示是指导 AI 模型生成特定输出的基于语言的输入的基础。 在许多 AI 模型中,提示的文本不仅仅是一个简单的字符串。

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

Prompt Template

Prompt Template 即提示模板。创建有效的提示涉及建立请求的上下文,并用特定于用户输入的值替换请求的部分。

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

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

在 Spring AI 中,提示模板可以比作 Spring MVC 架构中的“视图”。 提供了一个模型对象,通常为java.util.Map,用于填充模板中的占位符。 “'rendered'”字符串成为提供给 AI 模型的提示内容。

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

Embedding

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

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

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

image.png

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

Token

Token 即令牌。令牌是 AI 模型工作方式的构建块。在输入时,模型将单词转换为令牌。在输出时,他们将令牌转换回单词。

在英语中,一个令牌大致相当于一个单词的 75%。作为参考,莎士比亚的全集,总计约 900,000 字,相当于大约 120 万个令牌。

image.png

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

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

要用 GPT4 总结莎士比亚的收集作品,你需要设计软件工程策略来切碎数据并在模型的上下文窗口限制内呈现数据。

Structured Output

Structured Output 即结构化输出。传统上,AI 模型的输出以 java.lang.String 的形式出现,即使你要求输出采用 JSON 格式也是如此。它可能是正确的 JSON,但不是 JSON 数据结构。它只是一个字符串。此外,在提示中询问“for JSON”并不是 100% 准确。

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

image.png

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

Bringing Data & APIs to the Model

Bringing Data & APIs to the Model 即把数据和 API 引入模型。如何为 AI 模型配备尚未训练过的信息?

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

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

  • Prompt Stuffing:更实用的替代方法包括将数据嵌入到提供给模型的提示中。给定模型的令牌限制,需要技术在模型的上下文窗口中呈现相关数据。这种方法通俗地称为“填充提示符”。该技术也称为检索增强生成(RAG)。

image.png

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

Retrieval Augmented Generation

Retrieval Augmented Generation 即检索增强生成。一种名为“检索增强生成”(RAG)的技术已经出现,旨在解决将相关数据融入提示以获得准确 AI 模型响应的挑战。

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

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

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

  2. 将文档的各个部分进一步拆分为多个部分,其大小仅占 AI 模型令牌限制的一小部分。

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

image.png

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

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

Function Calling

Function Calling 即函数调用。大型语言模型 (LLM) 在训练后被冻结,导致知识陈旧,并且它们无法访问或修改外部数据。

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

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

image.png

(1)执行聊天请求,发送功能定义信息。后者提供 name、description(例如解释模型何时应调用函数)和 input parameters(例如函数的输入参数架构)。

(2)当模型决定调用函数时,它将使用输入参数调用函数,并将输出返回给模型。

(3)Spring AI 为你处理此对话。它将函数调用分派给相应的函数,并将结果返回给模型。

(4)模型可以执行多个函数调用来检索它需要的所有信息。

(5)一旦获取了所需的所有信息,模型将生成响应。

Evaluating AI responses

Evaluating AI responses 即评估 AI 响应。根据用户请求有效评估人工智能系统的输出对于确保最终应用程序的准确性和有用性非常重要。

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

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

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