【Spring AI】02. AI 概念

2024-04-28 20:44
文章标签 ai spring 02 概念 java

本文主要是介绍【Spring AI】02. AI 概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 概述
    • 模型(Models)
    • 提示词(Prompts)
    • 提示词模板(Prompt Templates)
    • 嵌入向量(Embeddings)
    • 令牌(Tokens)
    • 输出解析(Output Parsing)
    • 将您的数据引入 AI 模型(Bringing Your Data to the AI model)
    • 检索增强生成(Retrieval Augmented Generation - RAG)
    • 函数调用(Function Calling)
    • 评估 AI 响应(Evaluating AI responses)

概述


本节介绍 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 测试中。


这篇关于【Spring AI】02. AI 概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944216

相关文章

java虚拟机探索(一):jvm架构简介

java虚拟机的实现必须遵循《java虚拟机规范》,而规范只是规定了java虚拟机实现的一些必要细节,并没有指出具体该如何实现,所以具体的厂商可以有自己的实现方法。在这里以jdk自带的虚拟机Hotspot为例,介绍其实现架构。 如上图所示,Hotspot JVM总体结构分为3个部分:类加载器子系统,运行时数据区,执行引擎子系统。以下是对每个部分的简单介绍。 1. 类加载子系统 虚拟机类加

(五)Spring教程——Spring IoC容器(上)

在Spring框架中,Bean的实例化和组装都是IoC容器配置元数据完成的。Spring框架提供的容器主要是基于BeanFactory和ApplicationContext两个接口,一种是实现BeanFactory接口的简单容器,另一种是实现ApplicationContext接口的高级容器。         BeanFactory是比较传统的IoC实现方式,容器内的对象主动使用

快速掌握Spring底层原理整体脉络

快速掌握Spring底层原理整体脉络 介绍 在Java开发领域,Spring框架是一个非常流行的选择。作为一名Java架构师,了解Spring底层原理是非常重要的。本文将帮助你快速掌握Spring底层原理的整体脉络,让你更好地理解和应用Spring框架。 Spring框架概述 Spring是一个开源的Java框架,它提供了一种轻量级的解决方案,用于构建企业级应用程序。Spring框架的核心

spring-AOP通过注解@DeclareParents引入新的方法

一、应用背景 在看此文章之前,你可能已经知道了,spring是通过Before、After、AfterRunning、AfterThrowing以及Around 共5中通知方式为目标方法增加切面功能,比如一个需要在目标类执行一个目标方法之前和之后分别打印一份日志,就可以建立一个切面在这个方法前后打印日志。但是如果我想在此目标类中再增加一个目标方法是,该怎么办呢? 最简单的办法就是在建立此目标类

Spring中Bean装配的歧义性

在spring容器中有多个同类的Bean时,该如何装载呢?例如有一个服务接口A,该接口有3个实现类,在容器中就会生成3个A的实现类的Bean,当对A进行装载时,容器不会判断装载哪一个,就会报一个没有唯一的一个Bean。要想解决此问题,最简单的方法就是用Primary注解,Primary注解表示优先装载Bean。但是最方便的方法是指定装载Bean的名称。下面用代码演示 一、优先装载 1、服务接口

Spring的IOC(Inversion of Control)设计模式

Spring的IOC(Inversion of Control)是一种设计模式,它通过控制反转的思想来降低组件之间的耦合度。在Spring框架中,IOC容器负责管理应用程序中的对象,使得对象之间的依赖关系由容器来维护和注入。 以下是Spring IOC的主要特点和工作原理: 控制反转:传统的程序设计中,对象之间的依赖关系通常由开发者在代码中直接创建和管理,而在IOC容器中,对象之间的依赖关系

Spring Boot | SpringBoot 中 自定义 “用户授权管理“ : 自定义“用户访问控制“、自定义“用户登录控制“

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 ) :二、 自定义 "用户访问控制" ( 通过 "HttpSecurity类" 的 authorizeRequests( )方法来实现 "自定义用户访问控制" ) :1.基础项目文件准备2.实现 "自定义身份认证" ( UserDetailsService身份认证 )① service层中类 获取 "用户基本信

java入门1.1.2

前言: 第一:一坨垃圾的迭代,还是垃圾 第二:本内容为对类,对象,构造函数的最新抽象理解 正片 先将类,对象,还要构造函数翻译成英文 class,object,constructo 简单易懂,再看看他们的中文翻译 class:班级,课程,种类,社会等级 object:物体,对象,目标,客体 construct-or:构造-执行 好了可以开始进入正真意义上的开始了

Spring配置文件中jdbc:initialize-database标签应用以及PropertyPlaceholderConfigurer配置的应用

一、在Spring配置文件中配置PropertyPlaceholderConfigurer 1、在Spring中,使用PropertyPlaceholderConfigurer可以在XML配置文件中加入外部属性文件,当然也可以指定外部文件的编码,如: <bean id="propertyConfigurer" class="org.springframework.beans.factory.c

String字符串与java.util.Date的相互转化

1、将String转化为Date类型 public static void testStringConvertToDate(){String stringDate = "2008-10-05";/*yyyy-MM-dd格式一定要与stringDate的格式一致*/SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {