1、Spring AI 核心概念

1、Spring AI 核心概念
引言Spring AI 是 Spring 社区推出的 AI 应用开发框架旨在帮助 Java 开发者轻松构建 AI 驱动的应用程序。本教程将讲解 Spring AI 的核心概念。一、AI 模型Models1.1 什么是 AI 模型AI 模型是设计用于处理和生成信息的算法通常模拟人类的认知功能。通过从大型数据集中学习模式和洞察这些模型可以做出预测、生成文本、图像或其他输出增强各行业的应用。1.2 模型类型分类Spring AI 支持多种类型的 AI 模型根据输入输出类型可分为输入类型输出类型典型模型文本文本ChatGPT、LLaMA、 文心一言、通义千问文本图像DALL-E、Stable Diffusion图像文本CLIP、BLIP音频文本Whisper文本数值向量Embedding 模型1.3 预训练模型的优势像 GPTGenerative Pre-trained Transformer这样的预训练模型其核心优势在于无需从头训练预训练模型已经在海量数据上完成了学习通用性强可以适应多种任务场景降低门槛开发者无需机器学习专业知识即可使用1.4 Spring AI 中的模型抽象Spring AI 通过统一的接口抽象不同的 AI 模型让开发者可以轻松切换底层模型// ChatClient 是高级 API提供流式调用方式StringresponseChatClient.create(chatModel).prompt(Hello, Spring AI!).call().content();// ChatModel 是低级 APIChatResponseresponsechatModel.call(newPrompt(newUserMessage(Hello, Spring AI!)));// 嵌入模型接口publicinterfaceEmbeddingModel{EmbeddingResponseembed(EmbeddingRequestrequest);}二、提示词Prompts2.1 提示词的本质提示词是引导 AI 模型产生特定输出的基于语言的输入基础。对于熟悉 ChatGPT 的用户来说提示词可能看起来只是输入到对话框中的文本但实际上它包含更多内容。2.2 提示词的角色体系在许多 AI 模型中提示词不仅仅是简单的字符串而是包含多个角色的文本输入System系统角色告诉模型如何行为设置交互的上下文User用户角色用户的输入Assistant助手角色模型的回复用于多轮对话示例结构[{role:system,content:你是一个专业的 Java 编程助手。},{role:user,content:请解释什么是 Spring AI},{role:assistant,content:Spring AI 是...},{role:user,content:它支持哪些模型}]2.3 提示词工程设计有效的提示词既是艺术也是科学。以下是一些常用技巧明确任务清晰描述期望的输出格式提供上下文给予足够的背景信息使用示例提供少量示例帮助模型理解分步骤思考引导模型逐步推理研究发现以 “Take a deep breath and work on this step by step.” 开头的提示词往往能获得更好的效果。三、提示词模板Prompt Templates3.1 模板的作用创建有效的提示词需要建立请求的上下文并将请求的部分内容替换为特定于用户输入的值。这类似于 Spring MVC 中的 “View” 概念。3.2 Spring AI 的模板引擎Spring AI 使用 StringTemplate 库来管理提示词模板。3.3 模板使用示例importorg.springframework.ai.prompt.PromptTemplate;// 定义模板PromptTemplatetemplatenewPromptTemplate(Tell me a {adjective} joke about {content}.);// 填充模板MapString,ObjectmodelnewHashMap();model.put(adjective,funny);model.put(content,programming);StringrenderedPrompttemplate.render(model);// 输出: Tell me a funny joke about programming.3.4 多消息模板随着提示词格式的演进模板也支持多消息结构ListMessagemessagesnewArrayList();messages.add(newSystemMessage(你是一个专业翻译助手));messages.add(newUserMessage(请将 {text} 翻译成中文));四、嵌入Embeddings4.1 嵌入的定义嵌入是文本、图像或视频的数值表示用于捕获输入之间的关系。它们通过将文本、图像和视频转换为浮点数数组称为向量来工作。4.2 向量的含义嵌入向量的长度称为向量维度常见的维度有 384、768、1536 等。向量中的每个数值都编码了原始内容的语义信息。4.3 相似度计算通过计算两个向量之间的数值距离可以确定它们所代表内容的相似度距离近内容语义相似距离远内容语义差异大4.4 语义空间概念嵌入将数据表示为语义空间中的点类似于欧几里得几何的二维空间但处于更高维度。语义相似的句子在这个多维空间中位置相近。4.5 实际应用场景嵌入在以下场景中特别重要语义搜索根据语义相似性搜索文档文本分类将文本分类到语义相近的类别推荐系统推荐语义相关的产品或内容RAG 模式检索增强生成的核心技术五、令牌Tokens5.1 令牌的概念令牌是 AI 模型工作的基本单位。在输入时模型将单词转换为令牌在输出时将令牌转换回单词。5.2 令牌与单词的关系在英语中一个令牌大约对应 0.75 个单词1 个令牌大约0.6 ~ 1.5 个汉字或 1 Token ≈ 1.3 个汉字莎士比亚全集约 90 万个单词 ≈ 120 万个令牌1000 个令牌 ≈ 750 个单词《红楼梦》大约150万个 Token5.3 令牌的重要性5.3.1 成本因素令牌 金钱。在使用托管的 AI 模型时费用由使用的令牌数量决定输入和输出都会计入令牌计数。5.3.2 上下文窗口限制模型有令牌限制限制单次 API 调用处理的文本量这个阈值通常称为上下文窗口模型上下文窗口GPT-3.54KGPT-48K / 16K / 32KClaude 3100KLlama 3128KQwen3.7-Max1MDeepSeek V4 Pro / Flash1M六、结构化输出Structured Output6.1 输出的挑战AI 模型的传统输出是java.lang.String即使要求返回 JSON它也只是一个字符串而非 JSON 数据结构。这给应用集成带来了挑战。6.2 结构化输出转换器Spring AI 提供了结构化输出转换器通过精心设计的提示词来实现期望的格式转换。常用的转换器包括BeanOutputConverter、MapOutputConverter和ListOutputConverterimportorg.springframework.ai.converter.BeanOutputConverter;// 定义输出结构recordPerson(Stringname,intage,Stringoccupation){}// 使用 BeanOutputConverter - 高级 APIPersonpersonChatClient.create(chatModel).prompt().user(提取以下文本中的人物信息{text}).param(text,张三今年30岁是一名软件工程师。).call().entity(Person.class);// 低级 API 使用方式BeanOutputConverterPersonconverternewBeanOutputConverter(Person.class);Stringformatconverter.getFormat();Stringtemplate 提取以下文本中的人物信息{text} {format} ;GenerationgenerationchatModel.call(PromptTemplate.builder().template(template).variables(Map.of(text,text,format,format)).build().create()).getResult();Personpersonconverter.convert(generation.getOutput().getText());6.3 工作流程构建包含格式要求的提示词获取模型的字符串输出将字符串解析为目标数据结构验证数据完整性和类型正确性七、向 AI 模型引入数据与 API7.1 问题背景AI 模型如 GPT 3.5/4.0的训练数据截止到 2021 年 9 月无法回答超出该日期的知识问题。如何让模型了解它未训练过的信息7.2 三种技术方案7.2.1 微调Fine Tuning传统的机器学习技术涉及调整模型内部权重。但对于 GPT 这样的大型模型微调极其耗费资源且并非所有模型都支持此选项。7.2.2 提示词填充Prompt Stuffing将数据嵌入到发送给模型的提示词中。由于模型的令牌限制需要技术来在模型的上下文窗口内呈现相关数据。Spring AI 帮助实现基于此技术的解决方案即RAG。7.2.3 工具调用Tool Calling允许注册工具用户定义的服务将大型语言模型连接到外部系统的 API。Spring AI 大大简化了支持工具调用所需编写的代码。八、检索增强生成RAG8.1 RAG 的概念检索增强生成Retrieval Augmented Generation是一种解决将相关数据纳入提示词以获得准确 AI 模型响应的技术。8.2 RAG 的工作流程RAG 采用批处理风格的编程模型分为两个阶段阶段一数据准备ETL 管道提取Extract从文档中读取非结构化数据转换Transform将文档分割成小块并生成嵌入加载Load将数据写入向量数据库阶段二查询处理用户提出问题在向量数据库中检索相似的文档片段将问题和相关文档片段放入提示词中发送给 AI 模型生成响应8.3 ETL 管道实现Spring AI 的 ETL 管道由三个核心组件组成// 文档读取器 - 读取 PDF 文件DocumentReaderpdfReadernewPagePdfDocumentReader(resource);// 文档转换器 - 分割文档DocumentTransformersplitternewTokenTextSplitter(512,// 每个片段的最大令牌数128// 片段之间的重叠令牌数);// 文档写入器 - 写入向量数据库DocumentWritervectorStorenewVectorStoreDocumentWriter(embeddingModel,vectorDb);// 执行 ETL 管道vectorStore.write(splitter.transform(pdfReader.read()));分割时需要注意保留语义边界避免在段落、表格或方法中间分割控制片段大小确保每个片段的大小不超过模型令牌限制的一小部分8.4 RAG 架构图用户问题 → 向量检索 → 相关文档片段 → 构建提示词 → AI 模型 → 生成响应 ↑ 向量数据库 ↑ ETL 管道文档嵌入九、工具调用Tool Calling9.1 问题背景大型语言模型LLM在训练后是冻结的导致知识过时无法访问或修改外部数据。9.2 工具调用机制工具调用机制解决了这些缺点允许将自定义服务注册为工具连接 LLM 与外部系统的 API。9.3 Spring AI 的工具调用Spring AI 大大简化了工具调用的代码编写。使用Tool注解标记方法为工具importorg.springframework.ai.tool.annotation.Tool;classWeatherService{Tool(description获取指定城市的天气)publicStringgetWeather(Stringcity){// 调用外部天气 APIreturn北京晴25°C;}}// 在提示词中使用工具ChatModelchatModel...StringresponseChatClient.create(chatModel).prompt(今天北京天气怎么样).tools(newWeatherService()).call().content();工具调用的完整流程由ChatClient内部自动处理模型决定是否调用工具、执行工具调用、将结果返回给模型、最终生成响应。9.4 工具调用流程注册工具将工具定义名称、描述、输入参数 schema包含在聊天请求中模型决策模型决定调用工具时发送包含工具名称和输入参数的响应执行工具应用负责使用工具名称识别并执行工具处理结果应用处理工具调用结果反馈给模型应用将工具调用结果发送回模型生成最终响应模型使用工具调用结果作为额外上下文生成最终响应十、AI 响应评估Evaluating AI Responses10.1 评估的重要性有效评估 AI 系统的输出对于确保最终应用的准确性和实用性至关重要。10.2 评估指标相关性Relevance响应是否与用户意图相关连贯性Coherence响应是否逻辑清晰、结构合理事实正确性Factual Correctness响应内容是否准确10.3 评估方法一种常见方法是将用户请求和 AI 模型的响应一起呈现给模型询问响应是否符合提供的数据。可以通过构造评估提示词来实现// 构造评估提示词StringevaluationPrompt 用户问题: {userQuery} AI 响应: {aiResponse} 参考数据: {referenceData} 请评估 AI 响应的质量 1. 相关性0-1分 2. 连贯性0-1分 3. 事实正确性0-1分 请以 JSON 格式返回评估结果 {relevance: 0.0, coherence: 0.0, correctness: 0.0, explanation: } ;// 使用 ChatClient 进行评估recordEvaluationResult(doublerelevance,doublecoherence,doublecorrectness,Stringexplanation){}EvaluationResultresultChatClient.create(chatModel).prompt().user(evaluationPrompt).param(userQuery,userQuery).param(aiResponse,aiResponse).param(referenceData,referenceData).call().entity(EvaluationResult.class);说明Spring AI 的评估功能正在持续演进中上述代码展示了评估的核心概念和实现方式。具体 API 请参考官方文档的最新版本。10.4 评估最佳实践建立评估数据集收集有代表性的用户查询和预期响应定期评估在模型升级或提示词优化后重新评估结合人工评估自动化评估与人工审核相结合关注边缘案例测试极端和边界情况总结核心要点回顾模型是 AI 的核心引擎Spring AI 通过统一接口抽象不同模型提示词是与 AI 交互的基础需要精心设计提示词模板提高了提示词的复用性和可维护性嵌入将文本转换为数值向量是语义搜索和 RAG 的基础令牌是模型处理的基本单位直接影响成本和上下文窗口结构化输出解决了 AI 输出的格式问题RAG通过检索相关数据增强模型响应的准确性工具调用扩展了模型的能力使其能够访问外部系统评估确保 AI 应用的质量和可靠性参考资源Spring AI 官方文档