目录
一、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 来源
- Spring AI 项目是一个实验性项目,旨在使用 Spring 框架的通用概念创建人工智能(AI)应用程序。它集成了 Azure OpenAI 和 OpenAI 作为后端,支持内容生成、代码生成、语义搜索和摘要等用例。
- 从历史上看,Python 曾常用于访问以 C 和 C++ 等语言编写的AI算法,但现在生成式AI(如OpenAI的ChatGPT)使得使用HTTP访问预训练模型更加容易,使Java等编程语言更容易与AI算法交互,AI 不再需要数据科学家来收集数据和训练模型。。
- 但是,用于 AI 解决方案(如 OpenAI 和 Azure OpenAI)的各种 Java 客户端 API 不同,这使得在这些解决方案之间切换变得更加困难
- Spring AI在收到Python库的启发 提供了一个抽象层,构建在Python库LangChain和LlamaIndex的客户端API之上,以简化不同Java客户端API之间的切换。它遵循Spring项目的设计价值,如模块化、可扩展性和数据源集成。
- 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,更不用说正在开发的新版本了。
- 提示是一种基于语言的输入,用于引导人工智能模型生成特定输出。它不仅仅是文本字符串,对于ChatGPT等模型,提示可以包含多个文本输入,并分配给不同的角色,如系统角色和用户角色。
- 制作有效的提示是一门艺术和科学,它需要考虑如何与人工智能模型进行交互,类似于与另一个人进行对话,而不仅仅是提出问题。这种交互方式的重要性导致了"提示工程"成为一个独立的学科。
- 研究表明,创建有效的提示可以大大提高最终生成的输出。目前,有许多新兴技术旨在提高提示的有效性,并正在积极研究这一主题。
- 分享提示已成为一种公共实践,学术界也在积极研究此领域。最近的研究发现,一个有效的提示可能以不太直观的方式开始,例如以短语"深呼吸,逐步解决这个问题"为开头,强调了语言在提示中的重要性。
- 尽管已经有一些迭代的模型(如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 模型以合并数据:
- 微调:这种传统的机器学习技术涉及定制模型并更改其内部权重。 然而,对于机器学习专家来说,这是一个具有挑战性的过程,并且由于 GPT 的大小,对于像 GPT 这样的模型来说,这是一个非常耗费资源的过程。此外,某些型号可能不提供此选项。
- 提示填充:更实用的替代方法是将数据嵌入到提供给模型的提示中。给定模型的令牌限制,需要技术在模型的上下文窗口中显示相关数据。 这种方法通俗地称为“填充提示”。
Spring AI 库可帮助您实现基于“提示填充”技术的解决方案,否则称为检索增强生成
4.8、检索增强生成
一种称为检索增强生成 (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>
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