1.1 介绍

该Spring AI项目旨在简化集成人工智能功能的应用程序的开发,避免不必要的复杂性。

该项目从 LangChainLlamaIndex 等知名的 Python 项目中汲取灵感,但 Spring AI 并非这些项目的直接移植。

该项目创立的初衷是,下一代生成式人工智能应用不仅面向 Python 开发者,还将广泛应用于多种编程语言。

Spring AI 解决了人工智能集成面临的根本挑战:将您的企业数据和API与人工智能模型连接起来。

在这里插入图片描述
Spring AI 提供了一系列抽象概念,作为开发 AI 应用的基础。这些抽象概念有多种实现方式,使得组件替换只需极少的代码改动即可完成。

Spring AI 提供以下功能:

  • 为聊天、文本转图像和嵌入模型提供跨 AI 提供商的可移植 API 支持。同时支持同步和流式 API 选项。此外,还可访问特定模型的功能。

  • 支持所有主流AI模型提供商,例如Anthropic、OpenAI、Microsoft、Amazon、Google和Ollama。支持的模型类型包括:

    • 聊天结束

    • 嵌入

    • 文字转图像

    • 音频转录

    • 文本转语音

    • 适度

  • 结构化输出- 将 AI 模型输出映射到 POJO。

  • 支持所有主流矢量数据库提供商,例如 Apache CassandraAzure Cosmos DBAzure Vector SearchChromaElasticsearchGemFireMariaDBMilvusMongoDB AtlasNeo4jOpenSearchOraclePostgreSQL/PGVectorPineconeQdrantRedisSAP HanaTypesenseWeaviate

  • Vector Store (向量存储)提供商的可移植 API,包括一种新颖的类似 SQL 的元数据筛选 API。

  • 工具/函数调用- 允许模型请求执行客户端工具和函数,从而根据需要访问必要的实时信息并采取行动。

  • 可观测性——提供有关人工智能相关操作的洞察。

  • 用于数据工程的文档摄取ETL 框架。

  • AI 模型评估- 用于帮助评估生成的内容并防止产生幻觉反应的实用程序。

  • Spring Boot 自动配置和启动器,适用于 AI 模型和向量存储。

  • ChatClient API - 用于与 AI 聊天模型通信的 Fluent API,其惯用方式与 WebClient 和 RestClient API 类似。

  • Advisors API - 封装了重复出现的生成式 AI 模式,转换发送到语言模型 (LLM) 和从语言模型 (LLM) 发送的数据,并提供了跨各种模型和用例的可移植性。

  • 支持聊天对话记忆和检索增强生成(RAG)。

此功能集可让您实现常见用例,例如“对文档进行问答”或“与文档聊天”。

1.2 Spring AI 使用的核心概念

本节介绍 Spring AI 使用的核心概念。

1.2.1 模型

  • 人工智能模型是旨在处理和生成信息的算法,通常模仿人类的认知功能。
  • 通过学习大型数据集中的模式和洞察,这些模型可以进行预测,并生成文本、图像或其他输出,从而增强各行各业的各种应用。
  • 人工智能模型种类繁多,每种模型都适用于特定的应用场景。
    • ChatGPT 及其生成式人工智能功能通过文本输入输出吸引了众多用户,但许多其他模型和公司也提供多样化的输入输出方式。
    • ChatGPT 出现之前,许多人对 MidjourneyStable Diffusion 等文本到图像生成模型非常着迷。

下表根据输入输出类型对几种模型进行了分类:
在这里插入图片描述

  • Spring AI 目前支持以语言、图像和音频为输入和输出的模型。

  • 上表中最后一行接受文本作为输入并输出数字,这通常被称为嵌入文本,它代表了 AI 模型中使用的内部数据结构。Spring AI 支持嵌入,从而可以实现更高级的应用场景。

  • GPT 等模型的独特之处在于其预训练特性,正如 GPT 中的“P”所示——聊天生成预训练 Transformer。

  • 这种预训练特性将人工智能转变为一种通用的开发者工具,无需深厚的机器学习或模型训练背景。

1.2.2 提示

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

  • ChatGPT 的 API 在提示信息中包含多个文本输入框,每个输入框都被赋予一个角色。例如,系统角色用于告知模型如何运行并设置交互上下文。用户角色则通常代表用户的输入。

  • 设计有效的提示语既是一门艺术,也是一门科学。ChatGPT 的设计初衷就是为了模拟人与人之间的对话。这与使用 SQL 之类的代码“提问”截然不同。用户必须像与真人交谈一样与 AI 模型进行沟通。

  • 这种互动方式的重要性不言而喻,“提示工程”一词也因此发展成为一门独立的学科。目前涌现出大量能够提升提示效果的技巧。投入时间精心设计提示,可以显著改善最终的产出效果。

  • 分享提示语已成为一种普遍做法,并且学术界也正在积极开展相关研究。举例来说,创建有效的提示语可能与直觉相悖(例如,与 SQL 形成对比),最近的一篇研究论文发现,最有效的提示语之一以“深呼吸,一步一步来”开头。这应该能让你明白语言为何如此重要。我们尚未完全了解如何最有效地利用这项技术的早期版本,例如
    ChatGPT 3.5,更不用说正在开发的新版本了。

1.2.3 提示模板

  • 创建有效的提示包括确定请求的上下文,并将请求中的部分内容替换为用户输入的特定值。

  • 此过程使用传统的基于文本的模板引擎来创建和管理提示。

  • Spring AI为此采用了开源库StringTemplate

什么是StringTemplate

  • StringTemplate是一个 Java 模板引擎(支持C#Objective-CJavaScriptScala),用于生成源代码、网页、电子邮件或任何其他格式化的文本输出。
    StringTemplate 尤其擅长代码生成、多站点皮肤以及国际化/本地化。此外,StringTemplate 也为ANTLR提供支持。

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

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

Spring AI 中,提示模板可以类比于 Spring MVC 架构中的“视图”。通常java.util.Map会提供一个模型对象(例如 <Model>)来填充模板中的占位符。渲染后的字符串将成为提供给 AI 模型的提示内容。

发送给模型的提示数据格式存在相当大的差异。最初只是简单的字符串,后来提示逐渐演变为包含多条消息,每条消息中的每个字符串都代表模型的一个不同角色。

1.2.4 嵌入

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

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

通过计算两段文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。
在这里插入图片描述
作为一名探索人工智能的Java开发者,无需理解复杂的数学理论或这些向量表示背后的具体实现。只需基本了解它们在人工智能系统中的作用和功能即可,尤其是在将人工智能功能集成到应用程序时。

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

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

1.2.5 Tokens

Tokens 是人工智能模型运行的基本组成部分。

模型在输入时将单词转换为tokens,在输出时将tokens转换回单词。

在英语中,一个词素大约相当于一个单词的75%。作为参考,莎士比亚的全部作品,总计约90万个单词,相当于大约120万个词素。
在这里插入图片描述

或许更重要的是,tokens等同于金钱。在托管式人工智能模型的背景下,您的费用取决于所使用的tokens数量。输入和输出都会计入token 总数。

此外,模型还受到令牌限制,该限制规定了单次 API 调用中处理的文本量。此阈值通常被称为“上下文窗口”。模型不会处理超出此限制的任何文本。

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

要使用 GPT-4 对莎士比亚全集进行概括,你需要设计软件工程策略来分割数据,并将其呈现在模型的上下文窗口范围内。

Spring AI 项目可以帮助你完成这项任务。

1.2.6 结构化输出

即使您要求以 JSON 格式返回结果, AI 模型的输出通常也是字符串java.lang.String

虽然它可能是正确的 JSON 格式,但它并非 JSON 数据结构,而只是一个普通的字符串。

此外,在提示中要求“JSON 格式”也并非完全准确。

这种复杂性催生了一个专门领域,该领域涉及创建提示以产生预期的输出,然后将生成的简单字符串转换为可用于应用程序集成的数据结构。
在这里插入图片描述
结构化输出转换采用精心设计的提示,通常需要与模型进行多次交互才能达到所需的格式。

1.2.7 将您的数据和API 引入AI 模型

如何让AI模型掌握它未曾训练过的信息?

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

目前有三种方法可以定制 AI 模型以整合您的数据:

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

  • 提示填充:一种更实用的替代方案是将数据嵌入到提供给模型的提示中。考虑到模型的词元限制,需要一些技术手段才能在模型的上下文窗口中呈现相关数据。这种方法俗称“提示填充”。Spring
    AI 库可以帮助您实现基于“提示填充”技术的解决方案,该技术也称为检索增强生成 (RAG)。
    在这里插入图片描述

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

1.2.7.1 检索增强生成

一种名为检索增强生成(RAG)的技术应运而生,旨在解决将相关数据融入提示信息以获得准确人工智能模型响应的挑战。

该方法采用批处理式编程模型,作业从文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。

从宏观层面来看,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。

在将非结构化数据加载到矢量数据库的过程中,最重要的转换之一是将原始文档分割成更小的部分。

将原始文档分割成更小部分的过程包含两个重要步骤:

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

  2. 将文档的各个部分进一步拆分成若干部分,每个部分的大小应为 AI 模型令牌限制的一小部分。

RAG 的下一阶段是处理用户输入。

当用户的问题需要由 AI 模型回答时,问题及其所有“相似”的文档片段会被放入发送给 AI 模型的提示框中。

这就是使用向量数据库的原因。

向量数据库非常擅长查找相似内容。
在这里插入图片描述
ETL管道提供了有关协调从数据源提取数据并将其存储在结构化向量存储中的流程的更多信息,确保数据在传递给 AI 模型时处于最佳检索格式。

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

1.2.7.2 工具调用

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

工具调用机制旨在解决这些不足。

它允许您将自己的服务注册为工具,从而将大型语言模型连接到外部系统的 API。

这些系统可以为大型语言模型提供实时数据,并代表它们执行数据处理操作。

Spring AI 大大简化了您为支持工具调用而需要编写的代码。

它会自动处理工具调用过程。您可以将工具作为带@Tool注解的方法提供,并在提示选项中指定,使其可供模型使用。

此外,您还可以在单​​个提示中定义和引用多个工具。
在这里插入图片描述

  1. 当我们想让模型可以使用某个工具时,我们会将其定义包含在聊天请求中。每个工具定义都包含名称、描述和输入参数的模式。
  2. 当模型决定调用某个工具时,它会发送一个响应,其中包含工具名称和根据已定义模式建模的输入参数。
  3. 应用程序负责使用工具名称来识别和执行该工具,并根据提供的输入参数进行操作。
  4. 工具调用的结果由应用程序处理。
  5. 应用程序将工具调用结果发送回模型。
  6. 该模型使用工具调用结果作为附加上下文生成最终响应。
    有关如何将此功能与不同的 AI 模型结合使用的更多信息,请参阅工具调用文档
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐