赞
踩
Spring人工智能项目旨在简化包含人工智能功能的应用程序的开发,而不需要不必要的复杂性。
该项目的灵感来自著名的Python项目,如LangChain和LlamaIndex,但Spring AI并不是这些项目的直接端口。该项目的成立相信,下一波Generative AI应用程序将不仅面向Python开发人员,而且将在许多编程语言中无处不在。
Spring AI的核心是提供抽象,作为开发人工智能应用程序的基础。这些抽象有多个实现,能够以最小的代码更改实现简单的组件交换。
支持所有主要的模型提供商,如OpenAI、微软、亚马逊、谷歌和Huggingface。
支持的模型类型有聊天和文本到图像,还有更多。
可移植的API跨人工智能提供商聊天和嵌入模型。同时支持同步和流API选项。还支持下拉访问特定于型号的功能。
人工智能模型输出到POJO的映射。
支持所有主要的矢量数据库提供商,如Azure矢量搜索、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Qdrant、Redis和Weaviate
跨矢量存储提供商的可移植API,包括一个新的类似SQL的元数据过滤器API,它也是可移植的。
函数调用
用于AI模型和矢量存储的Spring Boot自动配置和启动器。
用于数据工程的ETL框架
这些功能集允许您实现常见用例,如“文档问答”或“与文档聊天”
本节介绍Spring AI使用的核心概念。我们建议仔细阅读它,以了解Spring AI是如何实现的。
人工智能模型是用来处理和生成信息的算法,通常模仿人类的认知功能。通过从大型数据集中学习模式和见解,这些模型可以进行预测、文本、图像或其他输出,增强跨行业的各种应用程序。
有许多不同类型的人工智能模型,每种模型都适合特定的用例。虽然ChatGPT及其生成人工智能功能通过文本输入和输出吸引了用户,但许多模型和公司提供了不同的输入和输出。在ChatGPT之前,许多人对文本到图像的生成模型着迷,如Midtravel和Stable Diffusion。
下表根据输入和输出类型对几个模型进行了分类:
Spring AI最初的重点是处理语言输入和提供语言输出的模型,最初是OpenAI+Azure OpenAI。上一个表中的最后一行接受文本作为输入并输出数字,通常称为嵌入文本,表示人工智能模型中使用的内部数据结构。Spring AI支持嵌入,以支持更高级的用例。
GPT等模型的区别在于它们的预训练性质,如GPT中的“P”所示——聊天生成预训练转换器。这种预训练功能将人工智能转变为一种通用的开发工具,不需要广泛的机器学习或模型训练背景。
提示是指导人工智能模型产生特定输出的基于语言的输入的基础。对于熟悉ChatGPT的人来说,提示可能看起来只是在发送到API的对话框中输入的文本。然而,它包含的远不止这些。在许多人工智能模型中,提示的文本不仅仅是一个简单的字符串。
ChatGPT的API在一个提示中有多个文本输入,每个文本输入都被分配一个角色。例如,有一个系统角色,它告诉模型如何行为,并为交互设置上下文。还有用户角色,它通常是来自用户的输入。
制作有效的提示既是一门艺术,也是一门科学。ChatGPT是为人类对话而设计的。这与使用SQL之类的语言“提问”截然不同。一个人必须与人工智能模型进行沟通,就像与另一个人交谈一样。
这种互动风格的重要性使得“即时工程”一词成为了它自己的学科。有一个新兴的技术集合可以提高提示的有效性。在制作提示上投入时间可以大大提高结果。
分享提示已经成为一种公共实践,并且正在对这一主题进行积极的学术研究。最近的一篇研究论文发现,你可以使用的最有效的提示之一是“深呼吸,一步一步地做这件事”。这应该能让你明白为什么语言如此重要。我们还不完全了解如何最有效地利用这项技术的先前迭代,如ChatGPT 3.5,更不用说正在开发的新版本了。
创建有效的提示包括建立请求的上下文,并用特定于用户输入的值替换请求的部分。
此过程使用传统的基于文本的模板引擎进行即时创建和管理。Spring AI为此使用了OSS库StringTemplate。
例如,考虑简单的提示模板:
Tell me a {adjective} joke about {content}.
在Spring AI中,提示模板可以比作Spring MVC架构中的“视图”。一个模型对象,通常是java.util.Map,用于填充模板中的占位符。“rendered”字符串成为提供给AI模型的提示的内容。
发送给模型的提示的具体数据格式存在相当大的可变性。最初作为简单的字符串开始,提示已经发展到包括多个消息,其中每个消息中的每个字符串代表模型的不同角色。
嵌入将文本转换为数字数组或矢量,使人工智能模型能够处理和解释语言数据。这种从文本到数字再到数字的转换是人工智能如何与人类语言互动和理解人类语言的关键因素。作为一名探索人工智能的Java开发人员,没有必要理解这些矢量表示背后复杂的数学理论或具体实现。基本了解它们在人工智能系统中的作用和功能就足够了,尤其是当你将人工智能功能集成到应用程序中时。
嵌入在实际应用中尤其相关,如检索增强生成(RAG)模式。它们能够将数据表示为语义空间中的点,这类似于欧几里得几何的二维空间,但在更高的维度上。这意味着,就像欧几里得几何中平面上的点如何根据坐标来接近或远离一样,在语义空间中,点的接近反映了意义上的相似性。关于相似主题的句子在这个多维空间中的位置更接近,很像图上彼此靠近的点。这种接近有助于文本分类、语义搜索甚至产品推荐等任务,因为它允许人工智能根据相关概念在扩展的语义环境中的“位置”来辨别和分组相关概念。
你可以把这个语义空间看作一个向量。
是人工智能模型如何工作的基石。在输入时,模型将单词转换为标记。在输出时,他们将标记转换回单词。
在英语中,一个标记大致相当于一个单词的75%。作为参考,莎士比亚的全集总计约90万字,翻译成约120万个token。
也许更重要的是token=美元。
在托管人工智能模型的背景下,您的费用由使用的token数量决定。输入和输出都有助于整个token计数。
此外,模型受token限制,这限制了单个API调用中处理的文本量。这个阈值通常被称为“上下文窗口”。该模型不处理任何超过此限制的文本。
例如,ChatGPT3有4Ktoken限制,而GPT4提供不同的选项,如8K、16K和32K。Anthropic的Claude AI模型有100Ktoken限制,Meta最近的研究得出了1Mtoken限制模型。
要用GPT4总结莎士比亚收集的作品,您需要设计软件工程策略来分解数据,并在模型的上下文窗口限制内呈现数据。Spring AI项目可以帮助您完成这项任务。
传统上,AI模型的输出以java.lang.String的形式到达,即使您要求以JSON的形式返回。它可能是正确的JSON,但不是JSON数据结构。它只是一个字符串。此外,作为提示的一部分询问“for JSON”并不是100%准确的。
这种复杂性导致了一个专门领域的出现,该领域涉及创建提示以产生预期输出,然后将生成的简单字符串解析为可用于应用程序集成的可用数据结构。
输出解析采用精心制作的提示,通常需要与模型进行多次交互才能实现所需的格式。
这一挑战促使OpenAI引入“OpenAI函数”,作为精确指定模型所需输出格式的一种手段。
如何为人工智能模型配备未经训练的信息?
请注意,GPT 3.5/4.0数据集仅扩展到2021年9月。因此,该模型表示,它不知道超过该日期需要知识的问题的答案。一个有趣的琐事是这个数据集大约是650GB。
有三种技术可用于定制人工智能模型以整合您的数据:
Fine Tuning: 这种传统的机器学习技术包括剪裁模型并改变其内部权重。然而,对于机器学习专家来说,这是一个具有挑战性的过程,对于像GPT这样的模型来说,由于其规模,这是极其耗费资源的过程。此外,某些模型可能不提供此选项。
Prompt Stuffing: 一个更实用的替代方案是将数据嵌入到提供给模型的提示中。给定模型的token限制,需要使用技术在模型的上下文窗口中显示相关数据。这种方法通俗地称为“填充提示”。Spring AI库帮助您实现基于“填充提示(filling the prompt)”技术的解决方案,也称为检索增强生成(RAG)。
Function Calling: 这种技术允许注册将大型语言模型连接到外部系统的API的自定义用户函数。Spring AI大大简化了支持函数调用所需编写的代码。
一种名为“检索增强生成”(RAG)的技术已经出现,以应对将相关数据整合到提示中以获得准确的人工智能模型响应的挑战。
该方法涉及一个批处理风格的编程模型,在该模型中,作业从文档中读取非结构化数据,对其进行转换,然后将其写入矢量数据库。从高层来看,这是一个ETL(提取、转换和加载)管道。矢量数据库用于RAG技术的检索部分。
作为将非结构化数据加载到矢量数据库的一部分,最重要的转换之一是将原始文档拆分为更小的部分。将原始文档拆分为小块的过程有两个重要步骤:
将文档拆分为多个部分,同时保留内容的语义边界。例如,对于具有段落和表格的文档,应避免将文档拆分到段落或表格的中间。对于代码,请避免在方法实现的中间拆分代码
将文档的部分进一步拆分为大小仅为AI模型token限制的一小部分。
RAG的下一个阶段是处理用户输入。当人工智能模型要回答用户的问题时,该问题和所有“相似”的文档都会被放入发送给人工智能模型的提示中。这就是使用矢量数据库的原因。它非常善于发现类似的内容。
有几个概念用于实现RAG。这些概念映射到Spring AI中的类上:
DocumentReader: 一个Java函数接口,负责从数据源加载List。常见的数据源有PDF、Markdown和JSON。
Document: 数据源的基于文本的表示,其中还包含用于描述内容的元数据。
DocumentTransformer: 负责以各种方式处理数据(例如,将文档拆分为更小的部分或向文档添加额外的元数据)。
DocumentWriter:允许您将文档持久化到数据库中(最常见的是AI堆栈中的矢量数据库)。
Embedding: 将您的数据表示为List<Double>,矢量数据库使用它来计算用户查询与相关文档的“相似性”。
大型语言模型(LLM)在训练后被冻结,导致知识陈旧,无法访问或修改外部数据。
函数调用机制解决了这些缺点。它允许您注册自定义的、用户的函数,这些函数将大型语言模型连接到外部系统的API。这些系统可以向LLM提供实时数据,并代表LLM执行数据处理动作。
Spring AI极大地简化了支持函数调用所需编写的代码。它为您代理函数调用会话。您可以将函数提供为@Bean,然后在提示选项中提供函数的Bean名称以激活该函数。您也可以在一个提示中定义和引用多个函数。
有效评估人工智能系统响应用户请求的输出对于确保最终应用程序的准确性和有用性非常重要。一些新兴的技术使预先训练的模型本身能够用于此目的。
这个评估过程包括分析生成的响应是否与用户的意图和查询的上下文一致。相关性、连贯性和事实正确性等指标用于衡量人工智能生成的响应的质量。
一种方法包括呈现用户的请求和人工智能模型对模型的响应,询问响应是否与所提供的数据一致。
此外,利用矢量数据库中存储的信息作为补充数据可以增强评估过程,有助于确定响应相关性。
Spring AI项目目前提供了一些非常基本的例子,说明如何以包含在JUnit Test中的提示形式评估响应。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。