侧边栏壁纸
博主头像
AI中文站

开拓MCP洪荒时代

  • 累计撰写 17 篇文章
  • 累计创建 3 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

AI概念

本节介绍Spring AI使用的核心概念。请仔细阅读本篇文章,以了解Spring AI实现背后的想法。

Models (模型)

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

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

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

Spring AI目前支持将输入和输出处理为自然语言、图像和音频的模型。 上表中的最后一行接受文本作为输入并输出数字,通常称为嵌入文本,表示AI模型中使用的内部数据结构。 Spring AI支持嵌入以实现更高级的用途。

像GPT这样的模型与众不同的是它们的预训练特性,如 GPT 中的“P”所示——聊天生成预训练转换器。 此预训练功能将AI转换为通用开发人员工具,不需要广泛的机器学习或模型训练背景。

Prompts(提示词)

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

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

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

这种互动风格的重要性在于 “Prompt Engineering(提示词工程)” 一词已成为其自己的学科。 有一个新兴的技术集合,提高提示的有效性。 投入时间制作一个提示可以大大提高结果输出。

共享提示已成为一种公共实践,并且正在对此主题进行积极的学术研究。 作为创建有效提示 (例如,与SQL对比) 可能是多么违反直觉的示例,最近的研究论文发现你可以使用的最有效的提示之一是从这句话开始的,“深呼吸,一步一步地努力。” 这应该会让你明白为什么语言如此重要。 我们尚未完全了解如何最有效地利用该技术的先前迭代,例如ChatGPT 3.5,更不用说正在开发的新版本了。


Prompt Templates (提示模板

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

此过程使用传统的基于文本的模板引擎进行即时创建和管理。 Spring AI使用OSS库StringTemplate为了这个目的。

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

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

复制!

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

发送到模型的提示的特定数据格式存在很大差异。 最初从简单的字符串开始,提示已经发展到包含多个消息,其中每个消息中的每个字符串代表模型的不同角色。

Embeddings (嵌入

嵌入是文本、图像或视频的数字表示,用于捕获输入之间的关系。

嵌入通过将文本、图像和视频转换为浮点数数组 (称为向量) 来工作。 这些向量旨在捕获文本,图像和视频的含义。 嵌入数组的长度称为向量的维数。

通过计算两个文本片段的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。

作为一个探索AI的Java开发人员,没有必要理解这些向量表示背后的复杂数学理论或具体实现。 对它们在AI系统中的角色和功能的基本了解就足够了,特别是当您将AI功能集成到应用程序中时。

嵌入在实际应用中特别相关,例如检索增强生成 (RAG) 模式。 它们能够将数据表示为语义空间中的点,这类似于欧几里得几何的二维空间,但在更高的维度上。 这意味着就像欧几里得几何平面上的点如何基于其坐标而接近或远离一样,在语义空间中,点的接近度反映了意义上的相似性。 关于相似主题的句子在这个多维空间中的位置更近,就像在图形上彼此靠近的点一样。 这种接近性有助于文本分类,语义搜索甚至产品推荐等任务,因为它允许AI根据其在扩展的语义地图中的 “坐标” 来识别和分组相关概念。

你可以把这个语义空间看作一个向量。

Tokens(令牌

令牌是AI模型如何工作的基础。 在输入时,模型将单词转换为标记。在输出时,它们将标记转换回单词。

在英语中,一个令牌大约相当于一个单词的75%。作为参考,莎士比亚的全集,总计约90万字,翻译约120万令牌。

令牌

也许更重要的是,Tokens = 钱。 在托管AI模型的上下文中,您的费用由使用的令牌数量决定。输入和输出都对总体令牌计数有贡献。

此外,模型受令牌限制,限制在单个API调用中处理的文本量。 该阈值通常被称为 “上下文窗口”。该模型不处理任何超出此限制的文本。

例如,ChatGPT3具有4k令牌限制,而GPT4提供不同的选项,例如8k,16k和32k。 Anthropic的Claude AI模型具有100k令牌限制,Meta的最新研究得出了1m令牌限制模型。

要使用GPT4总结莎士比亚的收藏作品,您需要设计软件工程策略来切碎数据并在模型的上下文窗口限制内呈现数据。 Spring AI项目可以帮助您完成此任务。

Structured Output (结构化输出

人工智能模型的输出传统上是作为java.lang.String,即使你要求回复是在JSON 它可能是一个正确的JSON,但它不是一个JSON数据结构。它只是一个字符串。 此外,要求 “for JSON” 作为提示的一部分不是100% 准确。

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

结构化输出转换器架构

结构化输出转换使用精心制作的提示,通常需要与模型进行多次交互才能实现所需的格式。

将您的数据和APIs接入AI模型

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

请注意,GPT 3.5/4.0数据集仅扩展到2021年9月。 因此,该模型说,它不知道需要超过该日期的知识的问题的答案。 一个有趣的琐事是这个数据集大约是650GB。

存在三种用于自定义AI模型以合并数据的技术:

  • 微调: 这种传统的机器学习技术涉及定制模型并更改其内部权重。 然而,对于机器学习专家来说,这是一个具有挑战性的过程,对于像GPT这样的模型来说,由于它们的规模,这是一个非常耗费资源的过程。此外,某些版本可能不提供此选项。

  • 提示词填充: 一种更实用的替代方法是将您的数据嵌入到提供给模型的提示中。给定模型的令牌限制,需要在模型的上下文窗口内呈现相关数据的技术。 这种方法俗称为 “提示词填充”。 Spring AI库可帮助您实现基于 “提示词填充” 技术的解决方案,也称为检索增强生成 (RAG)

提示填料

  • 工具调用: 这种技术允许注册将大型语言模型连接到外部系统的api的工具 (用户定义的服务)。 Spring AI极大地简化了您需要编写的代码以支持工具调用

Retrieval Augmented Generation (检索增强生成

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

该方法应用批处理风格的编程模型,先从文档中读取非结构化数据,对其进行转换,然后将其写入矢量数据库。 在高层,这是一个ETL (提取,转换和加载) 管道。 矢量数据库用于RAG技术的检索部分。

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

  1. 将文档拆分成多个部分,同时保留内容的语义边界。 例如,对于具有段落和表格的文档,应避免在段落或表格的中间拆分文档。 对于代码,请避免在方法实现的中间拆分代码。

  2. 将文档的部分进一步拆分为大小仅占AI模型令牌限制的一小部分。

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

春天的AI抹布

  • ETL Pipeline 提供有关编排从数据源提取数据并将其存储在结构化向量存储中的流程的更多信息,以确保在将数据传递给AI模型时,数据采用最佳格式进行检索。

  • ChatClient - RAG 解释如何使用QuestionAnswerAdvisor在应用程序中启用RAG功能。

Tool Calling (工具调用

大型语言模型 (llm) 在训练后数据无法变更,导致知识陈旧,并且它们无法访问或修改外部数据。

工具调用机制解决了这些缺点。 它允许您将自己的服务注册为工具,以将大型语言模型连接到外部系统的api。 这些系统可以为llm提供实时数据,并代表它们执行数据处理操作。

Spring AI大大简化了您需要编写的支持工具调用的代码。 它为您处理工具调用对话。 您可以提供您的工具作为@Tool-带注释的方法,并在提示选项中提供它,以使其可用于模型。 此外,您可以在单个提示中定义和引用多个工具。

工具调用的主要操作顺序

  1. 当我们想要使一个工具可用于模型时,我们将其定义包含在聊天请求中。每个工具定义包括输入参数的名称、描述和模式。

  2. 当模型决定调用一个工具时,它会发送一个响应,其中包含工具名称和根据定义的模式建模的输入参数。

  3. 应用程序负责使用工具名称来识别和执行具有所提供的输入参数的工具。

  4. 工具调用的结果由应用程序处理。

  5. 应用程序将工具调用结果发送回模型。

  6. 该模型使用工具调用结果作为附加上下文生成最终响应。

有关如何在不同 AI 模型中使用此功能的详细信息,请参阅 工具调用 文档。

评估AI响应

有效地评估AI系统响应用户请求的输出, 对于确保最终应用程序的准确性和实用性非常重要。 几种新兴技术使预训练模型本身能够用于此目的。

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

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

此外,利用矢量数据库中存储的信息作为补充数据可以增强评估过程,从而有助于确定响应相关性。

Spring AI项目提供了一个EvaluatorAPI,目前可以访问评估模型响应的基本策略。 按照评估测试文档以获取更多信息。

0

评论区