SpringAi学习之核心概念
写在前面
本篇开始我们进入Spring Ai的学习,建议多浏览 官方文档,加深印象,使用的Spring Ai版本为1.0.0.
模型(Models)
人工智能模型是设计用来处理和生成信息的算法,通常模仿人类的认知功能。通过从大型数据集中学习模式和洞察力,这些模型可以做出预测,生成文本、图像或其他输出,增强各行各业的各种应用。
有许多不同类型的人工智能模型,每种都适合特定的用例。虽然 ChatGPT 及其生成式人工智能能力通过文本输入和输出吸引了用户,但许多模型和公司提供了多样化的输入和输出方式。在ChatGPT出现之前,很多人就对Midjourney和Stable Diffusion等文本到图像生成模型很感兴趣。
下表根据输入和输出类型对几个模型进行了分类:

Spring AI目前支持处理语言、图像和音频作为输入和输出的模型。表中最后一行接受文本作为输入并输出数字,这通常被称为文本嵌入,代表了AI模型中使用的内部数据结构。Spring AI支持嵌入功能,以实现更高级的用例。
像GPT这类模型的独特之处在于其预训练特性,正如GPT(即生成式预训练Transformer)中的“P”所表明的那样。这种预训练特性将人工智能转变为一种通用的开发工具,无需使用者具备深厚的机器学习或模型训练背景。
提示(Prompts)
提示词介绍
提示词是基于语言的输入基础,用于引导人工智能模型生成特定输出。对于熟悉ChatGPT的人来说,提示词可能看起来仅仅是输入到对话框中并发送给应用程序接口的文本。然而,它所包含的远不止这些。在许多人工智能模型中,提示词的文本并非只是一个简单的字符串。
ChatGPT的API在一个提示词中包含多个文本输入,每个文本输入都被分配了一个角色。例如,有系统角色,它告诉模型应该如何表现,并为交互设定上下文。还有用户角色,这通常是用户的输入。
撰写有效的提示词既是一门艺术,也是一门科学。ChatGPT 旨在用于人类对话。这与使用 SQL 来“提问”大相径庭。人们必须像与另一个人交谈一样与人工智能模型交流。
这种交互方式极为重要,以至于“提示词工程”这一术语已发展成为一门独立学科。目前已有越来越多的技术可提高提示词的有效性。花时间精心设计提示词能显著改善输出结果。
分享提示词已经成为一种常见做法,学术界也在积极研究这一课题。要创建一个有效的提示词,其背后的逻辑可能与直觉相悖(比如与SQL形成对比),最近的一篇研究论文就说明了这一点。该论文发现,最有效的提示词之一是以“深吸一口气,一步一步来解决这个问题”这句话开头的。这应该能让你明白语言为何如此重要。我们目前还不完全清楚如何最有效地利用这类技术的早期版本(如ChatGPT 3.5),更不用说那些正在开发的新版本了。
提示词模板
创建有效的提示词需要确定请求的上下文,并将请求的部分内容替换为特定于用户输入的值。这个过程使用传统的基于文本的模板引擎来创建和管理提示。Spring AI 使用 OSS库StringTemplate来实现这一目的。
例如,考虑一个简单的提示模板:
告诉我一个关于 {content} 的 {adjective} 笑话。
在Spring AI中,提示模板可以比作Spring MVC架构中的“视图”。会提供一个模型对象(通常是一个java.util.Map)来填充模板中的占位符。“渲染后的”字符串会成为提供给AI模型的提示内容。
发送给模型的提示词在具体数据格式上存在很大差异。提示词最初只是简单的字符串,后来逐渐发展为包含多条信息,其中每条信息中的每个字符串都代表着模型的一个不同角色。
嵌入(Embeddings)
嵌入是文本、图像或视频的数值表示,能够捕捉输入之间的关系。
嵌入的工作原理是将文本、图像和视频转换为浮点数数组,称为向量。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度。
通过计算两段文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似度。

作为一名探索人工智能的Java开发者,没有必要去理解这些向量表示背后复杂的数学理论或具体实现。只需对它们在人工智能系统中的作用和功能有基本了解即可,尤其是在将人工智能功能集成到你的应用程序中时。
嵌入在检索增强生成(RAG)模式等实际应用中尤为重要。它们能够将数据表示为语义空间中的点,这类似于欧几里得几何中的二维空间,但维度更高。这意味着,就像欧几里得几何中平面上的点会根据其坐标而有近有远一样,在语义空间中,点的接近程度反映了含义的相似性。关于相似主题的句子在这个多维空间中位置更接近,就像图表上彼此靠近的点一样。这种接近性有助于完成文本分类、语义搜索甚至产品推荐等任务,因为它使人工智能能够根据相关概念在这个扩展的语义图景中的“位置”来识别并归类这些概念。
你可以将这个语义空间视为一个向量。
令牌(Tokens)
令牌是人工智能模型工作方式的基本组成部分。在输入时,模型将词语转换为令牌;在输出时,它们将令牌转换回词语。
在英语中,一个标记大约相当于一个单词的75%。作为参考,莎士比亚的全部作品约有90万字,换算成标记约为120万个。

或许更重要的是,令牌即金钱。在托管人工智能模型的背景下,您的费用由使用的令牌数量决定。输入和输出都会计入总令牌数。
此外,模型受令牌限制的约束,这会限制单次API调用中处理的文本量。这个阈值通常被称为“上下文窗口”。模型不会处理任何超过此限制的文本。
例如,ChatGPT3的令牌限制为4K,而GPT4提供多种选择,如8K、16K和32K。Anthropic的Claude AI模型具有10万令牌的限制,Meta最近的研究则推出了100万令牌限制的模型。
要用GPT4总结莎士比亚的作品集,你需要制定软件工程策略来分割数据,并在模型的上下文窗口限制内呈现这些数据。Spring AI项目可以帮助你完成这项任务。
结构化输出(Structed Output)
传统上,人工智能模型的输出是以<font style="color:rgb(25, 30, 30);">java.lang.String</font>形式呈现的,即便你要求回复采用JSON格式。它或许是一个正确的JSON,但并非JSON数据结构,而仅仅是一个字符串。此外,在提示词中要求“输出JSON”也并非100%准确。
这种复杂性催生了一个专门领域的出现,该领域涉及创建提示词以生成预期输出,随后将生成的简单字符串转换为可用于应用程序集成的数据结构。

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

- **函数调用**:这种技术允许注册自定义用户函数,将大型语言模型连接到外部系统的 API。Spring AI 大大简化了你需要编写的代码,以支持函数调用。
检索增强生成(Retrieval Augmented Generation)
一种被称为检索增强生成(RAG)的技术应运而生,旨在解决将相关数据整合到提示词中以获得AI模型准确响应这一难题。
这种方法采用批处理式编程模型,即作业从文档中读取非结构化数据,进行转换,然后写入向量数据库。从宏观层面来看,这是一个ETL(提取、转换和加载)管道。向量数据库用于RAG技术的检索部分。
在将非结构化数据加载到向量数据库的过程中,最重要的转换之一是将原始文档分割成更小的片段。将原始文档分割成更小片段的过程包含两个重要步骤:
- 将文档分割成多个部分,同时保留内容的语义边界。例如,对于包含段落和表格的文档,应避免在段落或表格中间分割文档。对于代码,应避免在方法实现的中间分割代码。
- 将文档的各部分进一步拆分成大小仅为AI模型令牌限制很小比例的部分。
RAG的下一阶段是处理用户输入。当AI模型需要回答用户的问题时,该问题以及所有“相似”的文档片段会被放入发送给AI模型的提示词中。这就是使用向量数据库的原因,它非常擅长找到相似的内容。

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

- 当我们希望让模型能够使用某个工具时,我们会在聊天请求中包含该工具的定义。每个工具定义都由名称、描述和输入参数的模式组成。
- 当模型决定调用工具时,它会发送一个包含工具名称和根据已定义模式建模的输入参数的响应。
- 该应用程序负责使用工具名称来识别工具,并利用提供的输入参数执行该工具。
- 工具调用的结果由应用程序处理。
- 应用程序将工具调用结果发送回模型。
- 该模型将工具调用结果作为额外上下文来生成最终响应。
遵循函数调用文档,以获取如何将此功能与不同人工智能模型一起使用的更多信息。
评估人工智能响应(Evaluating AI responses)
有效评估人工智能系统针对用户请求所生成的输出,对于确保最终应用的准确性和实用性而言至关重要。一些新兴技术使预训练模型本身能够用于此目的。
这一评估过程包括分析生成的响应是否与用户意图及查询语境相符。评估人工智能生成响应质量时,会用到相关性、连贯性和事实准确性等指标。
一种方法是向模型呈现用户的请求和AI模型的响应,询问该响应是否与所提供的数据一致。
此外,利用向量数据库中存储的信息作为补充数据可以增强评估过程,有助于确定响应的相关性。
Spring AI项目提供了一个<font style="color:rgb(25, 30, 30);">Evaluator</font>API,目前可用于获取评估模型响应的基本策略。有关更多信息,请参阅评估测试文档。
