
1. 项目概述SpringAI 核心概念全景图如果你最近在尝试将大语言模型LLM的能力集成到你的Java应用中大概率已经听说过SpringAI这个项目。它不像是一个全新的框架更像是Spring生态为AI时代准备的一套“标准接口”和“最佳实践工具箱”。官方文档里那些Models、Prompt、Embedding、RAG、Tool Calling等术语乍一看让人眼花缭乱感觉每个都要学。但根据我近期的项目实践这些概念并非孤立存在它们共同构成了一个从“简单问答”到“复杂智能体”的完整能力阶梯。今天我们就抛开那些零散的示例把这些核心概念串起来看看SpringAI究竟是如何帮你一步步构建AI应用的。理解了这个脉络你就能清楚地知道在什么场景下该用哪个“零件”以及如何将它们组装成你想要的“智能机器”。简单来说SpringAI的目标是让Java开发者能以熟悉的、声明式的方式就像你用RestController一样自然来使用LLM。Models是你的“大脑”供应商选择Prompt是你与大脑沟通的“指令集”Embedding是将知识转化为大脑能理解的“记忆编码”RAG是利用这些编码进行“精准知识检索”的机制而Tool Calling则是让大脑长出“手和脚”去操作外部世界。接下来我们就逐一拆解看看在SpringAI的语境下这些概念具体如何落地以及我在集成过程中踩过哪些坑有哪些配置上的“小心机”可以直接拿去用。2. Models不止是选择API更是定义交互范式当我们谈论SpringAI中的Models时很多人第一反应是哦就是选OpenAI的GPT还是Anthropic的Claude嘛。这没错但这只是最表层。在SpringAI的抽象里Model是一个核心接口它定义了与AI模型交互的最基本契约你给我一个提示Prompt我还你一个响应Response。这个简单的抽象背后隐藏着对不同模型提供商巨大差异的兼容性处理。2.1 模型抽象的层次与实现SpringAI将模型分为几个层次。最顶层是ChatModel和StreamingChatModel它们专为对话场景设计。下面一层是AudioModel、ImageModel等对应多模态。而我们最常打交道的是各种ChatClient的实现比如OpenAiChatClient、AnthropicChatClient。在你的application.yml里你可能这样配置spring: ai: openai: api-key: ${OPENAI_API_KEY} chat: options: model: gpt-4o-mini temperature: 0.7这很直观。但这里第一个容易忽略的点是options下的配置是模型级别的全局默认值。这意味着通过这个ChatClient发起的所有请求默认都会用gpt-4o-mini和0.7的创意度。但实际项目中我们往往需要根据不同场景动态调整参数。SpringAI通过ChatOptions对象来支持这一点。你可以在每次请求时覆盖这些默认值。我个人的习惯是在配置文件中只设置最通用的参数如api-key,base-url而将model,temperature等作为运行时参数。这样代码更灵活。例如在处理需要严谨逻辑的代码生成时我会把temperature设为0.1而在进行头脑风暴时则可能调到0.9。2.2 模型端点与兼容性陷阱网络热词里提到了“kimi code models endpoint https://api.kimi.com/coding/v1 rejected oauth cred”这样的错误。这引出了一个关键问题并非所有提供OpenAI兼容API的厂商其端点Endpoint和行为都100%一致。SpringAI的OpenAiChatClient默认指向https://api.openai.com/v1。当你使用国内如智谱、DeepSeek、Kimi等厂商时需要重写base-url。但仅仅改端点可能不够。有些厂商的请求/响应体字段、错误码格式可能与OpenAI官方有细微差别。这时直接使用OpenAiChatClient可能会遇到反序列化错误。SpringAI社区正在积极增加对更多厂商的原生支持如已支持的Anthropic、Azure OpenAI。对于尚未官方支持的厂商你有两个选择一是等待社区适配二是自己实现一个ChatModel接口虽然工作量稍大但能获得完全的控制权。在项目初期评估技术选型时务必对你目标模型的API兼容性进行验证这能避免后期大量的适配工作。注意配置模型时务必关注API的速率限制和成本。不同模型的context window上下文长度差异巨大直接影响你能否处理长文档。在application.yml中为不同环境dev/test/prod配置不同的模型是一个好习惯比如开发环境用低成本模型生产环境再用高性能模型。2.3 模型能力的探测与适配一个高级技巧是利用SpringAI的ModelDescriptor如果目标模型支持或简单的探测性Prompt来了解模型的能力边界。例如某些模型可能不支持function calling工具调用的前身或者对system角色的消息处理方式不同。在应用启动时可以发送一个简单的测试请求检查响应是否包含预期字段从而动态调整应用的行为模式。这能让你的应用在不同模型间有更好的鲁棒性。3. Prompt工程从静态文本到动态对话蓝图Prompt是驱动模型的燃料。在SpringAI里Prompt不再是一个简单的字符串而是一个结构化的对象包含一个或多个Message对象。这种设计迫使你以更工程化的思维去构建与模型的交互。3.1 消息Message的角色化设计SpringAI遵循了常见的消息角色分类SystemMessage,UserMessage,AssistantMessage。SystemMessage用于设定模型的背景、角色和行为准则它应该尽可能早地被注入并且在整个对话会话中保持稳定。UserMessage是用户的输入AssistantMessage通常是模型的历史回复用于维持多轮对话的上下文。一个常见的误区是把所有指令都塞进UserMessage。正确的做法是将稳定的、全局的指令放在SystemMessage中将具体的、本次的查询放在UserMessage中。例如如果你在构建一个代码助手SystemMessage应该是“你是一个专业的Java开发助手遵循Clean Code原则和安全规范。”而UserMessage则是“请为用户登录功能编写一个Spring Security的配置类。”3.2 提示词模板PromptTemplate与上下文注入静态提示词很快会碰到天花板。SpringAI的PromptTemplate是解决动态提示的关键。它允许你创建带有占位符如{topic}的模板字符串然后在运行时填充。这不仅仅是字符串替换模板引擎默认是Spring的SpringEL支持简单的逻辑判断和循环使得你可以构建非常复杂的动态提示。例如在一个客服场景中你的模板可能是你是一位客服代表。以下是用户的历史对话记录 {history} 当前用户的问题是{currentQuestion} 请根据公司政策{policy}和知识库{knowledge}进行回复。在运行时你可以从数据库或会话中提取history、policy和knowledge来填充这个模板。这实现了提示词与业务逻辑的解耦。网络热词中提到的“invalid prompt: your prompt was flagged as potentially violating our usage p”错误常常就源于动态内容注入时未经过滤意外引入了被模型安全策略禁止的内容。因此在将用户输入或外部数据注入提示模板前进行基本的清洗和审查是必要的。3.3 系统提示词System Prompt的实战技巧System Prompt是塑造模型行为的利器。写一个好的系统提示词有几个原则明确具体避免“你是一个有用的助手”这种模糊描述。要具体如“你是一个专注于Java微服务架构设计的专家你的回答应包含代码示例、架构图说明和阿里云最佳实践。”分步指令复杂的任务可以分解成步骤写在系统提示词里引导模型按流程思考。输出格式约束直接要求模型以特定格式如JSON、Markdown表格输出这能极大简化后端对响应的解析处理。负面约束明确告诉模型“不要做什么”有时比告诉它“要做什么”更有效。例如“不要假设用户已经提供了未明确说明的信息。”在SpringAI中你可以通过ChatOptions全局设置系统提示词也可以在构建单个Prompt时单独指定。对于多租户SaaS应用不同租户可能需要不同的系统角色后者提供了更大的灵活性。4. Embedding将万物转化为模型的语言如果说Prompt是给模型的“指令”那么Embedding就是给模型的“知识”。它的本质是将文本、图像、代码等高维离散数据映射到一个低维连续的向量空间中的一个点。语义相近的内容其向量在空间中的距离也更近。4.1 Embedding模型的选择与集成SpringAI提供了EmbeddingModel接口并内置了OpenAI、Ollama等客户端的实现。选择Embedding模型时你需要权衡几个因素维度向量的长度如768、1024、1536。更高的维度通常意味着更强的表现力但也会增加存储和计算成本。上下文长度单次能处理的最大文本长度。语言支持特别是对中文的语义理解能力。速度与成本本地模型如BGE、SentenceTransformers速度可能更快且无调用成本但需要自己部署和管理。网络热词中提到的“no embedding model is loaded. set rag_embedding_model to a valid sentencetra”错误通常发生在配置了RAG但未正确指定或初始化Embedding模型时。在SpringAI中你需要确保在配置文件中正确声明了Embedding客户端例如对于本地Ollama服务spring: ai: ollama: base-url: http://localhost:11434 embedding: options: model: nomic-embed-text # 或其他Embedding模型4.2 文本分块Chunking的策略与陷阱原始文档如PDF、Word不能直接扔给Embedding模型。你需要将其切割成大小合适的“块”Chunk。分块策略直接影响RAG的检索效果固定大小分块简单但可能割裂完整的语义单元如一个句子或段落从中断开。基于分隔符分块按段落、标题等自然分隔符切割能更好保持语义完整性。递归分块先按大分隔符分如果块太大再按小分隔符细分是一种折中方案。语义分块利用模型本身来理解边界更智能但更复杂。SpringAI的DocumentReader和Transformers体系支持这些分块策略。一个实战经验是分块大小没有黄金标准需要根据你的文档类型和查询特点进行试验。技术文档可能适合按章节或函数分块而客服对话记录可能适合按轮次分块。分块时通常需要一定的重叠Overlap例如前一个块的后50个词与下一个块的前50个词重复这能防止检索时因分割而丢失关键上下文。4.3 向量化与存储生成向量后你需要一个向量数据库Vector Database来存储和检索。SpringAI支持Pinecone、Milvus、Redis、PGVector等。以PGVectorPostgreSQL扩展为例集成非常Spring风格添加依赖spring-ai-pgvector-store配置数据源和VectorStore。使用VectorStore.add()存储文档块及其向量。使用VectorStore.similaritySearch()进行相似度检索。这里的关键是索引的创建。对于大规模数据必须在存储向量的列上创建高效的向量索引如IVFFlat、HNSW否则检索速度会随着数据量增长而急剧下降。SpringAI的PgVectorStore在初始化时会自动创建表但索引通常需要你根据数据规模和查询性能要求手动优化。5. RAG让模型学会“翻书查资料”RAG检索增强生成是当前将私有知识注入大模型最主流、最有效的方法。它的流程可以概括为用户提问 - 将问题转换为向量 - 从向量库中检索最相关的文档块 - 将问题和检索到的文档块一起组合成新的Prompt - 发送给模型生成答案。5.1 SpringAI中的RAG抽象SpringAI将RAG流程抽象为几个可插拔的组件Retriever检索器负责根据查询找到相关文档。最常用的是VectorStoreRetriever。ContentFormatter内容格式化器负责将检索到的文档块组织成模型可理解的上下文。PromptTemplate最终的提示词模板其中包含{question}和{documents}等占位符。一个基础的RAG链配置可能如下以编程式为例Bean public RetrievalAugmentor retrievalAugmentor(VectorStore vectorStore) { return RetrievalAugmentor.builder() .retriever(new VectorStoreRetriever(vectorStore)) // 使用向量检索 .contentFormatter(new DefaultContentFormatter()) // 默认格式化 .build(); } Bean public PromptTemplate ragPromptTemplate() { return new PromptTemplate( 请基于以下上下文信息回答问题。如果上下文信息不足以回答问题请直接说明你不知道。 上下文{documents} 问题{question} 答案 ); }然后在你的服务中你可以组合使用retrievalAugmentor和ragPromptTemplate来构建完整的RAG流程。5.2 提升RAG效果的关键技巧基础的RAG容易遇到“检索不准”和“生成幻觉”的问题。以下是一些提升效果的实战技巧查询重写与扩展用户的原始查询可能很简短不足以找到相关文档。可以在检索前先用LLM对查询进行重写或扩展。例如将“怎么退款”扩展为“关于电商平台订单退款的政策、流程和联系方式”。SpringAI可以通过一个前置的ChatModel调用轻松实现这一点。混合检索Hybrid Search除了向量相似度检索还可以结合关键词如BM25检索。两者结果经过加权或重排序Re-Ranking后合并能同时保证语义相关性和关键词匹配度。一些高级的VectorStore如Weaviate原生支持混合检索。重排序Re-Ranking初步检索可能返回几十个文档块使用一个更小、更快的重排序模型对Top K个结果进行精排只将最相关的几个块送入生成阶段能显著提升答案质量并减少Token消耗。元数据过滤在存储文档块时附带一些元数据如文档来源、章节、日期。检索时可以结合向量相似度和元数据过滤如“只检索2023年之后的政策文档”使检索更精准。网络热词中提到的“Agentic RAG”是更前沿的方向即让AI智能体主动管理RAG流程例如判断何时需要检索、检索什么、如何迭代优化查询等这超出了基础RAG的范围但SpringAI的Agent模块为构建此类应用提供了可能。5.3 RAG的评估与迭代搭建RAG系统不是一劳永逸的。你需要一套评估机制来衡量其效果。常见的评估维度包括检索相关性检索到的文档块是否真的与问题相关答案忠实度生成的答案是否严格基于提供的上下文有没有“胡编乱造”答案有用性答案是否真正解答了用户的问题可以构建一个包含“问题-标准答案-参考文档”的测试集通过自动化脚本或人工抽查的方式进行定期评估。根据评估结果回头调整你的分块策略、检索策略或提示词模板形成一个迭代优化的闭环。6. Tool Calling为模型赋予行动力Tool Calling或Function Calling是让LLM从“思想家”变为“行动者”的关键。模型可以根据对话内容决定调用一个你预先定义好的工具函数获取外部信息如查询天气、数据库或执行操作如发送邮件、创建工单然后将工具执行结果融入对话给出最终回复。6.1 在SpringAI中定义与注册工具在SpringAI中定义一个工具非常简单你只需要将一个普通的Spring Bean方法暴露为工具即可。通过Tool注解你可以为方法添加描述这些描述会被转换成模型能理解的“工具说明书”。Component public class WeatherService { Tool(description 根据城市名称获取该城市的当前天气信息) public String getWeather(ToolParam(description 城市名称例如北京、上海) String city) { // 这里调用真实的外部天气API return String.format(%s的天气是晴朗25摄氏度。, city); } }SpringAI会在应用启动时自动扫描带有Tool注解的Bean并将它们注册到ToolCalling的上下文中。关键在于方法的描述和参数描述要清晰准确这直接决定了模型是否能够正确理解并在合适的时机调用它。6.2 工具调用的执行流程当用户提问“北京天气怎么样”时SpringAI驱动的对话流程如下你的应用将用户消息和可用工具的描述列表发送给支持Tool Calling的模型如GPT-4, Claude 3。模型分析后认为需要调用getWeather工具并生成一个结构化的调用请求其中包含工具名getWeather和参数{city: 北京}。SpringAI的ToolCalling框架拦截到这个请求通过反射找到对应的Bean和方法传入参数并执行。工具执行后返回结果“北京的天气是晴朗25摄氏度。”。框架将这个结果作为新的上下文信息连同原始对话历史再次发送给模型。模型综合所有信息生成面向用户的自然语言回复“北京目前天气晴朗气温大约25摄氏度是个好天气。”整个过程对开发者几乎是透明的你只需要关注工具函数的业务逻辑实现。6.3 复杂工具调用与错误处理在实际项目中工具可能更复杂涉及多个参数或复杂对象。SpringAI能很好地处理这些情况。模型甚至可以进行“链式工具调用”即根据第一个工具的结果决定调用第二个工具。错误处理是Tool Calling中的重要环节。工具执行可能失败如网络超时、参数无效。SpringAI允许你在工具方法中抛出异常框架会捕获并将错误信息返回给模型模型可以尝试解释错误或调整策略。你应该为工具设计清晰的错误码和友好信息便于模型理解。另一个注意事项是工具描述的“幻觉”问题。如果工具描述得过于强大或模糊模型可能会在不适用的场景下尝试调用它。因此工具描述应实事求是明确其能力和边界。同时你也可以在系统提示词中增加对工具使用场景的约束性说明。7. 核心概念串联构建一个智能客服助手现在让我们把这些概念串联起来看一个简化的智能客服助手实现蓝图这能帮你理解它们如何协同工作。模型层Models我们选择gpt-4作为核心ChatModel因为它有优秀的推理和工具调用能力。同时我们配置一个BGE嵌入模型运行在本地Ollama上用于处理知识库的向量化以控制成本。知识准备Embedding将产品手册、常见问题解答FAQ、政策文档等上传。使用TextSplitter按语义段落进行分块块大小设为500字符重叠50字符。使用EmbeddingModel将每个文本块转化为向量。使用PgVectorStore将向量和元数据如所属文档、章节存入PostgreSQL并创建HNSW索引以加速检索。对话管理Prompt系统提示词设定助手的角色、语气和通用规则例如“你是XX公司的AI客服态度友好专业。回答必须基于已知知识库如果不知道就明确告知并引导用户联系人工客服。禁止编造信息。”用户提示词动态结合用户当前问题。RAG提示模板设计为“基于以下已知信息{context}请回答用户问题{question}。如果信息不足请说‘根据现有资料无法完全确认建议您……’”。RAG检索用户提问后先用EmbeddingModel将问题向量化。通过VectorStoreRetriever进行相似度检索并附加元数据过滤器{document_type: FAQ}优先检索FAQ。对检索到的Top 5结果使用一个轻量级重排序模型进行精排选择Top 3作为上下文。工具调用Tool Calling定义工具createSupportTicket创建工单、queryOrderStatus查询订单、scheduleCallback安排回电。当用户问题涉及具体订单查询或需要人工介入时模型会自主调用相应工具。工具执行后结果被融入对话流模型生成包含具体订单信息或工单号的最终回复。流程整合整个流程由SpringAI的ChatClient或更高级的Agent模板如ReActAgent来编排。它负责按顺序执行接收用户输入 - 触发RAG检索 - 组装最终Prompt - 调用ChatModel - 处理可能的Tool Calling - 返回最终响应。通过这样的架构客服助手不仅能基于知识库准确回答常见问题还能在复杂场景下主动调用后端系统完成实际操作实现了从问答到服务的跨越。8. 常见问题、排查技巧与配置心得在实际集成SpringAI的过程中你会遇到各种各样的问题。下面是我总结的一些典型问题及其排查思路以及一些未必在官方文档中强调的配置心得。8.1 连接与配置问题问题现象可能原因排查步骤与解决方案调用模型API超时或连接拒绝1. 网络不通或代理问题。2.base-url配置错误。3. 模型服务未启动如本地Ollama。1. 使用curl或Postman直接测试API端点。2. 检查application.yml中的spring.ai.openai.base-url或对应配置项确保末尾没有多余斜杠。3. 对于本地模型检查服务进程如ollama serve是否运行端口是否正确。报错“Invalid API Key”或认证失败1. API Key未设置或错误。2. Key没有相应权限。3. 环境变量未正确加载。1. 确认API Key在配置文件中或环境变量中已设置。SpringAI的配置优先级是配置文件 环境变量SPRING_AI_OPENAI_API_KEY。2. 在对应模型提供商的控制台检查Key的权限和余额。3. 对于企业级配置可能需要配置自定义的Client以处理复杂的认证头。日志中看到大量“Model not available”警告1. 配置的模型名称错误。2. 该模型在当前API端点不可用。1. 仔细核对模型名称区分大小写。例如gpt-4-turbo和gpt-4-turbo-preview是不同的。2. 查阅模型提供商的文档确认该模型是否在你所使用的区域或套餐中可用。8.2 提示词与内容生成问题问题现象可能原因排查步骤与解决方案模型回复出现“Im sorry, I cannot...”或拒绝回答1. 系统提示词或用户输入触发了模型的安全或内容策略。2. Prompt中包含被禁止的敏感词。1. 审查并调整系统提示词避免使用可能被误判为越权指令的表述。2. 对用户输入进行前置的内容安全过滤。3. 尝试调整temperature参数有时较低的temperature能减少“创造性”导致的偏离。回复内容冗长、重复或偏离主题1.temperature参数设置过高导致随机性大。2. Prompt指令不够清晰具体。3. 上下文过长模型注意力分散。1. 将temperature调低如从0.8调到0.2。2. 在Prompt中使用更明确的指令如“请用不超过三句话总结”、“请分点列出”。3. 在RAG场景中减少送入生成阶段的文档块数量或启用重排序只保留最相关的部分。模型不遵循指定的输出格式如JSON1. Prompt中对格式的指令不够强制。2. 模型能力限制。1. 在Prompt中强化格式要求例如“你必须且只能输出一个合法的JSON对象不要有任何其他解释。JSON格式如下...”。2. 在SpringAI端可以使用ResponseExtractor或输出解析器如BeanOutputParser对模型的原始输出进行后处理强制转换为目标格式。8.3 RAG与向量检索问题问题现象可能原因排查步骤与解决方案RAG检索不到任何相关文档1. 向量库为空或未正确写入数据。2. 查询文本的Embedding与库中向量语义不匹配。3. 相似度阈值设置过高。1. 检查数据注入流程确认文档分块和向量化过程成功并查询向量库确认数据存在。2. 检查查询时使用的EmbeddingModel是否与建库时是同一个模型不同模型生成的向量空间不同无法直接比较。3. 调低similarityThreshold参数或暂时不设阈值先看检索结果。检索到的文档不相关导致答案错误1. 文本分块策略不合理破坏了语义。2. Embedding模型对特定领域如专业术语语义捕捉不佳。3. 缺乏元数据过滤和重排序。1. 尝试不同的分块大小和重叠度观察对检索结果的影响。2. 考虑使用在特定领域如医疗、法律微调过的Embedding模型。3. 为文档块添加更丰富的元数据来源、类型、关键词并在检索时结合过滤。引入重排序模型。RAG响应速度慢1. 向量库未建索引或索引类型低效。2. 每次检索的文档块数量topK过多。3. Embedding模型调用延迟高。1. 对于PGVector为向量列创建ivfflat或hnsw索引。调整索引的构建参数如lists,ef_construction以平衡构建速度和查询精度。2. 根据业务需要合理设置topK值通常4-10个足够。3. 考虑使用本地部署的轻量级Embedding模型或对Embedding结果进行缓存。8.4 Tool Calling执行问题| 问题现象 | 可能原因 | 排查步骤与解决方案 | | :--- | :--- | 排查步骤与解决方案 | | 模型不调用工具或在不该调用时调用 | 1. 工具描述不够清晰模型无法理解其用途。2. 系统提示词中未鼓励或约束工具使用。3. 模型本身不支持或对Tool Calling能力弱。 | 1. 优化Tool注解中的description和ToolParam描述使其精准无歧义。2. 在系统提示词中明确说明“当你需要查询实时信息或执行操作时可以使用我提供给你的工具。”3. 确认你使用的ChatModel如gpt-4,claude-3-opus支持Tool Calling功能。较旧的模型可能不支持。 | | 工具调用参数解析错误 | 1. 模型生成的参数格式不正确如JSON解析错误。2. 参数类型不匹配如期望数字却传了字符串。 | 1. SpringAI的框架层会处理基本的解析。确保工具方法参数使用简单类型String, Integer等或已知的POJO。2. 在工具方法内部增加参数校验和类型转换的逻辑提供更友好的错误信息返回给模型。 | | 工具执行超时或失败导致流程中断 | 工具依赖的外部服务不稳定或不可用。 | 1. 为工具方法设置合理的超时时间如使用Timeout注解。2. 实现重试机制和熔断降级策略如使用Resilience4j。3. 在工具方法中捕获异常并返回结构化的错误信息让模型能够向用户解释“暂时无法完成操作建议稍后重试”。 |8.5 性能优化与生产就绪心得连接池与超时设置对于高频调用的模型API务必配置HTTP客户端如Apache HttpClient或OkHttp的连接池、连接超时、读取超时。这能有效避免因网络波动导致的线程阻塞。spring: ai: openai: client: connect-timeout: 10s read-timeout: 30s异步与非阻塞AI模型调用通常是I/O密集型且耗时的。强烈建议在Service层使用Async或响应式编程WebFlux进行异步调用避免阻塞Web容器线程提升应用整体吞吐量。缓存策略Prompt缓存对于结构固定、仅参数变化的复杂Prompt模板可以缓存渲染后的结果。Embedding缓存相同的文本反复计算Embedding是浪费。可以使用CacheManager对EmbeddingModel的调用结果进行缓存。向量检索结果缓存对于热门或重复的查询可以缓存其检索到的文档ID列表。监控与可观测性在生产环境中必须对SpringAI的关键操作进行监控。指标Metrics记录每次模型调用的耗时、Token消耗、成功率。日志Logging为AI相关操作设置独立的日志级别如DEBUG记录详细的请求和响应注意脱敏便于问题排查。追踪Tracing集成Micrometer Tracing将一次用户请求背后的模型调用、工具调用、向量检索串联起来形成完整的调用链这对于分析延迟和故障点至关重要。成本控制模型API调用是主要成本来源。设置预算和告警在模型提供商平台设置月度预算和用量告警。区分环境开发测试环境使用低成本模型如gpt-3.5-turbo生产环境再用高性能模型。优化Prompt和上下文精简Prompt移除不必要的指令。在RAG中严格控制送入生成阶段的上下文长度。使用Streaming响应可以更快地给用户返回首字改善体验但需注意它可能无法减少总Token消耗。SpringAI将强大的AI能力以Spring开发者熟悉的方式带到了Java世界。从基础的Model调用到复杂的RAG和Tool Calling应用它提供了一套渐进的、可组合的抽象。真正的挑战不在于如何使用这些API而在于如何根据你的业务场景合理地设计和编排这些组件并在性能、成本、效果之间找到最佳平衡点。我的体会是从小而具体的场景开始先让一个核心流程比如一个简单的知识问答跑通然后逐步引入更高级的特性如工具调用、复杂检索持续迭代和评估是构建稳健AI应用的最有效路径。