模型
AI 模型是设计用于处理和生成信息的算法,通常模仿人类的认知功能。通过从大型数据集中学习模式和洞察,这些模型可以进行预测、生成文本、图像或其他输出,从而在各个行业中增强各种应用程序的功能。
有许多不同类型的 AI 模型,每种模型都适用于特定的用例。尽管 ChatGPT 及其生成式 AI 功能通过文本输入和输出吸引了用户,但许多模型和公司提供了多种输入和输出方式。在 ChatGPT 之前,许多人对文本到图像生成模型(如 Midjourney 和 Stable Diffusion)很感兴趣。
下表根据输入和输出类型对几种模型进行了分类:

Spring AI 目前支持处理语言、图像和音频输入和输出的模型。上表的最后一行,接受文本作为输入并输出数字,通常被称为嵌入文本,它代表 AI 模型中使用的内部数据结构。Spring AI 支持嵌入,以启用更高级的用例。
GPT 等模型的独特之处在于它们的预训练特性,如 GPT 中的“P”所示——Chat Generative Pre-trained Transformer。这种预训练特性将 AI 转变为一种通用的开发工具,无需广泛的人工智能或模型训练背景。
模型参数Temperature的含义
在人工智能和机器学习领域,温度(Temperature) 是一个重要的参数,通常用于控制生成模型(如语言模型)的输出随机性或多样性。它是一个超参数,决定了模型生成内容的“创造性”或“保守性”。
温度的定义
温度参数通常用于调整模型生成输出时的概率分布。具体来说,它会影响模型在选择下一个词或输出时的决策过程。温度值越高,模型生成的输出越随机和多样化;温度值越低,模型生成的输出越确定性和保守。
温度的作用
生成的内容既有一定的多样性,又不会过于随机。
1. 低温度(接近 0):
模型倾向于选择最有可能的输出。
生成的内容通常更保守、更可预测。
适合需要高准确性和一致性的场景。
2. 高温度(大于 1):
模型生成的内容更加多样化和随机。
适合需要创造性或探索性的任务,例如创意写作、生成新颖的想法等。
3. 温度为 1:
模型的输出概率分布与训练时的分布一致。
提示(Prompts)
提示(Prompts)是指导人工智能模型产生特定输出的语言输入基础。对于熟悉ChatGPT的人来说,提示可能看起来只是对话框中输入并发送给API的文本。然而,它包含的内容远不止这些。在许多人工智能模型中,提示的文本不仅仅是一个简单的字符串。
ChatGPT的API在提示中包含多个文本输入,每个文本输入都被分配了一个角色。例如,有系统角色,它告诉模型如何行为并为交互设置上下文。还有用户角色
,这通常是用户的输入。
制作有效的提示既是一门艺术,也是一门科学。ChatGPT是为人类对话而设计的。这与使用SQL来“提问”有很大的不同。人们必须像与另一个人交谈一样与人工智能模型进行交流。
这种互动方式的重要性如此之高,以至于“提示工程”(Prompt Engineering)已经作为一个独立的学科出现。有一系列不断发展的技术可以提高提示的有效性。花时间精心制作提示可以极大地改善结果输出。
分享提示已经成为一种社区实践,并且在这个主题上正在进行积极的学术研究。例如,创建有效提示可能有多反直觉(例如,与SQL对比),最近的一篇研究论文发现,你可以使用的最有效的提示之一是以“深呼吸,一步一步地进行”这句话开始的。这应该能让你明白为什么语言如此重要。我们尚未完全理解如何最有效地利用这项技术的早期版本,例如ChatGPT 3.5,更不用说正在开发的新版本了。
提示词模版
创建有效的提示涉及建立请求的上下文,并将请求的部分替换为特定于用户输入的值。
此过程使用传统的基于文本的模板引擎进行提示的创建和管理。Spring AI 为此目的使用了开源库 StringTemplate。
例如,考虑以下简单的提示模板:
Tell me a {adjective} joke about {content}.
在 Spring AI 中,提示模板可以类比为 Spring MVC 架构中的“视图”(View)。通常是一个 java.util.Map 的模型对象被提供用来填充模板中的占位符。渲染后的字符串成为提供给 AI 模型的提示内容。
发送到模型的提示的具体数据格式存在相当大的变化。最初从简单的字符串开始,提示已经发展到包含多条消息,其中每条消息中的每个字符串都代表模型的一个不同角色。
嵌入(Embeddings)
嵌入(Embeddings)是文本、图像或视频的数值表示,能够捕捉输入之间的关系。
嵌入通过将文本、图像和视频转换为浮点数数组(称为向量)来工作。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度。
通过计算两段文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。

作为一名探索人工智能的Java开发人员,没有必要理解这些向量表示背后的复杂数学理论或具体实现。对于它们在人工智能系统中的角色和功能有一个基本的了解就足够了,尤其是在你将人工智能功能集成到你的应用程序中时。
嵌入在实际应用中特别相关,例如检索增强生成(Retrieval Augmented Generation,RAG)模式。它们使得数据能够被表示为语义空间中的点,这类似于欧几里得几何中的二维空间,但处于更高维度。这意味着,就像欧几里得几何中平面上的点可以根据它们的坐标彼此接近或远离一样,在语义空间中,点的接近程度反映了它们在意义上的相似性。关于相似主题的句子在这个多维空间中被放置得更接近,就像图表上彼此靠近的点一样。这种接近性有助于诸如文本分类、语义搜索甚至产品推荐等任务,因为它允许人工智能根据它们在这个扩展的语义景观中的“位置”来识别和组合相关概念。
你可以将这个语义空间想象成一个向量。
令牌
令牌是 AI 模型工作方式的构建块。在输入时,模型将单词转换为令牌。在输出时,它们将令牌转换回单词。
在英语中,一个令牌大致对应于一个单词的 75%。作为参考,莎士比亚的全部作品,总共大约 900,000 个单词,转换为大约 120 万个令牌。

也许更重要的是,令牌 = 金钱。在托管的 AI 模型上下文中,你的费用由使用的令牌数量决定。输入和输出都对总令牌计数有所贡献。
此外,模型受到令牌限制,这限制了单次 API 调用中处理的文本量。这个阈值通常被称为“上下文窗口”。模型不会处理超出此限制的任何文本。
例如,ChatGPT3 有一个 4K 令牌限制,而 GPT4 提供了多种选项,如 8K、16K 和 32K。Anthropic 的 Claude AI 模型有一个 100K 令牌限制,Meta 最近的研究产生了一个 1M 令牌限制模型。
要使用 GPT4 概括莎士比亚的全部作品,你需要设计软件工程策略来分解数据,并在模型的上下文窗口限制内呈现数据。Spring AI 项目可以帮助你完成这项任务。
结构化输出
AI 模型的传统输出是一个 java.lang.String
,即使你要求以 JSON 格式回复也是如此。它可能是一个正确的 JSON,但它不是一个 JSON 数据结构。它只是一个字符串。此外,作为提示的一部分要求“JSON”并不完全准确。
这种复杂性导致了一个专门领域的出现,涉及创建提示以产生预期的输出,然后将结果的简单字符串转换为应用程序集成的可用数据结构。

结构化输出转换使用精心制作的提示,通常需要与模型进行多次交互以实现所需的格式化。
将您的数据和API带给 AI 模型
如何为 AI 模型提供其未经过训练的信息?
请注意,GPT 3.5/4.0 数据集仅扩展到 2021 年 9 月。因此,该模型表示它不知道需要该日期之后知识的问题的答案。一个有趣的轶事是,这个数据集大约有 650GB。
有三种技术可用于自定义 AI 模型以包含您的数据:
- 微调:这种传统的机器学习技术涉及调整模型并改变其内部权重。然而,对于像 GPT 这样的大型模型来说,这是一个对机器学习专家具有挑战性的过程,并且由于其规模,对于模型来说极其资源密集。此外,某些模型可能不提供此选项。
- 提示填充:一个更实用的替代方案涉及将您的数据嵌入到提供给模型的提示中。鉴于模型的令牌限制,需要技术来在模型的上下文窗口内呈现相关数据。这种方法通常被称为“填充提示”。Spring AI 库帮助您实现基于“填充提示”技术的解决方案,也称为检索增强生成(RAG)。

- 工具调用:这种技术允许注册工具(用户定义的服务),将大型语言模型连接到外部系统的 API。Spring AI 大大简化了支持工具调用所需的代码。
检索增强生成(RAG)
检索增强生成(Retrieval Augmented Generation,RAG) 技术应运而生,旨在解决如何将相关数据整合到提示中,从而让人工智能模型能够给出准确的回应。
这种技术采用批量处理式编程模型,从文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。从宏观层面来看,这是一条 ETL(提取、转换和加载)数据管道。向量数据库用于 RAG 技术的检索环节。
在将非结构化数据加载到向量数据库的过程中,最重要的转换之一是将原始文档拆分成更小的片段。将原始文档拆分成更小片段的流程包含两个关键步骤:
- 在保留内容语义边界的前提下拆分文档:例如,对于包含段落和表格的文档,应避免在段落或表格中间进行拆分。对于代码,应避免在方法实现的中途进行拆分。
- 进一步将文档的各个部分拆分成更小的片段:这些片段的大小应是人工智能模型令牌限制的一小部分。
RAG 的下一个阶段是处理用户输入。当用户的问题需要由人工智能模型来回答时,问题以及所有“相似”的文档片段将被放入发送给人工智能模型的提示中。这就是使用向量数据库的原因,它在查找相似内容方面表现出色。

- ETL Pipeline 提供了关于如何协调从数据源提取数据并将其存储到结构化的向量存储中的流程的进一步信息,确保数据在传递给 AI 模型时处于最佳检索格式。
- ChatClient – RAG 解释了如何使用
QuestionAnswerAdvisor
来在你的应用程序中启用 RAG 功能。
工具调用(Tool Calling)
大型语言模型(LLMs)在训练完成后会被冻结,这导致其知识陈旧,并且无法访问或修改外部数据。
Tool Calling 机制解决了这些不足。它允许你将你自己的服务注册为工具,从而将大型语言模型连接到外部系统的API。这些系统可以为LLMs提供实时数据,并代表它们执行数据处理操作。
Spring AI极大地简化了你需要编写的用于支持工具调用的代码。它为你处理工具调用对话。你可以将你的工具作为带有@Tool注解的方法提供,并在你的提示选项中提供它,使其对模型可用。此外,你还可以在单个提示中定义和引用多个工具。

- 当我们希望让模型可以使用一个工具时,我们会将其定义包含在聊天请求中。每个工具定义包括一个名称、一个描述以及输入参数的模式。
- 当模型决定调用一个工具时,它会发送一个带有工具名称和根据已定义模式建模的输入参数的响应。
- 应用程序负责使用工具名称来识别并使用提供的输入参数执行该工具。
- 工具调用的结果由应用程序处理。
- 应用程序将工具调用的结果发送回模型。
- 模型使用工具调用的结果作为额外的上下文来生成最终的响应。
更多关于如何在不同 AI 模型中使用此功能的信息,请参阅工具调用文档。
评估AI系统
有效地评估AI系统对用户请求的输出对于确保最终应用的准确性和有用性至关重要。一些新兴技术使得可以使用预训练模型本身来进行这种评估。
这种评估过程涉及分析生成的响应是否与用户的意图和查询的上下文一致。相关性、连贯性和事实正确性等指标被用来衡量AI生成响应的质量。
一种方法是将用户的请求和AI模型的响应都呈现给模型,查询响应是否与提供的数据一致。
此外,利用向量数据库中存储的信息作为补充数据可以增强评估过程,有助于确定响应的相关性。
Spring AI项目提供了一个Evaluator API,目前提供了评估模型响应的基本策略。更多详细信息,请参阅评估测试文档。