Spring AI 简介及概念

简介:

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


        该项目从 LangChain 和 LlamaIndex 等著名 Python 项目中汲取灵感,但 Spring AI 并不是这些项目的直接移植。该项目在创立之初就坚信,下一波生成式人工智能应用将不仅仅是 Python 开发人员的专利,它将在许多编程语言中无处不在。


        Spring AI 的核心是提供抽象,作为开发 AI 应用程序的基础。这些抽象有多种实现方式,只需极少的代码改动即可轻松实现组件交换。


Spring AI 提供以下功能:

  1. 支持所有主要的模型提供商,如 OpenAI、Microsoft、Amazon、Google 和 Huggingface。
  2. 支持的模型类型包括聊天、文本到图像、音频转录、文本到语音,以及即将推出的更多类型。
  3. 跨人工智能提供商的可移植 API 适用于所有模型。支持同步和流 API 选项。还支持下拉访问模型的特定功能。
  4. 将 AI 模型输出映射到 POJOs。
  5. 支持所有主要的矢量数据库提供商,如 Apache Cassandra、Azure Vector Search、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate。
  6. 跨矢量存储提供商的可移植应用程序接口(API),包括类似于 SQL 的新型元数据过滤器应用程序接口(API),该应用程序接口也是可移植的。
  7. 功能调用。
  8. 用于 AI 模型和矢量存储的 Spring Boot 自动配置和启动器。
  9. 数据工程的 ETL 框架。

        通过该功能集,您可以实现 "文档问答 "或 "与文档聊天 "等常见用例。
        概念部分对人工智能概念及其在 Spring AI 中的表现形式进行了高层次的概述。
        入门 "部分向您展示了如何创建第一个人工智能应用程序。随后的章节将以代码为中心深入探讨每个组件和常见用例。

ai概念

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

模型

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


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


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

InputOutputExamples

Language/Code/Images (Multi-Modal)

Language/Code

GPT4 - OpenAI, Google Gemini

Language/Code

Language/Code

GPT 3.5 - OpenAI-Azure OpenAI, Google Bard, Meta Llama

Language

Image

Dall-E - OpenAI + Azure, Deep AI

Language/Image

Image

Midjourney, Stable Diffusion, RunwayML

Language

Audio

OpenAI, Azure OpenAI

Audio

Language

OpenAI, Azure OpenAI

Text

Numbers

Many (AKA embeddings)

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


        正如 GPT-Chat Generative Pre-trained Transformer 中的 "P "所表示的,GPT 等模型的与众不同之处在于其预训练特性。这种预训练功能将人工智能转变为一种通用的开发人员工具,不需要广泛的机器学习或模型训练背景。

Prompts

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


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


        制作有效的提示既是一门艺术,也是一门科学。ChatGPT 是为人类对话而设计的。这与使用类似 SQL 的 "提问 "方式大相径庭。我们必须像与人对话一样与人工智能模型交流。


        这种交互方式如此重要,以至于 "提示工程"(Prompt Engineering)这一术语成为了一门独立的学科。提高提示有效性的技术层出不穷。在制作提示语方面投入时间,可以大大提高提示语的效果。


        分享提示语已经成为一种集体行为,学术界也在积极开展这方面的研究。例如,最近的一篇研究论文发现,最有效的提示语之一就是 "SQL"。

Prompt 模板

        创建有效的提示涉及建立请求的上下文并用特定于用户输入的值替换部分请求。 此过程使用传统的基于文本的模板引擎进行提示创建和管理。 Spring AI 为此使用 OSS 库 StringTemplate。 例如,考虑简单的提示模板:

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

        在 Spring AI 中,提示模板类似于 Spring MVC 架构中的"'视图'"。提供一个模型对象(通常是 java.util.Map)来填充模板中的占位符。渲染 "字符串将成为提供给 AI 模型的提示内容。


        发送给模型的提示的具体数据格式有很大的不同。提示最初只是简单的字符串,后来发展到包含多个信息,每个信息中的每个字符串都代表了模型的一个不同角色。

Embeddings

        嵌入将文本转换为数字数组或向量,使人工智能模型能够处理和解释语言数据。这种从文本到数字再到文本的转换是人工智能与人类语言交互并理解人类语言的关键因素。作为一名探索人工智能的 Java 开发人员,并不需要理解这些向量表示法背后复杂的数学理论或具体实现方法。对它们在人工智能系统中的作用和功能有基本的了解就足够了,尤其是当您要将人工智能功能集成到您的应用程序中时。


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


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

Tokens

        词块是人工智能模型工作的基石。在输入时,模型将单词转换为标记。在输出时,它们会将标记转换回单词。
        在英语中,一个标记大致相当于一个单词的 75%。作为参考,莎士比亚的全集共约 90 万字,大约相当于 120 万个代币。
        也许更重要的是,代币=金钱。
        在托管人工智能模型中,您的收费取决于所使用的代币数量。输入和输出都会对总代币数产生影响。
        此外,模型还受到令牌限制,这限制了单次 API 调用中处理的文本数量。这个阈值通常被称为 "上下文窗口"。模型不会处理任何超过此限制的文本。
        例如,ChatGPT3 的令牌限制为 4K,而 GPT4 提供了 8K、16K 和 32K 等不同选项。Anthropic 的克劳德人工智能模型具有 100K 标记限制,而 Meta 最近的研究则产生了一个具有 100 万标记限制的模型。
        要使用 GPT4 总结莎士比亚的作品集,您需要设计软件工程策略来切分数据,并在模型的上下文窗口限制内呈现数据。Spring AI 项目可以帮助您完成这项任务。

结构化输出

        人工智能模型的输出通常是 java.lang.String 格式,即使您要求以 JSON 格式回复。它可能是正确的 JSON,但它不是 JSON 数据结构。它只是一个字符串。此外,将 "for JSON "作为提示的一部分也不是 100% 准确的。
        这种错综复杂的情况导致了一个专业领域的出现,该领域涉及创建提示以生成预期输出,然后将生成的简单字符串转换为可用的数据结构,以便进行应用集成。


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

将数据带入人工智能模型

如何为人工智能模型配备未经训练的信息?


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


有三种技术可以定制人工智能模型,以纳入您的数据:

  • 微调: 这种传统的机器学习技术包括定制模型和改变其内部权重。然而,这对机器学习专家来说是一个具有挑战性的过程,而且由于 GPT 等模型的大小,对它们来说是一个极其耗费资源的过程。此外,有些模型可能不提供这一选项。
  • 提示填充: 一种更实用的替代方法是将数据嵌入提供给模型的提示中。鉴于模型的标记限制,需要在模型的上下文窗口中呈现相关数据的技术。这种方法俗称为 "填充提示"。Spring AI 库可以帮助您实现基于 "填充提示 "技术的解决方案,该技术也被称为 "检索增强生成"(RAG)。
  • 函数调用: 这种技术允许注册自定义用户函数,将大型语言模型与外部系统的 API 相连接。Spring AI 可大大简化为支持函数调用而需要编写的代码。

检索增强生成

        一种名为 "检索增强生成"(RAG)的技术应运而生,用于解决将相关数据纳入提示以获得准确的人工智能模型响应这一难题。
        这种方法采用批处理式编程模型,工作从文件中读取非结构化数据,对其进行转换,然后将其写入矢量数据库。在高层次上,这是一个 ETL(提取、转换和加载)管道。矢量数据库用于 RAG 技术的检索部分。
        作为将非结构化数据加载到矢量数据库的一部分,最重要的转换之一是将原始文档分割成小块。将原始文档分割成小块的过程有两个重要步骤:

  1. 在保留内容语义边界的前提下将文档分割成若干部分。例如,对于包含段落和表格的文档,应避免在段落或表格中间分割文档。对于代码,应避免在方法实现的中间部分分割代码。
  2. 将文档的各个部分进一步拆分成大小仅占人工智能模型标记限制一小部分的部分。

RAG 的下一阶段是处理用户输入。当人工智能模型要回答用户的问题时,问题和所有 "相似 "的文档碎片都会被放入发送给人工智能模型的提示中。这就是使用矢量数据库的原因。它能很好地找到相似的内容。

实现 RAG 时会用到几个概念。这些概念与 Spring AI 中的类相对应:

  • 文档阅读器: Java 功能接口,负责从数据源加载 List<Document> 文件。常见的数据源有 PDF、Markdown 和 JSON。
  • 文档: 数据源的文本表示形式,还包含描述内容的元数据。
  • 文档转换器: 负责以各种方式处理数据(例如,将文档分割成小块或向文档添加附加元数据)。
  • 文档写入器(DocumentWriter): 可以将文档持久化到数据库中(在人工智能堆栈中最常见的是矢量数据库)。
  • 嵌入: 将您的数据表示为 List<Double>,矢量数据库会用它来计算用户查询与相关文档的 "相似度"。

功能调用

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


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


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

评估人工智能响应

        要确保最终应用的准确性和实用性,有效评估人工智能系统响应用户请求的输出结果非常重要。一些新出现的技术可将预训练模型本身用于这一目的。


        这一评估过程包括分析生成的响应是否符合用户的意图和查询的上下文。相关性、一致性和事实正确性等指标被用来衡量人工智能生成的回复的质量。


一种方法是将用户的请求和人工智能模型的回复同时呈现给模型,并查询回复是否与所提供的数据一致。


此外,利用存储在矢量数据库中的信息作为补充数据,还能增强评估过程,帮助确定响应的相关性。


Spring AI 项目目前提供了一些非常基本的示例,说明如何以提示的形式评估响应,并将其纳入 JUnit 测试中。

入门

本节为如何开始使用 Spring AI 提供了起点。
您应根据自己的需要,按照以下各节中的步骤进行操作。

Spring CLI

Spring CLI 简化了直接从终端创建新应用程序的过程。与熟悉 JavaScript 生态系统的人使用的 "create-react-app "命令一样,Spring CLI 提供了一个 Spring boot 新命令来创建基于 Spring 的项目。Spring CLI 还提供了将外部代码库集成到当前项目的功能,以及许多其他提高生产力的功能。

重要的是要明白,"Spring CLI "与 "Spring Boot CLI "是两个不同的项目,各自有自己的功能。

要开始创建 Spring AI 应用程序,请按以下步骤操作:

  1. 下载最新的 Spring CLI 版本,并按照安装说明进行操作。
  2. 要创建基于 OpenAI 的简单应用程序,请使用以下命令:
  3. spring boot new --from ai --name myai
  4. 请查看生成的 README.md 文件,了解获取 OpenAI API 密钥和运行首个人工智能应用程序的指南。

目前,Spring CLI 仅支持 Maven 项目。

要在现有的 Maven 项目中添加同样简单的人工智能应用程序,请执行

spring boot add ai

Spring CLI 允许用户定义自己的项目目录,这些目录规定了哪些项目可以创建或添加到现有代码库中。

Spring Initializr

前往 start.spring.io,选择要在新应用程序中使用的 AI 模型和矢量存储。

添加里程碑和快照存储库

如果您喜欢手动添加依赖关系片段,请按照以下章节的说明进行操作。
要使用里程碑和快照版本,需要在构建文件中添加对 Spring 里程碑和/或快照资源库的引用。
对于 Maven,请根据需要添加以下版本库定义:

 <repositories>
    <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/milestone</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>spring-snapshots</id>
      <name>Spring Snapshots</name>
      <url>https://repo.spring.io/snapshot</url>
      <releases>
        <enabled>false</enabled>
      </releases>
    </repository>
  </repositories>

对于 Gradle,根据需要添加以下版本库定义:

repositories {
  mavenCentral()
  maven { url 'https://repo.spring.io/milestone' }
  maven { url 'https://repo.spring.io/snapshot' }
}

依赖性管理

Spring AI 物料清单(BOM)声明了特定版本的 Spring AI 所使用的所有依赖关系的推荐版本。在应用程序的构建脚本中使用 BOM 可以避免自己指定和维护依赖版本。相反,您使用的 BOM 版本将决定所使用的依赖版本。它还能确保您默认使用受支持且经过测试的依赖版本,除非您选择覆盖它们。
如果您是 Maven 用户,可以通过在 pom.xml 文件中添加以下内容来使用 pom.xml 文件 -

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Gradle 用户还可以利用 Gradle(5.0+)对使用 Maven BOM 声明依赖约束的本地支持,来使用 Spring AI BOM。具体做法是在 Gradle 构建脚本的依赖关系部分添加 "平台 "依赖关系处理程序方法。如下面的代码段所示,随后可以为希望使用的一个或多个 spring-ai 模块(如 spring-ai-openai)声明无版本限制的启动依赖关系。

dependencies {
  implementation platform("org.springframework.ai:spring-ai-bom:1.0.0-SNAPSHOT")
  // Replace the following with the starter dependencies of specific modules you wish to use
  implementation 'org.springframework.ai:spring-ai-openai'
}

为特定组件添加依赖项

文档中的以下各节说明了您需要将哪些依赖项添加到项目构建系统中。

Embeddings Models

聊天模型

图像生成模型

音频模型

向量数据库

示例项目

您可以克隆 GitHub 上的这些项目来开始学习。

OpenAI

Azure OpenAI

下一篇:Spring AI API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值