> 技术文档 > Spring AI 官方文档 AIGC入门到实战 (1) 认识Spring AI

Spring AI 官方文档 AIGC入门到实战 (1) 认识Spring AI

目录

前言

第一章 概述

第二章 特征

第三章 AI 概念

一、模型(Models)

二、提示词(Prompts)

三、嵌入(Embeddings)

四、Tokens

五、结构化输出(Structured Output)

六、扩展大模型私有信息

(1) 微调-Fine Tuning

(2) 提示填充-Prompt Stuffing

(3) 工具调用-Tool Calling

七、RAG概述

八、Tool Calling 概述

第四章 评估 AI 响应

第五章 SpringBoot整合

一、版本需求

二、父工程引入POM管理

后记


前言

        本专栏基于 Spring AI 首个稳定版本 1.0.0 展开全文中文翻译、学习、项目实战。 

        官方文档地址:Introduction :: Spring AI Reference

第一章 概述

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

        该项目从一些著名的 Python 项目(如 LangChain 和 LlamaIndex)获得灵感,但 Spring AI 并不是这些项目的直接移植。该项目的创立基于这样一种信念:下一波生成式 AI 应用不仅面向 Python 开发者,而是将普遍应用于多种编程语言。

        Spring AI 解决了 AI 集成的基本挑战:将企业数据和 API 与 AI 模型相连接。

第二章 特征

        Spring AI 提供了一系列抽象层,这些抽象层构成了开发 AI 应用的基础。这些抽象层拥有多种实现,使得在极少代码更改的情况下即可轻松替换组件。

Spring AI 提供以下功能:

  • 跨 AI 提供商的可移植 API,支持聊天(Chat)、文本生成图像(Text-to-Image)和嵌入(Embedding)模型。既支持同步调用,也支持流式(streaming)调用,并可访问各模型的专有功能。

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

    • 聊天补全(Chat Completion)

    • 嵌入(Embedding)

    • 文本生成图像(Text to Image)

    • 音频转录(Audio Transcription)

    • 文本转语音(Text to Speech)

    • 内容审核(Moderation)

  • 结构化输出:将 AI 模型的输出映射为 POJO 对象。

  • 支持所有主要的向量数据库提供商,例如 Apache Cassandra、Azure Cosmos DB、Azure Vector Search、Chroma、Elasticsearch、GemFire、MariaDB、Milvus、MongoDB Atlas、Neo4j、OpenSearch、Oracle、PostgreSQL/PGVector、PineCone、Qdrant、Redis、SAP HANA、Typesense 和 Weaviate。

  • 跨向量存储提供商的可移植 API,包括一种类 SQL 的元数据过滤接口。

  • 工具/函数调用(Tools/Function Calling):允许模型请求执行客户端的工具和函数,从而在需要时访问实时信息并采取相应操作。

  • 可观测性(Observability):提供对 AI 相关操作的监控与洞察。

  • 面向数据工程的文档引入 ETL 框架(Document ingestion ETL)。

  • AI 模型评估(AI Model Evaluation):提供工具帮助评估生成内容,并防止产生“幻觉”式错误响应。

  • 为 AI 模型和向量存储提供 Spring Boot 自动配置和 Starter。

  • ChatClient API:用于与 AI 聊天模型进行交互的流畅 API,使用方式类似于 WebClient 和 RestClient。

  • Advisors API:封装常见的生成式 AI 模式,对与大型语言模型(LLM)交互传递的数据进行转换,实现不同模型和使用场景之间的可移植性。

  • 支持聊天对话记忆(Chat Conversation Memory)和检索增强生成(Retrieval Augmented Generation,RAG)。

通过上述功能,您可以轻松实现诸如“对文档进行问答”或“与文档进行聊天”等常见用例。 

第三章 AI 概念

        介绍 Spring AI 使用的核心概念。建议仔细阅读,以了解 Spring AI 实现背后的思想。

一、模型(Models)

        AI 模型是旨在处理和生成信息的算法,通常模拟人类的认知功能。通过从大型数据集中学习模式和洞见,这些模型能够进行预测,生成文本、图像或其他输出,从而提升各个行业中的各种应用。

        有许多不同类型的 AI 模型,各自适用于不同的使用场景。虽然 ChatGPT 及其生成式 AI 能力凭借文本输入和输出吸引了众多用户,但还有许多其他模型和公司提供了多样化的输入和输出。在 ChatGPT 出现之前,许多人就已经对诸如 Midjourney 和 Stable Diffusion 之类的文本生成图像模型产生了浓厚兴趣。

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

        Spring AI 当前支持处理语言、图像和音频输入输出的模型。上图最后一行,其输入为文本、输出为向量数值,通常称为文本嵌入,代表了 AI 模型内部使用的数据结构。Spring AI 对嵌入提供支持,以实现更高级的用例。

        预训练功能使 AI 转变为一种通用的开发者工具,无需具备广泛的机器学习或模型训练背景。

二、提示词(Prompts)

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

        一个提示(prompt)中包含多个文本输入,每个输入都被分配了一个角色。例如,system(系统)角色用于告诉模型如何行为,并为交互设置上下文;还有 user(用户)角色,通常表示来自用户的输入内容。

        编写有效的提示既是一门艺术,也是一门科学。ChatGPT 是为人类对话而设计的,这与使用 SQL 来“提问”的方式有很大不同。与 AI 模型交流时,人们需要像与另一个人对话那样进行沟通。

        正因为这种交互方式的重要性,“提示工程”(Prompt Engineering)这一术语应运而生,并发展为一门独立的学科。如今已有大量不断增长的技巧集合,旨在提升提示的有效性。投入时间精心构造提示,可以显著提升生成结果的质量。

三、嵌入(Embeddings)

        嵌入(Embeddings)是文本、图像或视频的数值表示,用于捕捉输入之间的关系。嵌入的工作原理是将文本、图像或视频转换为浮点数数组,这些数组被称为向量。向量旨在捕捉文本、图像或视频的语义信息。嵌入数组的长度被称为向量的维度(Dimensionality)。通过计算两个文本对应向量表示之间的数值距离,应用程序可以判断生成这些嵌入向量的对象之间的相似度。

        作为一名探索 AI 的 Java 开发者,并不需要深入理解这些向量表示背后的复杂数学理论或具体实现。只需对它们在 AI 系统中的作用和功能有基本的了解,尤其是在将 AI 功能集成到应用程序中时,这就足够了。

        嵌入在诸如检索增强生成(RAG)等实际应用场景中尤为关键。它们使得数据能够被表示为语义空间中的点,这种语义空间类似于二维欧几里得几何空间,但维度更高。这意味着,就像欧几里得几何中平面上的点可以根据其坐标的远近来判断距离一样,在语义空间中,点之间的接近程度反映了它们在语义上的相似度。关于相似主题的句子会在这个多维空间中彼此靠近,就像图表上彼此接近的点一样。

        这种“接近性”在文本分类、语义搜索、甚至产品推荐等任务中起到了重要作用,因为它让 AI 能够根据在扩展语义空间中的“位置”识别和聚类相关概念。可以将这种语义空间看作是一个向量。

四、Tokens

        Token 是 AI 模型运作的基本单元。在输入阶段,模型会将词语转换为 token;在输出阶段,模型则会将 token 转换回词语。

        在英语中,一个 token 大致相当于一个单词的 75%。作为参考,莎士比亚的全集大约有 90 万个单词,转换成 token 后约为 120 万个。

        更重要的是,Token 就等同于费用。在托管 AI 模型的使用环境中,您的费用是根据使用的 token 数量来计算的。输入和输出的 token 都会计入总数。

        此外,模型会受到 token 限制,限制单次 API 调用中可处理的文本量。这个限制通常被称为“上下文窗口”(context window)。模型不会处理超过该限制的任何文本。总结莎士比亚全集时,使用 GPT-4 需要设计相应的软件工程策略,将数据切分成适合模型上下文窗口限制的部分。Spring AI 项目能够帮助你完成这项工作。

五、结构化输出(Structured Output)

        AI 模型的输出传统上是以 java.lang.String 的形式返回的,即使你请求回复为 JSON 格式。虽然这可能是一个正确的 JSON 字符串,但它并不是一个真正的 JSON 数据结构,而仅仅是一个字符串。此外,在提示中要求“返回 JSON”并不能保证 100% 得到准确的 JSON 格式。

        这种复杂性促使了一个专门领域的出现,即设计提示(prompt)以产生预期的输出,然后将得到的简单字符串转换为可供应用集成使用的数据结构。结构化输出转换采用精心设计的提示(prompts),通常需要与模型进行多次交互,才能达到所需的格式效果。

六、扩展大模型私有信息

        目前有三种主要技术可以让 AI 模型结合您自己的数据:

(1) 微调-Fine Tuning

        这是一种传统的机器学习技术,涉及对模型进行定制并调整其内部权重。但对于像 GPT 这样体量巨大的模型来说,这一过程不仅非常复杂,且资源消耗极高,通常只适合经验丰富的机器学习专家。此外,部分模型甚至不开放微调功能。

(2) 提示填充-Prompt Stuffing

        这是一种更实际可行的替代方案,它的做法是将您的数据嵌入到发送给模型的提示(Prompt)中。考虑到模型有令牌(Token)数量限制,您需要采用一些技术手段,在模型的上下文窗口内呈现相关数据。这种方式被称为“提示填充(Stuffing the Prompt)”。

        Spring AI 提供了便利的支持,帮助您实现基于“提示填充”的方案,这种方案也被称为 增强检索生成(Retrieval Augmented Generation,简称 RAG)

(3) 工具调用-Tool Calling

        这种技术允许注册工具(用户自定义的服务),使大语言模型可以连接到外部系统的 API。借助工具调用,模型不仅可以生成文本,还能请求执行某些具体操作或查询实时数据。

        Spring AI 大大简化了实现工具调用所需编写的代码,使开发者更容易将模型与实际业务系统联动起来。

七、RAG概述

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

        在将非结构化数据加载到向量数据库的过程中,一个最重要的转换是将原始文档拆分成更小的片段。将原始文档拆分成更小片段的过程包含两个关键步骤:① 在保留内容语义边界的前提下,将文档拆分成若干部分。例如,对于包含段落和表格的文档,应避免在段落或表格的中间进行拆分;对于代码,应避免在方法实现的中间进行拆分;② 进一步将文档的各部分拆分为大小仅占 AI 模型 token 限制很小一部分的更小片段。

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

八、Tool Calling 概述

        大型语言模型(LLMs)在训练完成后即被冻结,导致其知识会过时,而且它们无法访问或修改外部数据。

        工具调用(Tool Calling)机制可以弥补这些不足。它允许您将自己的服务注册为工具,连接大型语言模型与外部系统的 API。这些外部系统可以为 LLMs 提供实时数据,并代表它们执行数据处理操作。

        Spring AI 大大简化了您为支持工具调用所需编写的代码,它会为您处理工具调用的对话流程。您可以将自己的工具定义为带有 @Tool 注解的方法,并在提示选项中提供它,以便模型能够调用。此外,您还可以在一个提示中定义并引用多个工具。

        ① 当我们希望将某个工具提供给模型时,会在聊天请求中包含该工具的定义。每个工具定义都包括名称、描述以及输入参数的模式。

        ② 当模型决定调用某个工具时,它会发送一个响应,其中包含工具名称和按照定义模式构建的输入参数。

        ③ 应用程序负责根据工具名称识别并使用提供的输入参数来执行该工具。

        ④ 工具调用的结果由应用程序进行处理。

        ⑥ 应用程序将工具调用的结果发送回模型。

        ⑦ 模型会将工具调用结果作为附加上下文,生成最终的响应。

第四章 评估 AI 响应

        有效评估 AI 系统对用户请求的输出对于确保最终应用的准确性和实用性至关重要。一些新兴技术使得可以直接使用预训练模型本身来完成此评估。

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

        一种方法是将用户的请求和 AI 模型的响应一起呈现给模型,让其判断响应是否与所提供的数据相符。此外,将存储在向量数据库中的信息作为补充数据,也能增强评估过程,帮助确定响应的相关性。

        Spring AI 项目提供了一个 Evaluator API,目前可访问一些用于评估模型响应的基础策略。有关详细信息,请参阅“评估测试(Evaluation Testing)”文档。

第五章 SpringBoot整合

一、版本需求

        根据官方文档提示,整合Spring AI 1.0.0 需要使用 Spring Boot 3.4.x

        明确父工程POM中 SpringBoot 的版本

 3.4.6    org.springframework.boot spring-boot-dependencies ${springboot.version} pom import  

二、父工程引入POM管理

        Spring AI 的管理清单(BOM)声明了对应发布版本中使用的所有依赖项的推荐版本。该 BOM 仅包含依赖项管理,不包含插件声明,也不直接引用 Spring 或 Spring Boot。可以使用 Spring Boot 的父 POM,或者使用 Spring Boot 提供的 BOM(spring-boot-dependencies)来管理 Spring AI 各组件的版本。

具体配置如下:

  1.0.0    org.springframework.ai spring-ai-bom ${spring-ai.version} pom import  

后记

        专栏一文一分支,本文的后端分支是 SpringAI-1,前端分支是 main

后端仓库地址:https://gitee.com/wang-baohai/eal-pm

前端仓库地址:https://gitee.com/wang-baohai/eal-pm-web