Spring AI概念
AI 概念
本文主要介绍Spring AI使用的核心概念。请仔细阅读它,以便能更加深入地了解 Spring AI 如何实现背后的想法。
模型
人工智能模型是旨以处理和生成信息的算法基础上模仿人类的认知能力。 通过从大型数据集中学习模式和见解,这些模型可以进行预测、文本、图像或其他输出,从而增强跨行业的各种应用。
现在市面上有许多不同类型的 AI 模型,每种模型都有适用的特定的用例。 虽然 ChatGPT 及其生成式 AI 功能通过文本输入和输出吸引了用户,但许多模型和公司提供了多样化的输入和输出。 在 ChatGPT 之前,许多人对 Midjourney 和 Stable Diffusion 等文本到图像生成模型着迷。
下表根据多个模型的输入和输出类型对多个模型进行分类:
Input | Output | Examples |
---|---|---|
Language/Code/Images (Multi-Modal) |
Language/Code |
GPT4 - OpenAI, Google Gemini |
Language/Code |
Language/Code |
GPT 3.5 - OpenAI-Azure OpenAI, Google Bard, Meta Llama |
Language |
Image |
Dall-E - OpenAI + Azure, Deep AI |
Language/Image |
Image |
Midjourney, Stable Diffusion, RunwayML |
Text |
Numbers |
Many (AKA embeddings) |
Spring AI 最初的重点是处理语言输入并提供语言输出的模型集成功能: OpenAI + Azure OpenAI。 上表中的最后一行接受文本作为输入并输出数字,通常称为嵌入文本,表示 AI 模型中使用的内部数据结构。 Spring AI 支持嵌入以支持更高级的用例。
GPT 等模型的与众不同之处在于它们的预训练性质,正如 GPT 中的“P”所示——聊天生成预训练转换器。 此预训练功能将 AI 转换为通用开发人员工具,不需要广泛的机器学习或模型训练背景。
提示
提示是基于语言的输入的基础,用于指导 AI 模型生成特定输出。 对于那些熟悉 ChatGPT 的人来说,提示可能看起来只是输入到发送到 API 的对话框中的文本。 然而,它包含的远不止于此。 在许多 AI 模型中,提示的文本不仅仅是一个简单的字符串。
ChatGPT 的 API 在提示中有多个文本输入,每个文本输入都被分配了一个角色。 例如,有系统角色,它告诉模型如何操作并设置交互的上下文。 还有用户角色,通常是来自用户的输入。
制作有效的提示既是一门艺术,也是一门科学。 ChatGPT 专为人类对话而设计。 这与使用SQL之类的东西来“提出问题”大相径庭。 一个人必须与人工智能模型进行交流,类似于与另一个人交谈。
这种交互方式的重要性如此之大,以至于“提示工程”一词已成为一门独立的学科。 有一系列新兴的技术可以提高提示的有效性。 花时间制作提示可以大大改善最终的输出。
共享提示已成为一种公共实践,并且正在就此主题进行积极的学术研究。 举个例子,说明创建一个有效的提示(例如,与SQL相比)是多么违反直觉,最近的一篇研究论文发现,你可以使用的最有效的提示之一以这句话开头,“深呼吸,一步一步地做这个。 这应该让你明白为什么语言如此重要。 我们还没有完全了解如何最有效地利用这项技术的先前迭代,例如 ChatGPT 3.5,更不用说正在开发的新版本了。
提示模板
创建有效的提示涉及建立请求的上下文,并将请求的某些部分替换为特定于用户输入的值。
此过程使用传统的基于文本的模板引擎进行快速创建和管理。 Spring AI 为此使用了 OSS 库 StringTemplate。
例如,考虑简单的提示模板:
1 | Tell me a {adjective} joke about {content}. |
在 Spring AI 中,提示模板可以比作 Spring MVC 架构中的“视图”。 提供模型对象(通常为 ,)以填充模板中的占位符。 “rendered'”字符串成为提供给 AI 模型的提示内容。java.util.Map
发送到模型的提示的特定数据格式存在相当大的差异。 提示最初从简单的字符串开始,现已演变为包含多条消息,其中每条消息中的每个字符串都代表模型的不同角色。
嵌入
嵌入将文本转换为数字数组或向量,使 AI 模型能够处理和解释语言数据。 这种从文本到数字再返回的转换是人工智能如何与人类语言交互和理解人类语言的关键因素。 作为探索 AI 的 Java 开发人员,没有必要理解复杂的数学理论或这些向量表示背后的具体实现。 对它们在 AI 系统中的角色和功能有基本的了解就足够了,尤其是当您将 AI 功能集成到应用程序中时。
嵌入在实际应用中尤为重要,例如检索增强生成 (RAG) 模式。 它们能够将数据表示为语义空间中的点,这类似于欧几里得几何的二维空间,但在更高的维度上。 这意味着就像欧几里得几何中平面上的点如何根据它们的坐标接近或接近一样,在语义空间中,点的接近反映了含义的相似性。 在这个多维空间中,关于相似主题的句子的位置更近,就像图形上彼此靠近的点一样。 这种接近性有助于文本分类、语义搜索甚至产品推荐等任务,因为它允许 AI 根据相关概念在这个扩展语义环境中的“位置”来辨别和分组相关概念。
你可以把这个语义空间看作一个向量。
令 牌
令牌是AI模型如何工作的构建块。在输入时,模型将单词转换为令牌。在输出时,它们将令牌转换回单词。
在英语中,一个符号大致相当于一个单词的75%。作为参考,莎士比亚的全部作品共约90万字,翻译成大约120万个符号
在托管 AI 模型的上下文中,您的费用由使用的令牌数量决定。输入和输出都对整体令牌使用有影响。
此外,模型还受令牌限制的约束,这些限制限制了单个 API 调用中处理的文本量。 此阈值通常称为“上下文窗口”。该模型不处理任何超过此限制的文本。
例如,ChatGPT3 有 4K 令牌限制,而 GPT4 提供不同的选项,例如 8K、16K 和 32K。 Anthropic 的 Claude AI 模型具有 100K 的令牌限制,而 Meta 最近的研究产生了 1M 的令牌限制模型。
要用 GPT4 总结莎士比亚的作品集,您需要设计软件工程策略来切碎数据并在模型的上下文窗口限制内呈现数据。 Spring AI 项目可帮助您完成此任务。
输出解析
传统上,AI 模型的输出以 ,即使您要求回复是 JSON 格式也是如此。 它可能是正确的 JSON,但它不是 JSON 数据结构。它只是一个字符串。 此外,在提示中要求“for JSON”并不是 100% 准确的。java.lang.String
这种复杂性导致了一个专门领域的出现,涉及创建提示以产生预期的输出,然后将生成的简单字符串解析为可用的数据结构以进行应用程序集成。
输出解析采用精心制作的提示,通常需要与模型进行多次交互才能实现所需的格式。
这一挑战促使 OpenAI 引入了“OpenAI 函数”,作为从模型中精确指定所需输出格式的一种手段。
将您的数据引入 AI 模型
如何为 AI 模型配备未经训练的信息?
请注意,GPT 3.5/4.0 数据集仅延长至 2021 年 650 月。 因此,该模型表示它不知道该日期之后需要知识的问题的答案。 一个有趣的琐事是,这个数据集大约有 <>GB。
有三种技术可用于自定义 AI 模型以合并您的数据:
-
Fine Tuning
:这种传统的机器学习技术涉及定制模型并更改其内部权重。 然而,对于机器学习专家来说,这是一个具有挑战性的过程,并且由于其规模,对于像 GPT 这样的模型来说,这是非常耗费资源的。此外,某些型号可能不提供此选项。 -
Prompt Stuffing
:更实用的替代方法是将数据嵌入提供给模型的提示中。给定模型的标记限制,需要技术在模型的上下文窗口中显示相关数据。 这种方法通俗地称为“填充提示”。 Spring AI 库可帮助您实现基于“填充提示”技术的解决方案,也称为检索增强生成 (RAG)。 -
Function Calling
:此技术允许注册自定义用户函数,将大型语言模型连接到外部系统的 API。 Spring AI 大大简化了您需要编写的代码来支持函数调用。
检索增强生成
一种称为检索增强生成 (RAG) 的技术已经出现,以解决将相关数据整合到准确 AI 模型响应的提示中的挑战。
该方法涉及批处理风格编程模型,其中作业从文档中读取非结构化数据,对其进行转换,然后将其写入向量数据库。 概括地说,这是一个 ETL(提取、转换和加载)管道。 向量数据库用于 RAG 技术的检索部分。
作为将非结构化数据加载到矢量数据库的一部分,最重要的转换之一是将原始文档拆分为更小的部分。 将原始文档拆分为更小的部分的过程有两个重要步骤:
-
将文档拆分为多个部分,同时保留内容的语义边界。 例如,对于包含段落和表格的文档,应避免在段落或表格的中间拆分文档。 对于代码,请避免在方法实现的中间拆分代码。
-
将文档的各个部分进一步拆分为大小为 AI 模型令牌限制的一小部分。
RAG 的下一阶段是处理用户输入。 当 AI 模型要回答用户的问题时,该问题和所有“相似”文档片段都会被放入发送到 AI 模型的提示中。 这就是使用向量数据库的原因。它非常擅长查找相似的内容。
在实现 RAG 时使用了几个概念。 这些概念映射到 Spring AI 中的类:
-
DocumentReader
:负责从数据源加载 Java 函数接口。常见的数据源包括 PDF、Markdown 和 JSON。List<Document>
-
Document
:数据源的基于文本的表示形式,还包含用于描述内容的元数据。 -
DocumentTransformer
:负责以各种方式处理数据(例如,将文档拆分为更小的部分或向 .Document
-
DocumentWriter
:允许您将文档保存到数据库中(最常见的是 AI 堆栈中的矢量数据库)。 -
Embedding
:将数据表示为向量数据库用于计算用户查询与相关文档的“相似度”的表示形式。List<Double>
函数调用
大型语言模型 (LLM) 在训练后被冻结,导致知识陈旧,无法访问或修改外部数据。
该机制解决了这些缺点。 它允许您注册自定义用户函数,将大型语言模型连接到外部系统的 API。 这些系统可以为 LLM 提供实时数据并代表他们执行数据处理操作。Function Calling
Spring AI 大大简化了支持函数调用所需的代码。 它为您代理函数调用对话。 您可以将函数作为 a 提供,然后在提示选项中提供函数的 Bean 名称以激活该函数。 您还可以在单个提示中定义和引用多个函数。@Bean
评估 AI 响应
根据用户请求有效地评估人工智能系统的输出对于确保最终应用程序的准确性和有用性非常重要。 为此,一些新兴技术可以使用预训练模型本身。
此评估过程涉及分析生成的响应是否符合用户的意图和查询的上下文。相关性、连贯性和事实正确性等指标用于衡量 AI 生成的响应的质量。
一种方法是将用户的请求和 AI 模型的响应呈现给模型,并查询响应是否与提供的数据一致。
此外,利用载体数据库中存储的信息作为补充数据可以加强评估过程,有助于确定响应相关性。
Spring AI 项目目前提供了一些非常基本的例子,说明如何以提示的形式评估响应,以包含在 JUnit 测试中。
下一课:Spring AI概述
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章