|
此版本仍在开发中,尚未被视为稳定版。为了获取最新的快照版本,请使用Spring AI 1.1.3! |
人工智能概念
本节介绍了Spring AI所使用的关键概念。我们强烈推荐仔细阅读它,以便理解Spring AI是如何实现的背后的思路。
模型
AI模型是设计用于处理和生成信息的算法,通常通过模仿人类认知功能来实现。 通过从大量数据中学习模式和见解,这些模型可以生成预测、文本、图像或其他输出,从而提升跨行业的各种应用。
有很多种类型的AI模型,每种模型都有其特定的适用场景。 尽管ChatGPT及其生成式AI能力通过文本输入和输出吸引了大量用户,但许多模型和公司提供了多样化的输入和输出。 在ChatGPT之前,许多人都对文本到图像生成模型(如Midjourney和Stable Diffusion)着迷。
以下表格根据输入和输出类型对几种模型进行了分类:

Spring AI目前支持能够处理语言、图像和音频输入与输出的模型。 上表的最后一行,接受文本作为输入并输出数字,更常见地被称为文本嵌入,表示用于人工智能模型的内部数据结构。 Spring AI对嵌入的支持,使其能够实现更复杂的使用场景。
区别于其他模型,像GPT这样的模型之所以脱颖而出,主要是因为它们具有预训练特性,正如GPT-P所体现的那样——生成式对话预训练的 transformer 模型。 这一特性使AI成为一种通用的开发者工具,无需具备深厚的机器学习或模型训练背景。
提示
提示是指导人工智能模型生成特定输出的基础语言输入的基础。对于熟悉ChatGPT的用户来说,提示似乎只是对话框中输入的文本,随后发送到API。然而,提示包含的内容远不止这些。在许多AI模型中,提示文本不仅是一个简单的字符串。
ChatGPT的API包含多个提示文本输入,每个输入都有一个特定的角色。例如,系统角色告诉模型应该如何行为并设定互动的上下文。此外,用户角色通常是用户的输入。
恰当地撰写提示(prompts)既是一门艺术又是一门科学。ChatGPT是为人类对话设计的,而不是像使用SQL一样“提问”。与传统SQL不同,使用AI模型时需要像与他人交流一样与之对话。
交互模式的重要性如此之高,以至于"提示工程学"已经发展成为一个独立的学科。 不断改进提示的有效性正在迅速发展出一系列技巧。 花时间设计一个提示可能会显著提高输出结果。
提示的共享已成为一种共同的实践,目前关于这一主题的学术研究正方兴未艾。 作为一个反直觉的例子(例如,与SQL形成对比),最近发表的一篇研究论文发现,一个非常有效的提示可以以“深呼吸并逐步完成这项任务”开头的短语开始。这表明语言的重要性。 我们还不完全了解如何充分利用之前版本(例如ChatGPT 3.5)的技术效果,更不用说正在开发的新版本了。
提示模板
创建有效的提示需要确定请求的上下文,并将请求中的部分替换为用户输入的具体值。
流程图:提示创建与管理 Spring AI 采用传统的文本型模板引擎进行提示的创建与管理。 Spring AI 采用 OSS 库 字符串模板库 来实现这一功能。
例如,考虑一个简单的提示模板:
Tell me a {adjective} joke about {content}.
在Spring AI中,提示模板可以类比于Spring MVC架构中的“视图”。通常提供一个模型对象(java.util.Map),用于填充模板中的占位符。渲染后的字符串成为供AI模型使用的提示内容。
模型收到的提示数据格式存在显著的变化和多样性。最初以简单的字符串形式存在,后来发展到包含多个消息,每个消息中的字符串都代表了模型的特定角色。
嵌入模型
嵌入是文本、图像或视频的数值表示,用于捕捉输入之间的关系。
嵌入式技术通过将文本、图像和视频转换为浮点数数组来工作,这些数组被称为向量。 这些向量旨在捕捉文本、图像和视频的意义。 嵌入数组的长度称为向量的维度。
通过计算两段文本向量之间的数值距离,应用程序可以确定生成这些向量的对象之间的相似性。

作为一名探索人工智能的Java开发者,深入理解这些向量表示的复杂数学理论或具体实现并不是必需的。 理解它们在AI系统中的角色和功能就足够了,尤其是在将AI功能整合到您的应用中时。
嵌入在诸如检索增强生成(RAG)之类的实用应用中尤其相关。它们使得数据可以表示为语义空间中的点,类似于欧几里得几何中的二维空间,但处于更高维度。这意味着,就像欧几里得几何中平面内的点根据其坐标可以接近或远离彼此一样,在语义空间中,点的接近程度反映了它们在含义上的相似性。关于类似主题的句子在这个多维空间中被放置得更近,就像在图表中,点彼此靠近。这种接近有助于任务如文本分类、语义搜索,甚至产品推荐,因为AI可以基于其“位置”在扩展的语义空间中辨别和分组相关概念。
这个语义空间可以被视为一个向量。
token
Token是AI模型中处理文本的基本单位。 当模型接收输入时,会将单词转换为Token;在生成输出时,会将Token转换回单词。
通常,一个Token大致相当于75%个Word。作为参考,莎士比亚的《 complete works》大约900,000个Word,其转换后token数量约为120万个。

核心指令 1. **准确翻译**:保持原文的语义和语气,译文需自然流畅,符合中文表达习惯。 2. **保留格式**:保留原文的段落结构、换行符和标点符号。如果原文包含特殊的占位符(如 {name} 或 %s),请原样保留,不要翻译。 3. **输出限制**:直接输出翻译后的中文简体文本。不要包含“好的”、“这是翻译结果”等任何对话性文字或解释,也不要使用 Markdown 代码块标记。 待翻译文本 Perhaps more important is that Tokens = Money. In the context of hosted AI models, your charges are determined by the number of tokens used. Both input and output contribute to the overall token count.
此外,模型还受到token限制,这限制了单次API调用处理的文本量。
例如,ChatGPT3的 tokens 限制为4K,而GPT4提供了8K、16K和32K等多种选择。 Anthropic的Claude AI模型设置有100K tokens限制,而Meta近期的研究则推出了1M tokens限制的模型。
要使用GPT-4对莎士比亚的作品进行总结,你需要制定软件工程策略,将数据拆分并在模型的上下文窗口限制范围内进行呈现。 Spring AI项目可以帮你完成这项任务。
结构化输出
传统上,AI模型的输出总是以0的形式呈现,即使你要求以JSON格式回复。它可能是一个正确的JSON字符串,但并不是一个JSON数据结构。它只是一个简单的字符串。此外,将“JSON”作为提示的一部分并不是100%准确。
这种复杂性导致了一个专门领域的发展,该领域涉及创建提示以生成所需输出,随后将生成的简单字符串转换为可应用的数据结构。

结构化输出转换采用精心设计的提示,通常需要多次与模型交互以实现预期的格式化效果。
将您的数据与API集成到AI模型中
如何让AI模型在没有被训练的情况下获取信息?
请注意,GPT 3.5/4.0数据集仅扩展至2021年9月。 因此,模型表示,它不知道那些需要超出该日期知识的问题的答案。 有趣的是,这个数据集大约有650GB。
有三种方法存在,用于自定义AI模型以整合你的数据:
-
微调:这是一种传统机器学习技术,涉及对模型进行调整并改变其内部权重。 然而,对于机器学习专家来说,这是一个具有挑战性的过程,尤其是对于像GPT这样的模型,由于其规模巨大,其资源需求极为密集。此外,有些模型可能不提供此功能。
-
提示填充:一种更实用的替代方法是将数据嵌入到模型收到的提示中。在模型的token限制内,需要使用一些技巧在模型的上下文窗口中呈现相关数据。 这种方法在非正式用语中被称为“stuffing the prompt”。 Spring AI库帮助您实现基于“stuffing the prompt”技术的解决方案,否则已知为 检索增强生成(RAG)。

检索增强生成增强检索生成
检索增强生成(RAG)作为一种技术逐渐兴起,旨在解决将相关数据整合到提示中以提高AI模型准确回答的挑战。
该方法采用批处理风格的编程模型,其中任务从文档中读取非结构化数据,对其进行转换,然后写入向量数据库。 从整体来看,这是一项抽取、转换和加载(ETL)管道。 向量数据库在RAG技术的检索部分中被使用。
在将未结构化数据加载到向量数据库的过程中,一个至关重要的步骤是将原始文档拆分成更小的片段。 拆分原始文档为更小的片段的过程包含两个关键步骤:
-
将文档分成部分时,必须在保持内容语义边界的同时,将其分成部分。 例如,在一个包含段落和表格的文档中,一个人应该避免在段落或表格中间分割文档。 对于代码,避免在方法实现中间分割代码。
-
将文档的部分进一步划分成部分,使其每个部分的大小占AI模型token限制的小百分比。
在RAG中,处理用户输入是下一阶段的工作。 当用户的问题由AI模型回答时,不仅问题本身,所有“相似的”文档碎片都会被放入prompt中发送给AI模型。 这是因为向量数据库非常擅长找到相似的内容。

-
The ETL管道进一步提供关于 orchestrate 数据从数据源抽取和存储到结构化向量存储的信息,确保数据以最佳格式存储,以便在传递给 AI 模型时实现高效的检索。
-
The 聊天客户端 - RAG 解释了如何在您的应用中启用 RAG 能力。
工具调用
大语言模型(LLMs)在训练后被固化,导致知识陈旧,且无法访问或修改外部数据。
大语言模型(LLMs)通过工具调用机制实现自我服务注册,以将外部系统与大语言模型的API连接起来。这些系统能够提供实时数据给LLMs,并代为执行数据处理操作。
Spring AI大大简化了需要编写以支持工具调用的代码。
它会为你管理工具调用对话。
你可以提供一个带有@Tool注释的方法的工具,并将其提供到你的提示选项中,以便模型能够访问它。
此外,你可以在单个提示中定义和引用多个工具。

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