AI 概念
本节介绍 Spring AI 使用的核心概念。建议您仔细阅读,以了解 Spring AI 实现背后的思想。
模型(Models)
人工智能模型是用于处理和生成信息的算法,通常模仿人类的认知功能。通过从大型数据集中学习模式和洞察,这些模型可以进行预测、文本、图像或其他输出,从而增强各行各业的各种应用。
AI 模型种类繁多,每种模型都适用于特定的用例。虽然 ChatGPT 及其生成式 AI 功能通过文本输入和输出吸引了众多用户,但许多模型和公司也提供多样化的输入和输出。在 ChatGPT 出现之前,许多人对文本转图像生成模型(例如 Midjourney 和 Stable Diffusion)着迷。
下表根据输入和输出类型对几种模型进行了分类:
Spring AI 目前支持将输入和输出处理为语言、图像和音频的模型。上表的最后一行,接受文本作为输入并输出数字,更常见的称为嵌入文本,表示 AI 模型中使用的内部数据结构。Spring AI 支持嵌入,以实现更高级的使用案例。
像 GPT 这样的模型之所以与众不同,是因为它们具有预训练的特性,正如 GPT Chat 生成预训练 Transformer 中的 “P” 所示。这种预训练特性将 AI 转化为一种通用的开发人员工具,无需广泛的机器学习或模型训练背景。
提示词(Prompts)
提示词作为基于语言的输入的基础,引导 AI 模型产生特定的输出。对于那些熟悉 ChatGPT 的人来说,提示词可能看起来只是输入对话框并发送到 API 的文本。然而,它包含的内容远不止于此。在许多 AI 模型中,提示词的文本不仅仅是一个简单的字符串。
ChatGPT 的 API 在一个提示词中包含多个文本输入,每个文本输入都被赋予一个角色。例如,有系统角色,它告诉模型如何行为并设置交互的上下文。还有用户角色,通常是用户的输入。
创建有效的提示既是一门艺术,也是一门科学。
ChatGPT 是为人类对话而设计的。这与使用类似 SQL 的方式 “提问” 有很大的不同。人们必须像与他人交谈一样与 AI 模型进行交流。
这种互动方式的重要性如此之大,以至于 “提示工程” 这个术语已经成为一门独立的学科。一系列技术正在蓬勃发展,这些技术可以提高提示的有效性。投入时间制作提示可以显著提高最终的产出。
分享提示词已经成为一种社区实践,并且在这个主题上正在进行积极的学术研究。作为一个例子,说明创建有效的提示语可能有多么违反直觉 (例如,与 SQL 形成对比), 最近的一篇研究论文发现,你可以使用的最有效的提示语之一是这样开始的:“深吸一口气,一步一步地做这件事。”
这应该能给你一个暗示,让你明白为什么语言如此重要。我们还没有完全理解如何最有效地利用这项技术的先前迭代,例如 ChatGPT 3.5, 更不用说正在开发的新版本了。
提示模板(Prompt Templates)
创建有效的提示包括建立请求的上下文,并将请求的部分替换为特定于用户输入的值。
这个过程使用传统的基于文本的模板引擎来创建和管理提示。Spring AI 为此使用 OSS 库 StringTemplate。
例如,考虑一个简单的提示模板:
Tell me a {adjective} joke about {content}.
在 Spring AI 中,提示符模板可以类比为 Spring MVC 架构中的 “视图”。提供一个模型对象,通常是 java.util.Map
, 用于填充模板中的占位符。“渲染” 字符串成为提供给 AI 模型的提示符的内容。
发送到模型的提示词的具体数据格式存在相当大的变化。最初,提示词只是简单的字符串,后来演变成包含多条消息,其中每条消息中的每个字符串都代表了模型的不同角色。
嵌入(Embeddings)
嵌入是文本、图像或视频的数值表示,用于捕捉输入之间的关系。
嵌入的工作原理是将文本、图像和视频转换为浮点数组,称为向量。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度。
通过计算两段文本向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。
作为一名探索人工智能的 Java 开发人员,我们不需要理解这些矢量表示背后复杂的数学理论或具体实现。只需要基本了解它们在人工智能系统中的作用和功能就足够了,尤其是在将人工智能功能集成到应用程序中时。
嵌入在实际应用中特别重要,例如检索增强生成 (RAG) 模式
。它们允许将数据表示为语义空间中的点,这类似于欧几里得几何的二维空间,但在更高维度上。这意味着,就像欧几里得几何中平面上的点可以根据其坐标远近一样,在语义空间中,点的邻近性反映了意义的相似性。关于相似主题的句子在这个多维空间中被放置得更近,很像图中彼此靠近的点。这种邻近性有助于完成文本分类、语义搜索甚至产品推荐等任务,因为它允许人工智能根据相关概念在这个扩展的语义景观中的 “位置” 来识别和分组。
令牌(Tokens)
令牌是人工智能模型工作方式的基石。在输入时,模型将词语转换为令牌。在输出时,它们将令牌转换回词语。
在英语中,一个符号大约相当于一个词的 75%。作为参考,莎士比亚的全部作品,总计约 90 万个词,可以翻译成约 120 万个符号。
也许更重要的是,Tokens = Money。在托管 AI 模型的背景下,您的费用由使用的 Token 数量决定。输入和输出都会影响总 Token 数量。
此外,模型受到令牌限制,这限制了单个 API 调用中处理的文本数量。这个阈值通常被称为 “上下文窗口”。模型不会处理超过这个限制的任何文本。
例如,ChatGPT3 的令牌限制为 4K, 而 GPT4 提供了不同的选择,如 8K、16K 和 32K。Anthropic 的 Claude AI 模型以 100K 令牌限制为特征,Meta 最近的研究产生了 1M 令牌限制模型。
为了用 GPT4 总结莎士比亚的作品集,你需要设计软件工程策略来分解数据,并在模型的上下文窗口限制内呈现数据。Spring AI 项目可以帮助你完成这项任务。
结构化输出(Structured Output)
AI 模型的输出传统上以 java.lang.String
的形式出现,即使你要求回复使用 JSON 格式。它可能是正确的 JSON 格式,但它不是 JSON 数据结构。它只是一个字符串。此外,在提示符中要求 “for JSON” 并不是 100% 准确的。
这种复杂性导致了一个专门领域的出现,该领域涉及创建生成预期输出的提示符,然后将生成的简单字符串转换为可用于应用程序集成的数据结构。
结构化输出转换使用精心设计的提示符,通常需要与模型进行多次交互才能实现所需的格式。
将您的数据和 API 引入 AI 模型
如何将未经训练的信息添加到 AI 模型中?
请注意,GPT 3.5/4.0 数据集只能持续到 2021 年 9 月。因此,该模型表示它不知道超过那个日期所需知识的问题答案。一个有趣的小细节是,这个数据集大约为 650GB。
有三种技术可以自定义 AI 模型来整合你的数据:
- 微调(Fine Tuning):这种传统的机器学习技术涉及调整模型和改变其内部权重。然而,对于机器学习专家来说,这是一个具有挑战性的过程,而且对于像 GPT 这样的模型来说,由于其规模庞大,资源极其耗费。此外,一些模型可能不提供这种选择。
- 提示填充(Prompt Stuffing):一个更实用的替代方案是将数据嵌入提供给模型的提示中。鉴于模型的标记限制,需要使用技术在模型的上下文窗口中呈现相关数据。这种方法通俗地称为 “填充提示”。Spring AI 库帮助你实现基于 “填充提示” 技术的解决方案,这种技术也被称为
检索增强生成 (RAG)
。 - 工具调用(Tool Calling):这种技术允许注册工具 (用户定义的服务), 这些工具将大型语言模型与外部系统的 API 连接起来。Spring AI 极大地简化了你需要编写的代码,以支持工具调用。
检索增强型生成(Retrieval Augmented Generation)
一种被称为检索增强生成 (RAG) 的技术已经出现,用于解决将相关数据整合到准确的 AI 模型响应提示中的挑战。
该方法涉及批处理样式编程模型,其中作业从文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。在较高层面上,这是一个 ETL (提取、转换和加载) 管道。向量数据库用于 RAG 技术的检索部分。
作为将非结构化数据加载到向量数据库的一部分,最重要的转换之一是将原始文档分割成更小的片段。将原始文档分割成更小片段的过程包括两个重要步骤:
1. 将文档分割成部分,同时保留内容的语义边界。例如,对于包含段落和表格的文档,应避免在段落或表格的中间分割文档。对于代码,应避免在方法实现的中间分割代码。
2. 进一步将文档的各个部分分割成大小仅为 AI 模型标记限制的一小部分的部分。
RAG 的下一阶段是处理用户输入。当用户的问题需要由 AI 模型回答时,问题和所有 “相似” 的文档片段都会被放入发送给 AI 模型的提示符中。这就是使用向量数据库的原因。它非常擅长找到相似的内容。
ETL 流水线
提供了关于如何协调从数据源提取数据并将其存储在结构化向量存储中的流程的进一步信息,确保在将数据传递给 AI 模型时,数据处于最佳检索格式。- ChatClient-RAG 解释了如何使用 QuestionAnswerAdvisor 在应用程序中启用 RAG 功能。
工具调用(Tool Calling)
大语言模型 (LLMs) 在训练后会被冻结,导致知识过时,并且无法访问或修改外部数据。
工具调用机制解决了这些缺点。它允许您将自己的服务注册为工具,以将大型语言模型连接到外部系统的 API。这些系统可以为 LLM 提供实时数据,并代表他们执行数据处理操作。
Spring AI 极大地简化了您需要编写的代码,以支持工具调用。它为您处理工具调用对话。您可以将工具作为 @Tool 注解
的方法提供,并在提示符选项
中提供它,使其对模型可用。此外,您可以在单个提示符中定义和引用多个工具。
- 当我们想让一个工具对模型可用时,我们会在聊天请求中包含其定义。每个工具定义都包含一个名称、一个描述和输入参数的模式。
- 当模型决定调用工具时,它会发送一个响应,其中包含工具名称和根据定义的模式建模的输入参数。
- 应用程序负责使用工具名称来识别和执行具有所提供输入参数的工具。
- 工具调用的结果由应用程序处理。
- 应用程序将工具调用结果发送回模型。
- 模型使用工具调用结果作为额外的上下文来生成最终响应。
评估 AI 响应(Evaluating AI responses)
有效评估 AI 系统响应用户请求的输出对于确保最终应用的准确性和实用性非常重要。几种新兴技术使得可以使用预训练模型本身来实现这一目的。
这个评估过程包括分析生成的响应是否符合用户的意图和查询的上下文。使用相关性、一致性和事实正确性等指标来衡量 AI 生成响应的质量。
一种方法是同时呈现用户请求和 AI 模型对模型的响应,询问响应是否与提供的数据一致。
此外,利用存储在向量数据库中的信息作为补充数据可以增强评估过程,有助于确定响应的相关性。
Spring AI 项目提供了一个 Evaluator API, 该 API 目前提供了评估模型响应的基本策略。请参阅评估测试文档了解更多信息。
最后编辑:Jeebiz 更新时间:2025-08-31 23:07