传送门PyCharm无法识别LangChain库的问题AI系列1Spring AIAI系列2Spring AI调用本地模型AI 概念AI Concepts前面通过Spring AI体验了一把如何通过程序调用大模型比如付费模型DeepSeek、开源模型Qwen来实现对话式AI效果。但是在使用其它模型之前先看看spring AI的核心概念AI Concepts。对于这篇概念介绍官方是推荐仔细阅读的它描述了spring AI的实现思路We recommend reading it closely to understand the ideas behind how Spring AI is implemented.模型Models模型这个词不用估计大家一定是耳熟能详了。前面使用的deepseek-v4-flash、qwen3.5都是聊天模型。除此之外还有支持图像和音频的模型具体可以看下图图片来自 AI Concepts :: Spring AI Reference定义模型模型的定义在spring AI上是这么描述的AI models are algorithms designed to process and generate information, often mimicking human cognitive functions. By learning patterns and insights from large datasets, these models can make predictions, text, images, or other outputs, enhancing various applications across industries.翻译过来就是AI 模型是用于处理和生成信息的算法通常模拟人类的认知功能。通过学习海量数据集中的模式和规律这些模型能够进行预测生成文本、图像或其他输出从而赋能各行各业的应用程序。向量模型这里不去纠结定义是否准确要重点注意上表中最后一行——接受文本输入并输出数字——通常被称为文本嵌入Embedding它表示 AI 模型内部的数据结构。Spring AI 支持嵌入功能以支持更高级的使用场景。这句话该怎么理解呢嵌入就是“把文字转化成坐标”。Spring AI 帮你封装好了这个复杂过程让你能用这些“坐标”去做传统编程根本无法实现的“按意思找内容”这个也是后面RAG的实现基础通过向量模型将文本进行切割成向量再进行相似度匹配。提示词Prompts在上面的spring AI例子中调用接口时传入的message参数你是谁呀就是提示词这个词会通过API传递给大模型大模型计算之后会输出结果给到用户。不论ChatGPT、DeepSeek还是Gemini什么是提示词提示词的定义在spring AI上是这么描述的Prompts serve as the foundation for the language-based inputs that guide an AI model to produce specific outputs.翻译过来就是提示词是基于语言的输入基础用于引导 AI 模型生成特定的输出。对于熟悉 ChatGPT 的人来说提示词可能只是你在对话框里输入、然后发送给 API 的那段文字。这种用户输入的提示词一般称为用户提示词。与之相对的还可以在模型中设置系统提示词告诉模型该如何表现为交互设定上下文背景比如在DeepSeek中设置系统提示词不同的提示词对大模型的输出效果影响很大目前已经有大量不断涌现的技巧来提升提示词的效果。花时间精心打磨提示词可以显著改善输出质量。正因为这种交互方式如此重要“提示词工程”Prompt Engineering已经发展成为一个独立的学科领域甚至前段时间还有一种论调是提示词工程师比传统程序员更重要...除此以外这里还涉及到一个上下文窗口Context Window的问题好的提示词可以有效的减少占用上下文窗口的大小因为上下文窗口有固定的 Token可以理解为字词片段数量限制。而说到上下文窗口Context Window就要从Token说起。Tokens词元Token是什么关于Token的定义在前面Spring AI调用本地模型里面有提及在大型语言模型LLM中Token是模型处理文本时的最小基本单位。那在spring AI中是这样描述Tokens的Tokens serve as the building blocks of how an AI model works. On input, models convert words to tokens. On output, they convert tokens back to words.Token 是 AI 模型工作的基本构建单元。在输入时模型将单词转换为 Token在输出时再将 Token 转换回单词。除此之外还有工程和商业上的作用Token不仅仅是一个技术概念还是各个大模型厂商的计费单位与能力限制计费单位调用 OpenAI (如 GPT-4)、Claude 等商业 API 时费用是按处理的总 Token 数计算的输入 Token 输出 Token能力限制模型都有一个“上下文窗口”Context Window比如 4096 或 128k Token。这限制了模型一次能处理的文本总长度你的输入 模型输出Token的换算关系在使用大模型的过程中用户输入的都是提示词会经过特殊转换之后发给大模型。所以token与提示词的关系是怎么样的呢在spring Ai中是这么描述的In English, one token roughly corresponds to 75% of a word. For reference, Shakespeare’s complete works, totaling around 900,000 words, translate to approximately 1.2 million tokens.在英语中一个标记大约相当于一个单词的 75%。作为参考莎士比亚全集总计约 900,000 字可翻译成大约 120 万个Tokens。图片 AI Concepts :: Spring AI Reference推荐工具网站Revechat Token Calculator一个支持多种主流大模型如GPT、Claude、Gemini等的Token计算器可以上传文档进行分析网址LLM Token Calculator for GPT, LLaMA, Claude, DeepSeek, Gemini, and moreOpenAI TokenizerOpenAI官方的交互式分词器可以输入文本并精确查看它如何被拆分为Token及其数量网址https://platform.openai.com/tokenizer可以用上面的网站看到输入的提示词与token的关系下面是我随便输入的一个提示词这里值得注意的是不同的模型计算出来的Token有可能是不一样的尤其是中文差异比较大。比如deepSeek的官方说明Tokenizer在刚才openai的网站上可以看到转换工作是一个叫作Tokenizer的组件来完成。简单来说Tokenizer分词器是大模型的“翻译官”。它的核心工作就是把人类能看懂的文本翻译转换成模型能理解的数字Token ID。由于spring AI在这里没有对它进行介绍所以对于它具体的工作原理、切分规则、底层算法在后面章节单独讨论结构化输出AI模型的输出传统上是以String形式返回的。比如在前面例子中deepSeek模型的返回即使你要求模型以 JSON 格式回复。它可能是一个格式正确的 JSON但它不是 JSON 数据结构它只是一个字符串。修改一下上面的例子明确要求大模型返回JSON输出结果如下{\n \name\: \DeepSeek\,\n \description\: \我是由深度求索公司创造的AI助手专注于提供智能、高效的对话和问题解答服务。\,\n \version\: \1.0\,\n \capabilities\: [\文本生成\, \问题解答\, \信息检索\, \多语言支持\]\n}这个结果看起来像是一个JSON结构但是里面又有一些\n之类并且是通过字符串返回来的这就引出了第一个模型特点模型输出本质上永远是“字符串”无论你在提示词Prompt里怎么要求“请返回 JSON”模型最终吐出的内容在 Java或其他编程语言中接收到的类型都是java.lang.String。这个字符串可能符合 JSON 语法键值对、花括号、方括号等但它还不是一个真正的 JSON 对象或 Map/List 数据结构——它只是一串文本无法直接通过点号或下标访问字段“要求返回 JSON”并不百分百可靠即使提示词写得再明确模型也不一定总是输出严格合法的 JSON可能出现多余的解释文字如“这是您要的 JSON”缺少引号、尾随逗号、注释等非法语法格式错乱或被截断再将刚才的提示词改一下换一个稍微复杂一点的问题让它解释一下牛顿定理重新输入模型试试会发现这次的结果连JSON格式都保证不了它在前面加了一个markdown格式所以仅靠提示词不能保证输出可直接解析需要后续处理“提示工程”和“结构化输出转换”为了让模型输出真正可用的结构化数据工程师会精心设计提示词如指定 schema、使用 few-shot 示例、限定输出格式甚至会多次来回交互先让模型输出草稿再通过后续提问修正格式。这形成了一个专门的领域如何通过提示词设计和交互策略最大程度保证输出是合法且符合预期的结构而这就是大名鼎鼎的提示词工程Prompt Engineering图片来自 AI Concepts :: Spring AI Reference比如在提示词中给出示例也叫few-shot如果不给出任何示例一般叫zero-shot再修改一下提示词增加示例{ name: DeepSeek, creator: 深度求索公司, type: AI助手, version: 2025年1月版, capabilities: [文本对话, 文件处理支持图像、PDF、Word、Excel、PPT等, 长上下文理解1M tokens, 联网搜索需手动开启, 多语言支持], knowledge_cutoff: 2025年5月, availability: 免费, platforms: [网页端, 移动应用App] }不过在例子中因为不能直接在url的参数后面传递JSON格式所以这里先编码再传递到后端去再看看返回的结果这次的结果就比刚才好一些将您的数据和 API 引入 AI 模型现在大模型能回答相关问题一般都是因为它提前训练了对应的知识。如何让 AI 模型掌握它没有被训练过的信息Note that the GPT 3.5/4.0 dataset extends only until September 2021. Consequently, the model says that it does not know the answer to questions that require knowledge beyond that date. An interesting bit of trivia is that this dataset is around 650GB.请注意GPT 3.5/4.0 的数据集只更新到 2021 年 9 月。因此对于需要 2021 年 9 月之后知识的问题模型会表示自己不知道答案。这一点呢可以通过ollama部署的本地模型来验证那如何让AI模型掌握对应的信息呢或者说有没有必要呢答案肯定是显而易见的现在主流的有三种技术可以定制 AI 模型以融入你的数据1. 微调Fine Tuning这是一种传统的机器学习技术涉及调整模型并改变其内部权重。但对于 GPT 这样规模的模型来说这是一个极具挑战性的过程需要机器学习专家参与且资源消耗极大。此外有些模型可能不提供此选项。2. 提示词填充Prompt Stuffing一种更实用的替代方案是将你的数据嵌入到提供给模型的提示词中。考虑到模型的 Token 限制需要一些技术手段来在模型的上下文窗口内呈现相关数据。这种方法通俗地称为“填充提示词”。Spring AI 库可以帮助你实现基于“提示词填充”技术的解决方案也就是众所周知的检索增强生成RAG。3. 工具调用Tool Calling这种技术允许注册工具用户定义的服务将大语言模型连接到外部系统的 API。Spring AI 极大地简化了支持工具调用所需的代码编写工作。RAGRAG叫作检索增强生成Retrieval Augmented Generation简称 RAG用于解决如何将相关数据纳入提示词以获得准确 AI 模型响应的。RAG一般是通过知识库来使用的将信息创建成一个知识库然后将用户的问题在知识库中搜索传给大模型来得到答案。该方法涉及一个批处理风格的编程模型提取Extract从你的文档中一般是知识库的形式读取非结构化数据。转换Transform对数据进行处理切分也叫分片。加载Load将数据写入向量数据库也叫作embedding。要注意的是RAG的主要目的是减少上下文窗口大小的问题通过RAG技术提前将相关知识存储到向量模型然后将用户的问题通过这个RAG来获取准确的提示词再发送给大模型这样可以有效的减少与大模型对话在上下文信息。图片来自 AI Concepts :: Spring AI Reference就比如刚才的莎士比亚全集总计约 900,000 字可翻译成大约 120 万个Tokens。那如果现在有个问题要搜索沙蓊的小说如果模型预训练了对应的知道可以直接搜索。如果模型没有对应的知识那一种方法是在将用户的问题发送给大模型的同时将全集也发送给大模型。这种方式显然会对大模型的窗口产生非常大影响会降低模型的输出质量甚至超出上下文窗口导致失败。RAG尤其在私部署的时候特别有用因为很多敏感、小众、内网的材料一般是不会被外部模型所获取所以它可以有效的解决训练材料不足的问题用来做为问答助手、智能客服类的场景比较合适。工具调用上面提到大语言模型LLM在训练完成后就被“冻结”了这导致其知识会过时而且它们无法访问或修改外部数据。虽然可以通过RAG补充对应的知识但是RAG对应的知识库理论上还是会过时当时可以通过一定的同步机制来做准实时。工具调用机制解决了这些缺陷。它允许你将自定义服务注册为工具将大语言模型连接到外部系统的 API。这些系统可以为 LLM 提供实时数据并代表 LLM 执行数据处理操作。比如查询天气、路况、热点新闻、读取文件这些只要给大模型接入对应的服务能力或者叫作函数大模型就像长了手和脚可以操作外部工具了。而且Spring AI 极大地简化了支持工具调用所需的代码。它会为你处理工具调用的对话流程。你可以将工具作为带有Tool注解的方法提供并在提示词选项中将其设为可用。总结通过学习spring AI的官方文档上AI概念一节了解AI相关的一些知识包括模型、提示词、Token、RAG以及由此涉及到的Context、Tokenizer和上下文窗口大小等。当然现在的AI技术可能还不止于此比如最新的Agent、Harness、MCP还有各种AgentClaude code、Opencode、codeX等后面会详细介绍讨论