【Spring AI】02. AI 概念

概述


本节介绍 Spring AI 使用的核心概念。我们建议仔细阅读它,以了解 Spring AI 如何实现背后的想法。

模型(Models)

人工智能模型是旨在处理和生成信息的算法,通常模仿人类的认知功能。通过从 大型数据集 中学习模式和见解,这些模型可以进行 预测、文本、图像或其他输出,从而增强跨行业的各种应用。

有许多不同类型的 AI 模型,每种模型都适用于特定的使用场景。虽然 ChatGPT 及其 生成式 AI 功能通过文本输入和输出吸引了用户,但许多模型和公司提供了多样化的输入和输出。在 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 中的“P”所示——聊天生成预训练转换器。此预训练功能将 AI 转换为通用开发人员工具,不需要广泛的机器学习或模型训练背景。

提示词(Prompts)

提示词是基于语言输入的基础,用于指导 AI 模型生成特定输出。对于那些熟悉 ChatGPT 的人来说,提示可能看起来只是输入到发送到 API 的对话框中的文本。然而,它包含的远不止于此。在许多 AI 模型中,提示的文本不仅仅是一个简单的字符串。

ChatGPT 的 API 的使用一个提示词的多输入文本,每个文本输入都被分配了一个角色。例如,有系统角色,它告诉模型如何操作并设置交互的上下文。还有用户角色,通常是来自用户的输入。

制作有效的提示词既是一门艺术,也是一门科学。ChatGPT 专为人类对话而设计。这与使用 SQL 之类的东西来“提出问题”大相径庭。一个人必须与人工智能模型进行交流,类似于与另一个人交谈。

这种交互方式的重要性如此之大,以至于“提示词工程”一词已成为一门独立的学科。有一系列新兴的技术可以提高提示的有效性。花时间制作提示可以大大改善最终的输出。

分享提示词已成为一种常见的做法,并且正在就此主题进行积极的学术研究。举个例子可以说明创建一个有效的提示(例如,与 SQL 相比)是多么违反直觉,最近的一篇研究论文发现,你可以使用的最有效的提示之一以这句话开头,“深呼吸,一步一步地做这个”。这应该让你明白为什么语言如此重要。尽管我们在之前的版本如ChatGPT 3.5中已经取得了一些进展,但我们仍未能完全掌握如何最有效地利用这项技术,更不用说正在开发的新版本了。

提示词模板(Prompt Templates)

创建有效的提示词建立请求的上下文,并将请求的某些部分替换作为特定于用户输入的值。

此过程使用传统的基于文本的模板引擎进行快速创建和管理。Spring AI 为此使用了 OSS 库 StringTemplate。

例如,考虑简单的提示模板:

Tell me a {adjective} joke about {content}.

在 Spring AI 中,提示词模板可以比作 Spring MVC 架构中的“视图”。提供模型对象(通常为 java.util.Map)以填充模板中的占位符。“rendered’”字符串成为提供给 AI 模型的提示内容。

发送到模型的提示词的特定数据格式存在相当大的差异。提示词最初从简单的字符串开始,现已演变为包含多条消息,其中每条消息中的每个字符串都代表模型的不同角色。

嵌入向量(Embeddings)

嵌入向量将文本转换为数字数组或向量,使 AI 模型能够处理和解释语言数据。人工智能与人类语言交互和理解的关键在于将文本转换为数字后再转回文本。作为探索 AI 的 Java 开发人员,没有必要理解复杂的数学理论或这些向量表示背后的具体实现。对它们在 AI 系统中的角色和功能有基本的了解就足够了,尤其是当您将 AI 功能集成到应用程序中时。

嵌入向量在实际应用中尤为重要,例如检索增强生成 (RAG) 模式。它们能够将数据表示为语义空间中的点,这类似于欧几里得几何的二维空间,但在更高的维度上。这意味着就像欧几里得几何中平面上的点如何根据它们的坐标接近或接近一样,在语义空间中,点的接近反映了含义的相似性。在这个多维空间中,关于相似主题的句子的位置更近,就像图形上彼此靠近的点一样。这种接近性有助于文本分类、语义搜索甚至产品推荐等任务,AI可以在这个扩展语义环境中,根据相关性中的位置来辨别和分组相关概念。

你可以把这个语义空间看作一个向量。

令牌(Tokens)

令牌是 AI 模型工作方式的基本单位。在输入时,模型将单词转换为令牌。在输出时,它们将令牌转换回单词。

在英语中,一个令牌大致相当于一个单词的 75%。作为参考,莎士比亚的全集总计约 90 万字,相当于大约 120 万个令牌。

也许更重要的是 令牌等于金钱

在许多 AI 模型的上下文中,您的费用由使用的令牌数量决定。输入和输出都对整体令牌计数有贡献。

此外,模型还受令牌限制的约束,这些限制限制了单个 API 调用中处理的文本量。此阈值通常称为“上下文窗口”。该模型不处理任何超过此限制的文本。

例如,ChatGPT3 有 4K 令牌限制,而 GPT4 提供不同的选项,例如 8K、16K 和 32K。 Anthropic 的 Claude AI 模型具有 100K 令牌限制,而 Meta 最近的研究产生了 1M 令牌限制模型。

要用 GPT4 总结莎士比亚的作品集,您需要制定软件工程策略,将数据切碎并在模型的上下文窗口的令牌限制内呈现。Spring AI 项目可帮助您完成此任务。

输出解析(Output Parsing)

传统上,AI 模型以 java.lang.String 类型输出,即使您要求回复是 JSON 格式也是如此。它可能是正确的 JSON,但它不是 JSON 数据结构。它只是一个字符串。此外,在提示中要求“for JSON”并不是 100% 准确的。

这种复杂性导致了一个专门领域的出现,需要创建提示词以产生预期的输出,将生成的简单字符串解析为可用的数据结构,以方便应用程序集成。

输出解析利用精心制作的提示词,通常需要与模型进行多次交互才能实现所需的格式。

这一挑战促使 OpenAI 引入了“OpenAI 函数”,作为从模型中精确指定所需输出格式的一种手段。

将您的数据引入 AI 模型(Bringing Your Data to the AI model)

如何为 AI 模型配备未经训练的信息?

请注意,GPT 3.5/4.0 数据集仅至 2021 年 9 月。因此,该模型表示它不知道该日期之后需要知识的问题的答案。一个有趣的事是,这个数据集大约有 650GB。

有三种技术可用于自定义 AI 模型以合并您的数据:

  • Fine Tuning :这种传统的机器学习技术涉及定制模型并更改其内部权重。然而,对于机器学习专家来说,这是一个具有挑战性的过程,并且由于其规模,对于像 GPT 这样的模型来说,这是非常耗费资源的。此外,某些型号可能不提供此选项。
  • Prompt Stuffing :更实用的替代方法是将数据嵌入提供给模型的提示词中。给定模型的令牌限制,需要技术在模型的上下文窗口中显示相关数据。这种方法通俗地称为“填充提示词”。Spring AI 库可帮助您实现基于“填充提示词”技术的解决方案,也称为检索增强生成 (RAG)。
  • Function Calling:此技术允许注册自定义用户函数,将大型语言模型连接到外部系统的 API。Spring AI 大大简化了您需要编写的代码来支持函数调用。

检索增强生成(Retrieval Augmented Generation - RAG)

一种称为检索增强生成 (RAG) 的技术已经出现,旨在解决通过将相关数据整合到提示词中来准确得出 AI 模型响应的挑战。

该方法涉及批处理风格编程模型,其中首先从文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。概括地说,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。

作为将非结构化数据加载到矢量数据库的一部分,最重要的转换之一是将原始文档拆分为更小的部分。将原始文档拆分为更小的部分的过程有两个重要步骤:

  1. 将文档拆分为多个部分,同时保留内容的语义边界。例如,对于包含段落和表格的文档,应避免在段落或表格的中间拆分文档。对于代码,请避免在方法实现的中间拆分代码。
  2. 将文档的各个部分进一步拆分为大小为 AI 模型令牌限制的一小部分。

RAG 的下一阶段是处理用户输入。当 AI 模型要回答用户的问题时,该问题和所有“相似”文档片段都会被放入发送到 AI 模型的提示词中。这就是使用向量数据库的原因。它非常擅长查找相似的内容。

在实现 RAG 时使用了几个概念。这些概念映射到 Spring AI 中的类:

  • DocumentReader:负责从数据源加载 JavaList函数接口。常见的数据源包括 PDF、Markdown 和 JSON。
  • Document:数据源的基于文本的表示形式,还包含用于描述内容的元数据。
  • DocumentTransformer:负责以各种方式处理数据(例如,将文档拆分为更小的部分或向Document添加额外的元数据)。
  • DocumentWriter:允许您将文档保存到数据库中(最常见的是 AI 内存中的矢量数据库)。
  • Embedding:将数据表示为List的向量数据库用于计算用户查询与相关文档的“相似度”的表示形式。

函数调用(Function Calling)

大型语言模型 (LLMs) 在训练后被冻结,导致知识陈旧,无法访问或修改外部数据。

该Function Calling机制解决了这些缺点。它允许您注册自定义用户函数,将大型语言模型连接到外部系统的 API。这些系统可以提供LLMs实时数据并代替大模型执行数据处理操作。

Spring AI 大大简化了函数调用所需的代码。它为您代理函数调用对话。您可以将函数作为 @Bean提供,然后在提示词选项中提供函数的 Bean 名称以激活该函数。您还可以在单个提示词中定义和引用多个函数。

评估 AI 响应(Evaluating AI responses)

根据用户请求有效地评估人工智能系统的输出对于确保最终应用程序的准确性和有用性非常重要。为此,一些新兴技术可以使用预训练模型本身解决该问题。

此评估过程涉及分析生成的响应是否符合用户的意图和查询的上下文。相关性、连贯性和事实正确性等指标用于衡量 AI 生成的响应的质量。

一种方法是将用户的请求和 AI 模型的响应呈现给模型,并查询响应是否与提供的数据语义相同。

此外,利用向量数据库中存储的信息作为补充数据可以加强评估过程,有助于确定响应相关性。

Spring AI 项目目前提供了一些非常基本的例子,说明如何以提示词的形式评估响应,以包含在 JUnit 测试中。


相关推荐

  1. 【Spring AI02. AI 概念

    2024-05-01 04:52:03       11 阅读
  2. SpringAI如何集成Ollama开发AI应用

    2024-05-01 04:52:03       17 阅读
  3. 【Spring AI01. 概述

    2024-05-01 04:52:03       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-01 04:52:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-01 04:52:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-01 04:52:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-01 04:52:03       20 阅读

热门阅读

  1. springboot AOP

    2024-05-01 04:52:03       10 阅读
  2. 时间复杂度&&空间复杂度

    2024-05-01 04:52:03       9 阅读
  3. Spring

    2024-05-01 04:52:03       11 阅读
  4. LeetCode题练习与总结:搜索旋转排序数组Ⅱ--81

    2024-05-01 04:52:03       9 阅读
  5. 大话人工智能之训练数据集

    2024-05-01 04:52:03       10 阅读
  6. [Mac软件]Adobe Photoshop 2024 v25.7 中文激活版

    2024-05-01 04:52:03       11 阅读