springAI(一)

目录

一、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.mzph.cn/news/857873.shtml

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

相关文章

Axios-入门

介绍 Axios对原生Ajax进行了封装&#xff0c;简化书写&#xff0c;快速开发 官网&#xff1a;Axios中文文档 | Axios中文网 (axios-http.cn) 入门 1引入Axios的js文件 <script src"js/axios.js"></script> 2使用Axios发送请求&#xff0c;并获取响应…

系统架构师考点--嵌入式技术

​大家好。今天来总结一下嵌入式技术的考点。该考点分值3-5分&#xff0c;上午场选择题和下午场案例题都可能会考&#xff0c;但不是每年都考。 一、嵌入式微处理体系结构 冯诺依曼结构&#xff1a;传统计算机采用冯诺依曼(Von Neumann)结构&#xff0c;也称普林斯顿结构是一…

【代码随想录】【算法训练营】【第45天】 [198]打家劫舍 [213]打家劫舍II [337]打家劫舍III

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 45&#xff0c;周五&#xff0c;坚持不了一点~ 题目详情 [198] 打家劫舍 题目描述 198 打家劫舍 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 虚拟头…

中国科学院西北生态环境资源研究院联合多单位在《PNAS》发文:气候变暖对多年冻土区地上与地下生物量分布的影响

文章简介 论文名称&#xff1a;Changes in above-versus belowground biomass distribution in permafrost regions in response to climate warming&#xff08;气候变暖对多年冻土区地上与地下生物量分布的影响&#xff09; 第一作者及单位&#xff1a;贠汉伯&#xff08;研…

SCI一区TOP|双曲正弦余弦优化算法(SCHO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年&#xff0c;J Bai受到双曲正弦余弦函数启发&#xff0c;提出了双曲正弦余弦优化算法&#xff08;Sinh Cosh optimizer, SCHO&#xff09;。 2.算法原理 2.1算法思想 SCHO灵感来源…

1panel + Pbootcms 设置伪静态规则

这里确保我们引用的样式路径是否是这样的&#xff0c;&#xff08;不然可能会设置了伪静态无法加载样式&#xff09; //这种格式在不开起伪静态是可以引入的&#xff0c;一旦开启就不行了,一定要在static 前面加上反斜杠 /<link rel"stylesheet" href"{pbo…

【数据分享】《中国法律年鉴》1987-2022

而今天要免费分享的数据就是1987-2022年间出版的《中国法律年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 自1987年起&#xff0c;《中国法律年鉴》作为一部全面记录中国法律发展进程的重要文献&#xff0c;见证了中国法治建设的每…

Linux服务升级:Almalinux 升级 WebCatlog桌面程序

目录 一、实验 1.环境 2.Almalinux 升级 WebCatlog桌面程序 二、问题 1.Ubuntu如何升级 WebCatlog桌面程序 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本软件IP备注Almalinux9.4 WebCatlog 192.168.204.150 &#xff08;2&#xff09;Termi…

odoo17 小变更4

odoo17 小变更4 1、代码中去除了访问私人地址权限,但翻译中均还有,怪不 model:res.groups,name:base.group_private_addresses msgid "Access to Private Addresses" msgstr "" 代码也查看了,的确没有了此权限组 --><record model="res.g…

大聪明教你学Java | 深入浅出聊 Kafka

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

35 - 最后一个能进入巴士的人(高频 SQL 50 题基础版)

35 - 最后一个能进入巴士的人 -- sum(weight) over(order by turn) as total,根据turn升序&#xff0c;再求前面数的和 selectperson_name from(selectperson_name,sum(weight) over(order by turn) as totalfromQueue) new_Queue wheretotal<1000 order by total desc lim…

34 - 指定日期的产品价格(高频 SQL 50 题基础版)

34 - 指定日期的产品价格 -- row_number(行号) 生成连续的序号&#xff0c;不考虑分数相同 -- 在2019-08-16之前改的价格&#xff0c;使用最近一期的日期&#xff0c;没有在2019-08-16之前改的价格&#xff0c;默认价格为10 select t.product_id, t.new_price as price from (s…

Idea安装插件刷Leetcode

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

Redis进阶 - 朝生暮死之Redis过期策略

概述 Redis 是一种常用的内存数据库&#xff0c;其所有的数据结构都可以设置过期时间&#xff0c;时间一到&#xff0c;就会自动删除。你可以想象 Redis 内部有一个死神&#xff0c;时刻盯着所有设置了过期时间的 key&#xff0c;寿命一到就会立即收割。 你还可以进一步站在死神…

MSPM0G3507 ——GPIO例程讲解2——simultaneous_interrupts

主函数&#xff1a; #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();/* Enable Interrupt for both GPIOA and GPIOB ports */NVIC_EnableIRQ(GPIO_SWITCHES_GPIOA_INT_IRQN); //启用SWITCHES——A的中断 NVIC_EnableIRQ(GPIO_S…

【数据结构与算法】哈夫曼树,哈夫曼编码 详解

哈夫曼树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right; }; using HuffmanTree TreeNode *;结构体包含三个成员&#xff1a; data 是一个 ElemType 类型的变量&#xff0c;用于存储哈夫曼树节点的数据。left 是一个指向 TreeNode 类型的指针&#xf…

强化学习中的自我博弈(self-play)

自我博弈&#xff08;Self-Play&#xff09;[1]是应用于智能体于智能体之间处于对抗关系的训练方法&#xff0c;这里的对抗关系指的是一方的奖励上升必然导致另一方的奖励下降。通过轮流训练双方的智能体就能使得双方的策略模型的性能得到显著提升&#xff0c;使得整个对抗系统…

CBA认证-业务架构师认证的尚方宝剑

CBA业务架构师认证是一种由业务架构师公会&#xff08;Business Architecture Guild&#xff09;授予的专业认证&#xff0c;全称为Certified Business Architect&#xff0c;简称CBA。以下是关于CBA业务架构师认证的主要信息和特点&#xff1a; 认证目的&#xff1a; CBA认证…

基于淘宝商城用户购物行为数据分析系统

摘 要 在电商行业高速发展的今天&#xff0c;用户购物行为数据量呈指数型增长&#xff0c;传统的数据处理架构已经无法满足于现如今的数据处理需求。针对于这样的需求本课题设计了一种基于淘宝的用户购物行为分析系统&#xff0c;旨在通过对大量数据进行分析处理进而深入研究用…

Portainer.io安装并配置Docker远程访问及CA证书

Portainer.io安装并配置Docker远程访问及CA证书 文章目录 Portainer.io安装并配置Docker远程访问及CA证书一.安装 Portainer.io2.启动容器 二.docker API远程访问并配置CA安全认证1.配置安全(密钥)访问2.补全CA证书信息3.生成server-key.pem4.创建服务端签名请求证书文件5.创建…