《大模型应用开发实践:基于 Spring AI+DeepSeek 实现》第 12 章 Spring AI 开发入门 阅读笔记 2
第 12 章 Spring AI 开发入门
Spring AI 是 Spring 框架的全新子项目,专注于简化 AI 应用的集成与开发流程。
Spring AI 通过优化接入流程、支持多样化的 AI 模型,以及提供灵活的配置选项,帮助 Java 开发者将 AI 技术融入 Spring 应用程序。
12.1 Spring AI 概述
近年来,人工智能迅猛发展,但 Java 语言在 AI 领域的应用相对滞后,缺乏一套成熟且易于使用的框架支持 AI 开发。
为了填补 Java 在 AI 领域的空白,Spring 团队推出了 Spring AI 项目。
2024 年,Spring AI 集成至 Spring Initializr,极大地降低了 Java 应用程序接入大模型的学习成本 。
2024 年 2 月,Spring AI 发布了首个里程碑版本 0.8.0。
同年 4 月,Spring AI 1.0.0-SNAPSHOT 版本正式面世,标志着该项目正式开始支持全面的 API 和功能。
Spring AI 在设计理念上借鉴了 LangChain 和 LlamaIndex 等知名 Python 项目,但它并非对这些项目的直接复制或移植。
Spring AI 秉持开放的理念,倡导生成式 AI 应用的开发不应局限于 Python 开发者群体,而应跨越语言界限,面向更广泛的开发者生态。
Spring AI 功能丰富,支持多模态生成式 AI、跨平台 API 和矢量数据库,提供了全面的 AI 集成解决方案。
Spring AI 适用于多种场景,无论是升级现有应用、快速构建原型,还是跨平台部署 AI 功能,Spring AI 都能提供全方位的支持。
12.2 Spring AI 核心概念
在利用 Spring AI 进行项目开发之前,开发者应熟悉一系列基本概念。
这些概念包括 AI 模型、提示词、嵌入、词元、数据引入、结构化输出和检索增强等。
通过学习这些基本概念,有助于开发者全面理解 Spring AI 的开发流程和使用方法。
12.2.1 模型
AI 模型种类繁多,每种模型针对不同的任务需求进行了优化。
例如,Midjourney 和 Stable Diffusion 是专门用于从文本生成图像的模型,而 ChatGPT 擅长处理文本交互。
预训练是 AI 模型的重要特征,基于预训练模型构建基础框架,可通过微调适应特定场景需求。
这种方法不仅大幅缩短了从头训练模型的时间和资源消耗,还增强了模型的性能与泛化能力。
目前,Spring AI 支持处理语言、图像和音频等多种输入与输出格式。
此外,Spring AI 还提供对 Embedding 的支持,以实现更高级的用例,如多模态交互和跨领域应用。
12.2.2 提示词
提示词 (Prompt) 是用户向模型提供的输入信息,用于指导模型生成特定输出或执行特定任务。
提示词形式多样,包括关键词、引导词、上下文、问题及指令列表等。
编写高效的提示词既是一门科学,也是一门艺术。
其艺术性体现在如何巧妙地设计提示词,以激发模型的最佳表现;
科学性则要求设计者准确理解模型的运作机制,并运用专业知识优化提示词。
目前,提示词工程已发展为一个独立的研究领域。
12.2.3 嵌入
嵌入 (Embeddings) 用于将离散的、非结构化数据转换为连续向量。
在自然语言处理领域,语义上相似的词在向量空间中彼此接近。
例如,Word2Vec 模型中 "king" 和 "queen" 的向量表示相近。
在 RAG 中,Embeddings 通过将外部文档转换为向量捕捉文本的语义信息。
对于应用层的 Java 开发工程师而言,无须深入理解这些向量表示背后的复杂数学理论或具体实现,只需掌握相关的基本理论即可。
12.2.4 词元
词元 (Token) 表示文本中的独立且有意义的单元,例如单词、短语、子词等文本元素。
在处理用户输入时,大模型首先进行 Token 化,将原始文本转换为模型可处理的 Token 序列。
对于英语这种具有清晰单词边界的语言,Token 通常直接对应单词或标点符号。
Token 化并非简单的一对一映射,某些复杂词汇或特殊结构的单词可能被拆分为多个 Token。
例如,莎士比亚全集包含约 90 万个单词,但被转化为多达 120 万个Token。
Token 的使用量与成本直接相关。无论是发送给模型的输入信息,还是模型生成的输出信息,都会被分解为若干 Token,每个 Token 都会产生相应的费用。
由于计算资源和模型设计的限制 ,大模型通常会限制输入 Token 的最大长度。超出该长度的文本需要被截断或分割为多部分进行处理。
例如,使用 GPT-4 总结莎士比亚的作品时,需要设计软件工程策略切分数据,并在模型的上下文窗口限制内呈现。
Spring AI 提供工具和策略,帮助开发人员简化这一过程。
12.2.5 结构化输出
通常情况下,大模型的输出是简单的字符串。即使请求以 JSON 格式返回,实际返回的也是字符串形式的 JSON,而非真正的 JSON 数据结构。Spring AI 使用结构化输出转换器将字符串转换为 JSON、XML 或 Java 类等数据类型。
Spring AI 提供了多种输出转换器的实现,包括 AbstractMessageOutput-Converter、AbstractConversionServiceOutputConverter、MapOutputConverter、BeanOutputConverter 和 ListOutputConverter 等。
12.2.6 数据引入
由于知识截止日期固定,大模型在处理时效性强的信息时存在局限性。为此,Spring AI 提供多种方法将用户数据和 API 集成到 AI 模型中,使其能够基于最新信息或外部系统数据进行响应。
1.微调
微调 (Fine-Tuning) 指利用垂直领域的数据对已经预训练好的模型进行进一步训练,以优化其在特定任务上的表现。
对于 ChatGPT 等大模型而言,微调不仅耗费大量的计算资源,而且难度较高。
此外,部分模型出于设计限制或商业决策,并不提供微调选项。
因此,在实际应用中,微调并非常规手段。
2.提示填充
提示填充 (Prompt Stuffing) 用于将自定义数据整合到输入提示中。
Spring AI 采用检索增强生成技术支持提示填充。
以智能客服系统为例,开发者可以借助 Spring AI 的工具,将客户的历史对话记录整合到模型中,提高对话的连贯性和准确性。
关于提示填充的更多细节将在后续章节中详细介绍。
3.函数调用
函数调用 (Function Calling) 是一种模型与外部系统交互的机制。
通过自定义函数,开发者可以将外部数据源或 API 与模型连接,实现数据的即时获取与处理。
Spring AI 大幅简化了函数调用的编码工作,自动处理发送请求、执行函数和获取结果的完整流程。
例如,在金融咨询应用程序中,开发人员可以创建函数,获取股票的最新价格并将其整合到大模型的回复中。
关于函数调用的更多细节,将在后续章节中详细介绍。
12.2.7 检索增强生成
检索增强生成 (Retrieval Augmented Generation,RAG) 结合了检索与生成的优势,借助外部数据源弥补大模型自身知识的局限,提高生成内容的准确性和相关性,减少大模型的 "幻觉"。
检索增强生成的工作流程主要包括以下步骤。
首先,使用 ETL 管道从非结构化数据源(如文档、网页、数据库等)中提取数据,并将其转换为最适合大模型处理的格式。
随后,将大文档分割为较小片段,满足大模型的上下文窗口限制。
分割时需要确保每个片段在语义上是独立的,以便后续检索和生成。
然后,使用嵌入模型将文本片段转换为向量形式,并存储在向量数据库中。
当用户提交查询时,系统解析请求理解用户意图,并在向量数据库中使用相似性搜索检索最相关的数据片段。
最后,大模型将检索到的数据片段作为上下文输入,并基于内部知识和外部数据源信息生成最终响应。
关于检索增强生成的更多细节,将在后续章节中详细介绍。
12.2.8 响应评估
响应评估是保障大模型输出准确性的重要手段。
该过程主要涉及以下几个方面。
首先,通过分析用户输入的内容,验证响应是否准确捕捉了用户的意图,并且在逻辑上与上下文保持一致。
例如,如果用户询问 "如何煮咖啡",那么响应应提供具体的步骤,而不是介绍咖啡的历史。
其次,将用户的请求与大模型的响应重新输入评估模型或验证机制中,检验响应是否与提供的数据一致,以便发现模型输出中的潜在偏差或错误。
最后,通过检索向量数据库中存储的语义信息,并将其作为补充数据来辅助验证大模型响应与用户请求的相关性。