AI的概念
本节描述Spring AI使用的核心概念。我们建议仔细阅读它,以了解Spring AI实现背后的思想。
模型
人工智能模型是设计用来处理和生成信息的算法,通常模仿人类的认知功能。通过学习来自大型数据集的模式和见解,这些模型可以进行预测、文本、图像或其他输出,从而增强各行业的各种应用程序。
有许多不同类型的AI模型,每种都适合于特定的用例。虽然ChatGPT及其生成式人工智能功能通过文本输入和输出吸引了用户,但许多模型和公司提供了不同的输入和输出。在ChatGPT出现之前,许多人都对Midjourney和Stable Diffusion等文本到图像的生成模型着迷。
下表根据输入输出类型对几种模型进行了分类:
输入 | 输出 | 例子 |
---|---|---|
语言/代码/图片(综合) | 语言/代码 | GPT4 - OpenAI, Google Gemini |
语言/代码 | 语言/代码 | GPT 3.5 - OpenAI-Azure OpenAI, Google Bard, Meta Llama |
语言 | 图片 | Dall-E - OpenAI + Azure, Deep AI |
语言/图片 | 图片 | Midjourney, Stable Diffusion, RunwayML |
文本 | 数字 | Many (AKA embeddings) |
Spring AI最初的重点是处理语言输入和提供语言输出的模型,最初是OpenAI + Azure OpenAI。上表中的最后一行接受文本作为输入和输出数字,通常被称为嵌入文本,并表示AI模型中使用的内部数据结构。Spring AI支持嵌入,以支持更高级的用例。
像GPT这样的模型的区别在于它们的预训练性质,正如GPT - chat生成预训练转换器中的“P”所表明的那样。这种预训练功能将人工智能转变为一种通用的开发工具,不需要广泛的机器学习或模型训练背景。
提示(Prompts)
提示作为基于语言的输入的基础,指导AI模型产生特定的输出。对于熟悉ChatGPT的人来说,提示符看起来可能只是将文本输入到发送给API的对话框中。然而,它包含的远不止这些。在许多AI模型中,提示符的文本不仅仅是一个简单的字符串。
ChatGPT的API在一个提示符中有多个文本输入,每个文本输入被分配一个角色。例如,有一个系统角色,它告诉模型如何行为,并为交互设置上下文。还有用户角色,它通常是来自用户的输入。
制作有效的提示既是一门艺术,也是一门科学。ChatGPT是为人类对话而设计的。这与使用SQL之类的东西来“问问题”是完全不同的。人们必须像与另一个人交谈一样与人工智能模型交流。
这就是这种交互风格的重要性,“提示工程”这个术语已经作为它自己的学科出现了。有一种新兴的技术集合可以提高提示的有效性。花时间制作提示可以极大地提高最终输出。
分享提示已经成为一种公共实践,并且在这个主题上正在进行积极的学术研究。最近的一篇研究论文发现,创建一个有效的提示(例如,与SQL形成对比)是多么违反直觉,您可以使用的最有效的提示之一是以短语“深呼吸,一步一步地进行”开头的。这应该能让你明白为什么语言如此重要。我们还没有完全理解如何最有效地利用这项技术的以前的迭代,比如ChatGPT 3.5,更不用说正在开发的新版本了。
提示模板
创建有效的提示包括建立请求的上下文,并用特定于用户输入的值替换请求的部分内容。
此过程使用传统的基于文本的模板引擎进行提示创建和管理。Spring AI为此使用了OSS库StringTemplate。
例如,考虑一个简单的提示模板:
Tell me a {adjective} joke about {content}.
在Spring AI中,提示模板可以比作Spring MVC架构中的“视图”。模型对象,通常是java.util。Map,用于在模板中填充占位符。“'渲染'”字符串成为提供给AI模型的提示内容。
发送给模型的提示的特定数据格式存在相当大的可变性。提示最初以简单的字符串开始,后来发展为包含多个消息,其中每个消息中的每个字符串代表模型的不同角色。
嵌入(embeddings)
嵌入将文本转换为数值数组或向量,使人工智能模型能够处理和解释语言数据。这种从文本到数字再到数字的转换是人工智能如何与人类语言互动和理解人类语言的关键因素。作为探索AI的Java开发人员,没有必要理解这些向量表示背后复杂的数学理论或特定的实现。对它们在AI系统中的角色和功能有基本的了解就足够了,特别是当你将AI功能集成到你的应用程序中时。
嵌入在实际应用中特别重要,比如检索增强生成(RAG)模式。它们可以将数据表示为语义空间中的点,语义空间类似于欧几里得几何的二维空间,但维度更高。这意味着,就像欧几里得几何平面上的点可以根据它们的坐标远近一样,在语义空间中,点的接近反映了意义上的相似性。关于相似主题的句子在这个多维空间中的位置更近,就像图上的点彼此靠近一样。这种接近性有助于文本分类、语义搜索甚至产品推荐等任务,因为它允许AI根据其在扩展的语义环境中的“位置”来识别和分组相关概念。
你可以把语义空间想象成一个向量。
令牌(Tokens)
令牌是AI模型如何工作的构建块。在输入时,模型将单词转换为标记。在输出时,它们将标记转换回单词。
在英语中,一个符号大致相当于一个单词的75%。作为参考,莎士比亚的全部作品共约90万字,翻译成大约120万个符号。
也许更重要的是Tokens = $。
在托管AI模型的上下文中,您的费用由使用的令牌数量决定。输入和输出都对整个令牌计数有贡献。
此外,模型受到令牌限制,这限制了在单个API调用中处理的文本数量。这个阈值通常被称为“上下文窗口”。该模型不处理超过此限制的任何文本。
例如,ChatGPT3的令牌限制为4K,而GPT4提供了不同的选项,例如8K、16K和32K。Anthropic的Claude AI模型具有100K代币限制,而Meta最近的研究产生了1M代币限制模型。
要用GPT4总结收集的莎士比亚作品,您需要设计软件工程策略来分割数据,并在模型的上下文窗口限制内呈现数据。Spring AI项目可以帮助您完成这项任务。
输出解析
AI模型的输出通常以java.lang.String形式到达,即使您要求以JSON格式回复也是如此。它可能是正确的JSON,但它不是JSON数据结构。它只是一个字符串。此外,要求“for JSON”作为提示的一部分并不是100%准确的。
这种复杂性导致了一个专门领域的出现,该领域涉及创建提示以产生预期的输出,然后将生成的简单字符串解析为可用的数据结构以用于应用程序集成。
输出解析使用精心设计的提示,通常需要与模型进行多次交互才能实现所需的格式。
这一挑战促使OpenAI引入了“OpenAI函数”,作为一种精确指定模型所需输出格式的方法。
将你的数据带入人工智能模型
如何为人工智能模型提供未经训练的信息?
请注意,GPT 3.5/4.0数据集仅延伸至2021年9月。因此,该模型表示它不知道需要超过该日期的知识的问题的答案。有趣的是,这个数据集大约是650GB。
有三种技术可用于定制AI模型以整合您的数据:
- 微调:这种传统的机器学习技术包括剪裁模型和改变其内部权重。然而,对于机器学习专家来说,这是一个具有挑战性的过程,对于像GPT这样的模型来说,由于它们的大小,这是一个非常耗费资源的过程。此外,某些型号可能不提供此选项。
- 提示填充:一个更实际的替代方法是将数据嵌入到提供给模型的提示中。给定模型的令牌限制,需要技术来在模型的上下文窗口中显示相关数据。这种方法通俗地称为“填充提示符”。Spring AI库帮助您实现基于“填充提示”技术的解决方案,也称为检索增强生成(RAG)。
- 函数调用:该技术允许注册将大型语言模型连接到外部系统api的自定义用户函数。Spring AI极大地简化了为支持函数调用而编写的代码。
检索增强生成(Retrieval Augmented Generation,简称RAG)
一种称为检索增强生成(RAG)的技术已经出现,以解决将相关数据纳入提示以获得准确的人工智能模型响应的挑战。
该方法涉及一个批处理风格的编程模型,其中作业从文档中读取非结构化数据,对其进行转换,然后将其写入矢量数据库。在高层次上,这是一个ETL(提取、转换和加载)管道。矢量数据库用于RAG技术的检索部分。
作为将非结构化数据加载到矢量数据库的一部分,最重要的转换之一是将原始文档拆分为更小的部分。将原始文档分割成小块的过程有两个重要步骤:
- 将文档分成几个部分,同时保留内容的语义边界。例如,对于包含段落和表格的文档,应该避免在段落或表格中间分割文档。对于代码,避免在方法实现的中间分割代码。
- 将文档的部分进一步分割为大小仅占AI模型令牌限制的一小部分的部分。
RAG的下一个阶段是处理用户输入。当AI模型要回答用户的问题时,问题和所有“类似”的文档片段都会被放入发送给AI模型的提示框中。这就是使用矢量数据库的原因。它非常善于发现相似的内容。
在实现RAG时使用了几个概念。这些概念映射到Spring AI中的类:
- DocumentReader:一个Java函数接口,负责从数据源加载List 。常见的数据源有PDF、Markdown和JSON。
- 文档:数据源的基于文本的表示形式,它还包含用于描述内容的元数据。
- DocumentTransformer:负责以各种方式处理数据(例如,将文档分成更小的部分或向Document添加额外的元数据)。
- DocumentWriter:让你将文档持久化到一个数据库中(最常见的是在AI堆栈中,一个矢量数据库)。
- 嵌入:将数据表示为List ,矢量数据库使用它来计算用户查询与相关文档的“相似度”。
函数调用
大型语言模型(llm)在训练后被冻结,导致知识陈旧,无法访问或修改外部数据。
函数调用机制解决了这些缺点。它允许您注册将大型语言模型连接到外部系统api的自定义用户函数。这些系统可以为LLM提供实时数据,并代表LLM执行数据处理操作。
Spring AI极大地简化了为支持函数调用而编写的代码。它为您代理函数调用对话。您可以将函数作为@Bean提供,然后在提示选项中提供该函数的bean名称以激活该函数。您还可以在一个提示符中定义和引用多个函数。
评估人工智能反应
有效评估AI系统响应用户请求的输出对于确保最终应用程序的准确性和有用性非常重要。一些新兴技术允许使用预训练模型本身来实现这一目的。
这个评估过程包括分析生成的响应是否与用户的意图和查询上下文一致。诸如相关性、连贯性和事实正确性等指标用于衡量人工智能生成的响应的质量。
一种方法包括同时呈现用户的请求和AI模型对模型的响应,查询响应是否与提供的数据一致。
此外,利用矢量数据库中存储的信息作为补充数据可以加强评估过程,帮助确定响应的相关性。
Spring AI项目目前提供了一些非常基本的示例,说明如何以提示的形式评估响应,并将其包含在JUnit测试中。