springAI(一)

news2024/11/29 2:49:19

目录

一、spring AI 目的

二、spring AI 来源

三、sprig AI 是什么?

四、spring AI中的 概念

4.1、模型(Models)

4.2、提示(Prompts)

4.3、提示模板(Prompt Templates)

4.4、令 牌(Tokens)

4.5、输出解析(Output Parsing)

4.6、链接调用(Chaining Calls)

4.7、将数据引入 AI 模型

4.8、检索增强生成

4.9、评估 AI 响应

五、spring AI应用

5.1、配置

5.1.1、OpenAI

5.1.2、Azure OpenAI


一、spring AI 目的

Spring AI 项目旨在简化包含人工智能功能的应用程序的开发,而不会产生不必要的复杂性。

二、spring AI 来源

  1. Spring AI 项目是一个实验性项目,旨在使用 Spring 框架的通用概念创建人工智能(AI)应用程序。它集成了 Azure OpenAI 和 OpenAI 作为后端,支持内容生成、代码生成、语义搜索和摘要等用例。
  2. 从历史上看,Python 曾常用于访问以 C 和 C++ 等语言编写的AI算法,但现在生成式AI(如OpenAI的ChatGPT)使得使用HTTP访问预训练模型更加容易,使Java等编程语言更容易与AI算法交互,AI 不再需要数据科学家来收集数据和训练模型。。
  3. 但是,用于 AI 解决方案(如 OpenAI 和 Azure OpenAI)的各种 Java 客户端 API 不同,这使得在这些解决方案之间切换变得更加困难
  4. Spring AI在收到Python库的启发 提供了一个抽象层,构建在Python库LangChain和LlamaIndex的客户端API之上,以简化不同Java客户端API之间的切换。它遵循Spring项目的设计价值,如模块化、可扩展性和数据源集成。
  5. Spring AI 提供多种功能,包括通用API与AI模型的集成、提示模板用于与AI模型交互、支持链接调用以解决更复杂的问题、输出分析功能以将输出转换为CSV或JSON格式、学习特定对话风格、以及测试评估答案以保持项目质量。

三、sprig AI 是什么?

该项目虽然从 LangChain 和 LlamaIndex  [ˈlɑ:mə] 等著名的 Python 项目中汲取灵感,但 Spring AI 并不是这些项目的直接移植。 该项目的成立相信,下一波生成式人工智能应用程序将不仅适用于 Python 开发人员,而是将在许多编程语言中无处不在。

Spring AI 的核心是提供抽象,这些抽象是开发 AI 应用程序的基础。 这些抽象具有多种实现,只需最少的代码更改即可轻松交换组件。 例如,Spring AI 引入了 AiClient 接口,其中包含 OpenAI 和 Azure(ˈæʒə(r) ai re(翘舌)) OpenAI 的实现。

除了这些核心抽象之外,Spring AI还旨在提供更高级别的功能来解决常见的用例,例如“对文档的问答”或“与文档聊天”。 随着用例复杂性的增加,Spring AI 项目将与 Spring 生态系统中的其他项目集成,例如 Spring Integration(ˌɪntɪˈɡreɪʃ(ə)n/)、Spring Batch(bætʃ) 和 Spring Data。

为了简化设置,Spring Boot Starters 可用于帮助设置基本的依赖项和类。 此外,还有一组示例应用程序可帮助您探索项目的功能。 最后,新的 Spring CLI 项目还使您能够快速开始使用新项目或向现有应用程序添加 AI 功能的命令。

spring boot new ai 
spring boot add ai

四、spring AI中的 概念

4.1、模型(Models)

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

有许多不同类型的 AI 模型,每种模型都适合特定的用例。 虽然 ChatGPT 及其生成式 AI 功能通过文本输入和输出吸引了用户,但许多模型和公司提供多样化的输入和输出。 在 ChatGPT 出现之前,很多人都对 Midjourney 和 Stable Diffusion 等文本到图像生成模型着迷。

下表根据输入和输出类型对多个模型进行了分类。

Spring AI 最初的重点是处理语言输入并提供语言输出的模型,最初是 OpenAI + Azure OpenAI。 上表中的最后一行接受文本作为输入和输出编号,通常称为“嵌入文本”,表示 AI 模型中使用的内部数据结构。 Spring AI 支持嵌入以支持更高级的用例。

GPT 等模型的与众不同之处在于它们的预训练性质,正如 GPT 中的“P”所示——聊天生成式预训练转换器。 这种预训练功能将 AI 转变为通用的开发人员工具,不需要广泛的机器学习或模型训练背景。

4.2、提示(Prompts)

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

ChatGPT 的 API 在一个提示中有多个文本输入,每个文本输入都被分配了一个角色。 例如,存在系统角色,它指示模型如何行为并设置交互的上下文。 还有用户角色,通常是来自用户的输入。

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

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

分享提示已成为一种公共实践,并且正在就此主题进行积极的学术研究。 例如,与SQL相比,创建有效的提示是多么违反直觉,最近的研究论文发现,您可以使用的最有效的提示之一以短语开头,“深呼吸,逐步解决这个问题”。 这应该让你知道语言是多么重要。 我们还不完全了解如何最有效地利用这项技术的先前迭代,例如 ChatGPT 3.5,更不用说正在开发的新版本了。

  1. 提示是一种基于语言的输入,用于引导人工智能模型生成特定输出。它不仅仅是文本字符串,对于ChatGPT等模型,提示可以包含多个文本输入,并分配给不同的角色,如系统角色和用户角色。
  2. 制作有效的提示是一门艺术和科学,它需要考虑如何与人工智能模型进行交互,类似于与另一个人进行对话,而不仅仅是提出问题。这种交互方式的重要性导致了"提示工程"成为一个独立的学科。
  3. 研究表明,创建有效的提示可以大大提高最终生成的输出。目前,有许多新兴技术旨在提高提示的有效性,并正在积极研究这一主题。
  4. 分享提示已成为一种公共实践,学术界也在积极研究此领域。最近的研究发现,一个有效的提示可能以不太直观的方式开始,例如以短语"深呼吸,逐步解决这个问题"为开头,强调了语言在提示中的重要性。
  5. 尽管已经有一些迭代的模型(如ChatGPT 3.5)存在,但我们仍然没有完全理解如何最有效地利用提示技术,尤其是考虑到正在开发的新版本。

4.3、提示模板(Prompt Templates)

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

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

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

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

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

发送到模型的 Prompt 的特定数据格式存在相当大的差异。 提示最初是简单的字符串,后来发展到包含多条消息,其中每条消息中的每个字符串都表示模型的不同角色。

4.4、令 牌(Tokens)

令牌是 AI 模型工作方式的构建块。 在输入时,模型将单词转换为标记,在输出时,它们将标记转换回单词。

在英语中,一个标记大致相当于一个单词的 75%。作为参考,莎士比亚的全集总计约 900,000 字,相当于大约 1 万个代币。

也许更重要的是代币 = $。

在托管 AI 模型的上下文中,费用由使用的令牌数量决定。输入和输出都会影响总令牌计数。

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

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

要用 GPT4 总结莎士比亚的作品,您需要设计软件工程策略来切碎数据并在模型的上下文窗口限制内呈现数据。 这是 Spring AI 项目可以帮助您解决的一个领域。

4.5、输出解析(Output Parsing)

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

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

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

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

4.6、链接调用(Chaining Calls)

链是一个概念,表示对 AI 模型的一系列调用。 它使用一个调用的输出作为另一个调用的输入。

通过将调用链接在一起,您可以通过组合多个链的管道来支持复杂的用例。

4.7、将数据引入 AI 模型

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

需要注意的是,GPT 3.5/4.0 数据集仅持续到 2021 年 650 月。 因此,该模型会说它不知道该日期之后需要知识的问题的答案。 一个有趣的琐事是,这个数据集大约是~<>GB。

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

  1. 微调:这种传统的机器学习技术涉及定制模型并更改其内部权重。 然而,对于机器学习专家来说,这是一个具有挑战性的过程,并且由于 GPT 的大小,对于像 GPT 这样的模型来说,这是一个非常耗费资源的过程。此外,某些型号可能不提供此选项。
  2. 提示填充:更实用的替代方法是将数据嵌入到提供给模型的提示中。给定模型的令牌限制,需要技术在模型的上下文窗口中显示相关数据。 这种方法通俗地称为“填充提示”。

Spring AI 库可帮助您实现基于“提示填充”技术的解决方案,否则称为检索增强生成

4.8、检索增强生成

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

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

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

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

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

在实现 RAG 时使用了几个概念。 这些概念映射到 Spring AI 中的类。 下面简要介绍这些内容

  • DocumentReader这是一个 Java 功能接口,负责从数据源加载常见的数据源包括 PDF、Markdown 和 JSON。List<Document>
  • Document数据源的基于文本的表示形式,其中还包含用于描述内容的元数据。
  • DocumentTransformer这负责以各种方式处理数据,例如将文档拆分为更小的部分或向 .Document
  • DocumentWriter这允许您将文档持久化到数据库中,在 AI 堆栈中最常见,即矢量数据库。
  • Embedding这是您的数据表示形式,矢量数据库使用它来计算用户查询与相关文档的“相似性”。List<Double>

4.9、评估 AI 响应

根据用户请求有效评估人工智能系统的输出对于确保最终应用程序的准确性和有用性非常重要。 一些新兴技术允许将预训练模型本身用于此目的。

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

一种方法涉及呈现用户的请求和 AI 模型对模型的响应,查询响应是否与提供的数据一致。

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

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

五、spring AI应用

上面介绍了spring AI他是集成了 Azure OpenAI 和 OpenAI 作为后端。所以有两种api方式。

5.1、配置

5.1.1、OpenAI

首先需要在创建账户在 OpenAI Signup 创建一个帐户,并在 API Keys 中生成令牌。

Spring AI 项目定义了一个名为 的配置属性,应将其设置为从 获取的值。

spring.ai.openai.api-key API Key openai.com

导出环境变量是设置该配置属性的一种方法。

export SPRING_AI_OPENAI_API_KEY=<INSERT KEY HERE>

5.1.2、Azure OpenAI

获取 Azure OpenAI 和 Azure 门户上的“Azure OpenAI 服务”部分。endpointapi-key

Spring AI 项目定义了一个配置属性,该属性应设置为从 Azure 获取的值。 此外,还存在一个名为 configuraiton 的属性,应将其设置为在 Azure 中预配模型时获取的终结点 URL。

spring.ai.azure.openai.api-keyAPI Keyspring.ai.azure.openai.endpoint

导出环境变量是设置这些配置属性的一种方法。

export SPRING_AI_AZURE_OPENAI_API_KEY=<INSERT KEY HERE>
export SPRING_AI_AZURE_OPENAI_ENDPOINT=<INSERT ENDPOINT URL HERE>

docs/api.md · Gitee 极速下载/ollama - Gitee.com

ollama/docs/api.md at main · jmorganca/ollama (github.com) api

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教大家封装一个基础el-table 行内气泡编辑框,你一定用的到

今天的任务就是封装这个用element ui 组件来封装,如果让你封装你会怎么封装呢? 不说废话了,直接上代码 新建一个EditablePopoverColumn.vue组件文件 <template><el-table-column :prop="prop" :label="label"><template slot-scope=&…

USB拓展坞PCB

一、器件选型 1、DM&#xff1a;Data Minus&#xff0c;数据负信号; 2、DP&#xff1a;USB Data Positive&#xff0c;数据正信号; HUB芯片&#xff1a;sl2.1A 保险丝&#xff1a;1.5A快恢复保险丝 接电脑的USB&#xff1a;micro b或type-c 外接的USB&#xff1a;typeA (ED…

【Linux】基础IO_4

文章目录 六、基础I/O4. 动静态库 未完待续 六、基础I/O 4. 动静态库 既然我们能够成功创建静态库了&#xff0c;接下来我们将这个代码打包成动态库&#xff1a; shared: 表示生成共享库格式 fPIC&#xff1a;产生位置无关码(position independent code) 动态库库名规则&…

37 - 上级经理已离职的公司员工(高频 SQL 50 题基础版)

37 - 上级经理已离职的公司员工 selecte1.employee_id fromEmployees e1 left join Employees e2 on e1.manager_id e2.employee_id wheree2.manager_id is null and e1.manager_id is not null and e1.salary<30000;

function包装器和bind包装器

function包装器和bind包装器 包装器function包装器为什么需要functionfunction包装器function包装器的应用场景逆波兰表达式求值 bind包装器bind包装器的应用场景 包装器 包装器是用于给其他编程接口提供更一致或更合适的接口 由于函数调用可以使用函数名、函数指针、函数对象…

34.LengthFieldBasedFrameDecoder代码使用

public class TestLengthFieldDecorder {public static void main(String[] args) {//这里相当于服务端接收数据EmbeddedChannel embeddedChannel = new EmbeddedChannel(new LengthFieldBasedFrameDecoder(1024, 0,4, 0, 0),new LoggingHandler(LogLevel.DEBUG));//这里相当于…

Idea安装插件刷Leetcode

一、下载插件 idea版本2022以下两个插件都可以用来刷Leetcode 二、登录Leetcode 获取token 登录 三、配置 配置1 配置2 Code FileName C$!velocityTool.leftPadZeros($!{question.frontendQuestionId},4)$!velocityTool.replace(${question.title}," ","&qu…

【实战】Spring Cloud Stream 3.1+整合Kafka

文章目录 前言新版版本优势实战演示增加maven依赖增加applicaiton.yaml配置新增Kafka通道消费者新增发送消息的接口 实战测试postman发送一个正常的消息postman发送异常消息 前言 之前我们已经整合过Spring Cloud Stream 3.0版本与Kafka、RabbitMQ中间件&#xff0c;简直不要太…

【深度学习】实现基于MNIST数据集的TensorFlow/Keras深度学习案例

基于TensorFlow/Keras的深度学习案例 实现基于MNIST数据集的TensorFlow/Keras深度学习案例0. 什么是深度学习&#xff1f;1. TensorFlow简介2. Keras简介3. 安装TensorFlow前的注意事项4. 安装Anaconda3及搭建TensorFlow环境1&#xff09; 下载安装Anaconda Navigator2&#xf…

使用ESP32和Flask框架实现温湿度数据监测系统

项目概述 在这个项目中&#xff0c;我们将使用ESP32微控制器读取温湿度传感器的数据&#xff0c;并将这些数据通过HTTP请求传输到基于Flask框架的服务器。Flask是一个轻量级的Python Web框架&#xff0c;非常适合快速开发和部署Web应用。通过这个项目&#xff0c;我们不仅可以了…

36 - 按分类统计薪水(高频 SQL 50 题基础版)

36 - 按分类统计薪水 -- 方法一 selectLow Salary category,sum(income <20000) accounts_count fromAccounts union selectAverage Salary category,sum(income between 20000 and 50000) accounts_count fromAccounts union selectHigh Salary category,sum(in…

Linux htop命令使用

文章目录 简介界面介绍第一行第二行第三行第四行 如何使用 简介 htop 是一个类似于 top 的命令&#xff0c;但具有更丰富的功能和更友好的界面。它可以实时显示系统中各个进程的资源占用情况&#xff0c;如 CPU 使用率、内存使用率等。以下是对 htop 命令的完全解析&#xff1…

CANoe CAPL如何模拟发送CAN错误帧?

目录 canOutputErrorFrame介绍代码output(errorframe)代码总结canOutputErrorFrame 介绍 代码 canOutputErrorFrame(errorFrame, 12, 0); //output Error Frame with 12 dominant bits on CAN1 canOutputErrorFrame(CAN2.errorFrame, 6,

物理层(一)

第2章 物理层 2.1 通信基础 2.1.1 基本概念 1、数据、信号与码元 通信的目的是传输信息&#xff0c;如文字、图像和视频等。数据是指传送信息的实体。信号则是数据的电气或电磁表现&#xff0c;是数据在传输过程中的存在形式。数据和信号都有模拟或数字之分:①模拟数据(或模…

一个电商创业者眼中的618:平台大变局

战役结束了&#xff0c;战斗还在继续。 一位朋友去年5月创业&#xff0c;网上卖咖啡&#xff0c;这个赛道很拥挤&#xff0c;时机也不好&#xff0c;今年是他参加第一个618。朋友说&#xff0c;今年的目标是锤炼团队&#xff0c;总结方法&#xff0c;以及最重要的——活下去。…

设计模式——设计模式原则

设计模式 设计模式示例代码库地址&#xff1a; https://gitee.com/Jasonpupil/designPatterns 设计模式原则 单一职责原则&#xff08;SPS&#xff09;&#xff1a; 又称单一功能原则&#xff0c;面向对象五个基本原则&#xff08;SOLID&#xff09;之一 原则定义&#xf…

PHP环境搭建之使用PhpStudy

文章目录 1 PhpStudy1.1 简介1.2 下载&安装1.3 修改配置1.3.1 Apache配置1.3.2 MySQL配置1.3.3 MySQL启动问题 1.4 Composer1.4.1 简介1.4.2 下载安装1.4.3 修改配置1.4.4 使用命令 1 PhpStudy 1.1 简介 phpstudy是一个php运行环境的集成包&#xff0c;用户不需要去配置运…

2024/06/21--代码随想录算法10-12/17| 子序列问题

300.最长递增子序列 力扣链接 动规五部曲 dp的定义 dp[i]表示子序列答案以nums[i]结尾的最长递增子序列的长度 为什么一定表示 “以nums[i]结尾的最长递增子序” &#xff0c;因为我们在 做 递增比较的时候&#xff0c;如果比较 nums[j] 和 nums[i] 的大小&#xff0c;那么两…

怎么采集阿里巴巴1688的商品或商家数据?

怎么使用简数采集器批量采集阿里巴巴1688的商品或商家相关信息呢&#xff1f; 简数采集器暂时不支持采集阿里巴巴1688的相关数据&#xff0c;谢谢。 简数采集器采集网络网页数据非常简单高效&#xff1a;输入要采集的网址&#xff0c;简数智能算法会自动提取出网页上的关键信…

windows端口被占用问题,杀死进程

描述&#xff1a;端口被占用 在使用IntelliJ IDEA运行程序时&#xff0c;可能会遇到端口占用的情况&#xff0c;这通常由以下几个原因引起&#xff1a; 1、同一程序多次启动&#xff1a;如果你没有正确关闭之前运行的程序实例&#xff0c;再次尝试运行相同的程序时&#xff0c;…