一起学Spring AI:核心概念
人工智能概念
本节描述了 Spring AI 使用的核心概念。我们建议您仔细阅读,以理解 Spring AI 实现背后的思想。
模型(Models)
人工智能模型是设计用来处理和生成信息的算法,通常模仿人类的认知功能。通过从大型数据集中学习模式和洞察力,这些模型可以做出预测,生成文本、图像或其他输出,增强各行各业的各种应用。
有许多不同类型的人工智能模型,每种都适合特定的用例。虽然 ChatGPT 及其生成性人工智能能力通过文本输入和输出吸引了用户,但许多模型和公司提供了多样化的输入和输出。在 ChatGPT 之前,许多人对文本到图像生成模型如 Midjourney 和 Stable Diffusion 感到着迷。
下表根据它们的输入和输出类型对几种模型进行分类:
模型类型
Spring AI 目前支持处理语言、图像和音频输入和输出的模型。上表中最后一行,接受文本作为输入并输出数字,更常见的称为嵌入文本,代表了人工智能模型内部使用的数据结构。Spring AI 支持嵌入,以实现更高级的用例。
像 GPT 这样的模型之所以与众不同,是因为它们的预训练特性,如 GPT 中的 "P" 所示——聊天生成预训练变换器。这种预训练功能将人工智能转变为一个通用的开发工具,不需要广泛的机器学习或模型训练背景。
提示(Prompts)
提示作为基于语言的输入的基础,指导人工智能模型产生特定的输出。对于熟悉 ChatGPT 的人来说,提示可能看起来只是输入到对话框中并发送到 API 的文本。然而,它包含的内容远不止于此。在许多人工智能模型中,提示的文本不仅仅是一个简单的字符串。
ChatGPT 的 API 在提示中有多个文本输入,每个文本输入都被分配一个角色。例如,有系统角色,它告诉模型如何表现并为交互设置上下文。还有用户角色,通常是用户的输入。
制作有效的提示既是一门艺术,也是一门科学。ChatGPT 旨在用于人类对话。这与使用 SQL 来“提问”大相径庭。人们必须像与另一个人交谈一样与人工智能模型交流。
这种交互方式的重要性如此之大,以至于“提示工程”这个术语已经作为一个独立的学科出现。有一系列日益增长的技术可以提高提示的有效性。投入时间制作提示可以极大地改善结果输出。
分享提示已经成为一种共同的做法,并且正在进行积极的学术研究。作为一个有效创建提示的反直觉例子(例如,与 SQL 对比),最近的一篇研究论文发现,你可以使用最有效的提示之一以“深呼吸,一步一步解决这个问题”这句话开始。这应该让你明白为什么语言如此重要。我们还没有完全理解如何最有效地利用这项技术的先前迭代,如 ChatGPT 3.5,更不用说正在开发的新版本了。
提示模板(Prompt Templates)
创建有效的提示涉及建立请求的上下文,并用特定于用户输入的值替换请求的部分。
这个过程使用传统的基于文本的模板引擎来创建和管理提示。Spring AI 使用 OSS 库 StringTemplate 来实现这一目的。
例如,考虑一个简单的提示模板:
告诉我一个关于 {content} 的 {adjective} 笑话。
在 Spring AI 中,提示模板可以类比为 Spring MVC 架构中的“视图”。模型对象,通常是 java.util.Map,提供给模板以填充模板中的占位符。“渲染”后的字符串成为提供给人工智能模型的提示内容。
发送到模型的提示的具体数据格式有很大的变化。最初是简单的字符串,提示已经演变成包括多条消息,其中每条消息中的每个字符串代表模型的不同角色。
嵌入(Embeddings)
嵌入是文本、图像或视频的数值表示,捕捉输入之间的关系。
嵌入通过将文本、图像和视频转换为浮点数数组,称为向量。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度。
通过计算两个文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。
嵌入
作为探索人工智能的 Java 开发者,不需要理解这些向量表示背后的复杂数学理论或具体实现。对他们在人工智能系统中的作用和功能有一个基本的了解就足够了,特别是当你将人工智能功能集成到你的应用程序中时。
嵌入在实际应用中特别相关,如检索增强生成(RAG)模式。它们使数据表示为语义空间中的点,类似于欧几里得几何的二维空间,但在更高维度。这意味着就像欧几里得几何平面上的点可以根据它们的坐标靠近或远离一样,在语义空间中,点的接近程度反映了含义的相似性。关于相似主题的句子在这个多维空间中的位置更接近,就像在图表上彼此靠近的点一样。这种接近性有助于文本分类、语义搜索甚至产品推荐等任务,因为它允许人工智能根据它们在这个扩展的语义景观中的“位置”来识别和组合相关概念。
你可以将这个语义空间想象成一个向量。
标记(Tokens)
标记作为人工智能模型工作的基石。在输入时,模型将单词转换为标记。在输出时,它们将标记转换回单词。
在英语中,一个标记大致对应于一个单词的 75%。作为参考,莎士比亚的全部作品,总计约 900,000 个单词,翻译成大约 120 万个标记。
标记
也许更重要的是,标记 = 金钱。在托管的人工智能模型的背景下,你的费用由使用的标记数量决定。输入和输出都有助于总体标记计数。
此外,模型受到标记限制,这限制了单次 API 调用中处理的文本量。这个阈值通常被称为“上下文窗口”。模型不处理任何超出此限制的文本。
例如,ChatGPT3 的标记限制为 4K,而 GPT4 提供不同的选项,如 8K、16K 和 32K。Anthropic 的 Claude AI 模型具有 100K 标记限制,Meta 的最近研究产生了一个 1M 标记限制模型。
要使用 GPT4 总结莎士比亚的作品集,你需要制定软件工程策略,将数据分割并在模型的上下文窗口限制内呈现数据。Spring AI 项目可以帮助你完成这项任务。
结构化输出(Structured Output)
人工智能模型的输出传统上以 java.lang.String 的形式到达,即使你要求以 JSON 格式回复。它可能是正确的 JSON,但它不是 JSON 数据结构。它只是一个字符串。此外,作为提示的一部分要求“JSON”并不完全准确。
这种复杂性导致了专门领域的发展,涉及创建提示以产生预期的输出,然后将结果的简单字符串转换为应用程序集成的可用数据结构。
结构化输出转换架构
结构化输出转换采用精心制作的提示,通常需要多次与模型交互以实现所需的格式。
将您的数据和 API 带给人工智能模型(Bringing Your Data & APIs to the AI Model)
你如何为人工智能模型提供它未经训练的信息?
请注意,GPT 3.5/4.0 的数据集仅扩展到 2021 年 9 月。因此,模型表示它不知道需要超出该日期的知识的问题的答案。一个有趣的小知识是,这个数据集大约是 650GB。
有三种技术可以自定义人工智能模型以整合你的数据:
-
微调:这种传统的机器学习技术涉及定制模型并改变其内部权重。然而,对于机器学习专家来说,这是一个具有挑战性的过程,对于像 GPT 这样的模型来说,由于其大小,资源密集型。此外,一些模型可能不提供此选项。
-
提示填充:一个更实用的替代方案涉及在提供给模型的提示中嵌入你的数据。鉴于模型的标记限制,需要技术在模型的上下文窗口内呈现相关数据。这种方法俗称为“填充提示”。Spring AI 库帮助你实现基于“填充提示”技术的解决方案,也称为检索增强生成(RAG)。
提示填充
-
函数调用:这种技术允许注册自定义用户函数,将大型语言模型连接到外部系统的 API。Spring AI 大大简化了你需要编写的代码,以支持函数调用。
检索增强生成(Retrieval Augmented Generation)
检索增强生成(RAG)技术出现,以解决将相关数据整合到提示中以获得准确的人工智能模型响应的挑战。
该方法涉及批量处理样式的编程模型,其中作业从你的文档中读取非结构化数据,转换它,然后将其写入向量数据库。在高层次上,这是一个 ETL(提取、转换和加载)管道。向量数据库用于 RAG 技术的检索部分。
作为将非结构化数据加载到向量数据库的一部分,最重要的转换之一是将原始文档分割成较小的部分。将原始文档分割成较小部分的过程有两个重要步骤:
-
在分割文档时,要保留内容的语义边界。例如,对于包含段落和表格的文档,应避免在段落或表格的中间进行分割。对于代码,应避免在方法实现的中间分割代码。
-
将文档的部分进一步分割成大小仅为人工智能模型标记限制的一小部分的片段。
RAG 的下一个阶段是处理用户输入。当用户的问题需要由人工智能模型回答时,问题和所有“相似”的文档片段被放入发送到人工智能模型的提示中。这就是使用向量数据库的原因。它非常擅长找到相似的内容。
Spring AI RAG
-
ETL 管道提供有关编排从数据源提取数据并将其存储在结构化向量存储中的流程的更多信息,确保数据以最佳格式进行检索,以便在传递给人工智能模型时进行检索。
-
ChatClient - RAG 解释了如何使用 QuestionAnswerAdvisor 在你的应用程序中启用 RAG 功能。
函数调用(Function Calling)
大型语言模型(LLMs)在训练后被冻结,导致知识过时,并且它们无法访问或修改外部数据。
函数调用机制解决了这些不足。它允许您注册自己的函数,将大型语言模型连接到外部系统的 API。这些系统可以代表 LLMs 提供实时数据并执行数据处理操作。
Spring AI 大大简化了您需要编写的代码以支持函数调用。它为您处理函数调用对话。您可以将您的函数作为 @Bean 提供,然后在提示选项中提供函数的 bean 名称以激活该函数。此外,您可以在单个提示中定义和引用多个函数。
函数调用
-
执行一个聊天请求,同时发送函数定义信息。后者提供名称、描述(例如,解释模型何时应该调用该函数)和输入参数(例如,函数的输入参数模式)。
-
当模型决定调用函数时,它将使用输入参数调用该函数,并将输出返回给模型。
-
Spring AI 为您处理这次对话。它将函数调用派发到适当的函数,并将结果返回给模型。
-
模型可以执行多个函数调用以检索它需要的所有信息。
-
一旦获取了所有必要的信息,模型将生成一个响应。
遵循函数调用文档,以获取如何将此功能与不同人工智能模型一起使用的更多信息。
评估人工智能响应(Evaluating AI responses)
有效地评估人工智能系统对用户请求的输出对于确保最终应用的准确性和实用性至关重要。一些新兴技术使得可以使用预训练模型本身来实现这一目的。
这个评估过程涉及分析生成的响应是否与用户的意图和查询的上下文一致。使用相关性、连贯性和事实正确性等指标来衡量人工智能生成的响应的质量。
一种方法是将用户的请求和人工智能模型的响应一起呈现给模型,查询响应是否与提供的数据一致。
此外,利用向量数据库中存储的信息作为补充数据可以增强评估过程,帮助确定响应的相关性。
Spring AI 项目提供了一个评估器 API,目前可以访问评估模型响应的基本策略。请参考评估测试文档以获取更多信息。
相关文章:

一起学Spring AI:核心概念
人工智能概念 本节描述了 Spring AI 使用的核心概念。我们建议您仔细阅读,以理解 Spring AI 实现背后的思想。 模型(Models) 人工智能模型是设计用来处理和生成信息的算法,通常模仿人类的认知功能。通过从大型数据集中学习模式…...
Oracle业务用户的存储过程个数及行数统计
Oracle业务用户的存储过程个数及行数统计 统计所有业务用户存储过程的个数独立定义的存储过程定义在包里的存储过程统计所有业务用户存储过程的总行数独立定义的存储过程定义在包里的存储过程📖 对存储过程进行统计主要用到以下三个系统视图: dba_objects:记录了所有独立创…...

PicSharp(图片压缩工具) v1.1.6
PicSharp 一个简单、高效、灵活的跨平台桌面图像压缩应用程序。软件基于Rust实现,高性能低资源,能快速扫描文件或目录,批处理图像。软件还具备组合压缩策略,TinyPNG提供最佳压缩比,但需要互联网连接,对大量…...

前端文件下载常用方式详解
在前端开发中,实现文件下载是常见的需求。根据不同的场景,我们可以选择不同的方法来实现文件流的下载。本文介绍三种常用的文件下载方式: 使用 axios 发送 JSON 请求下载文件流使用 axios 发送 FormData 请求下载文件流使用原生 form 表单提…...

【DAY42】Grad-CAM与Hook函数
内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业:理解下今天的代码即可 在深度学习中,我们经常需要查看或修改模型中间层的输出或梯度。然而,标准的前向传播和反…...

如何生成和制作PDF文件
在数字化办公的今天,PDF文件已经成为我们工作和学习中不可或缺的一部分。无论是合同、报告、简历,还是电子书、表单,PDF格式都以其跨平台兼容性、不可编辑性和清晰的排版而被广泛使用。但你是否知道,生成和制作PDF文件其实并不复杂…...

【K8S系列】Kubernetes 中 Pod(Java服务)启动缓慢的深度分析与解决方案
本文针对 Kubernetes 中 Java 服务启动时间慢的深度分析与解决方案文章,结合了底层原理、常见原因及具体优化策略: Kubernetes 中 Java 服务启动缓慢的深度分析与高效解决方案 在 Kubernetes 上部署 Java 应用时,启动时间过长是常见痛点,尤其在需要快速扩缩容或滚动更新的…...

【Java学习笔记】StringBuilder类(重点)
StringBuilder(重点) 1. 基本介绍 是一个可变的字符串序列。该类提供一个与 StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全的) 该类被设计用作 StringBuffer 的一个简易替换,用在字符…...
JavaScript ES6 解构:优雅提取数据的艺术
JavaScript ES6 解构:优雅提取数据的艺术 在 JavaScript 的世界中,ES6(ECMAScript 2015)的推出为开发者带来了许多革命性的特性,其中“解构赋值”(Destructuring Assignment)无疑是最受欢迎的功…...

iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
在vue项目中使用iview 框架部分组件时,直接引入使用报Maximum call stack size exceeded image.png 堆栈溢出 解决方案 更换组件名称就可以了 image.png 或 image.png 就可以了 猜测是因为和vue自己提供的组件名称一致了,重名问题导致的,具体…...

基于Halcon深度学习之分类
***** ***环境准备*** ***系统:win7以上系统 ***显卡:算力3.0以上 ***显卡驱动:10.1以上版本(nvidia-smi查看指令)***读取深度学习模型*** read_dl_model (pretrained_dl_classifier_compact.hdl, DLModelHandle) ***获…...
零基础在实践中学习网络安全-皮卡丘靶场(第十五期-URL重定向模块)
本期内容和之前的CSRF,File inclusion有联系,复习后可以更好了解 介绍 不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目…...

技巧小结:根据寄存器手册写常用外设的驱动程序
需求:根据STM32F103寄存器手册写DMA模块的驱动程序 一、分析标准库函数的写法: 各个外设的寄存器地址定义在stm32f10x.h文件中:此文件由芯片厂家提供;内核的有关定义则定义在core_cm3.h文件中:ARM提供; 1、查看外设区域多级划分…...

设计模式(代理设计模式)
代理模式解释清楚,所以如果想对一个类进行功能上增强而又不改变原来的代码情况下,那么只需要让这个类代理类就是我们的顺丰,对吧?并行增强就可以了。具体增强什么?在哪方面增强由代理类进行决定。 代码实现就是使用代理对象代理相关的逻辑…...

从代码学习深度强化学习 - 初探强化学习 PyTorch版
文章目录 前言强化学习的概念强化学习的环境强化学习中的数据强化学习的独特性总结前言 本文将带你初步了解强化学习 (Reinforcement Learning, RL) 的基本概念,并通过 PyTorch 实现一些简单的强化学习算法。强化学习是一种让智能体 (agent) 通过与环境 (environment) 的交互…...
AI大神吴恩达-提示词课程笔记
如何有效编写提示词 在学习如何与语言模型(如ChatGPT)交互时,编写清晰且高效的提示词(Prompt)是至关重要的。本课程由ESA提供,重点介绍了提示词工程(Prompt Engineering)的两个核心…...
ArcGIS Pro 3.4 二次开发 - 地图探索
环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 地图探索1 地图视图1.1 测试视图是否为3D1.2 设置视图模式1.3 启用视图链接2 更新地图视图范围2.1 返回上一个相机视图2.2 切换到下一个相机视角2.3 缩放到全图范围2.4 固定放大2.5 固定缩小2.6 缩放到范围2.7 缩放到一个点2.8 缩放…...

ELK日志管理框架介绍
在小铃铛的毕业设计中涉及到了ELK日志管理框架,在调研期间发现在中文中没有很好的对ELK框架进行介绍的文章,因此拟在本文中进行较为详细的实现的介绍。 理论知识 ELK 框架介绍 ELK 是一个流行的开源日志管理解决方案堆栈,由三个核心组件组…...

【Linux】sed 命令详解及使用样例:流式文本编辑器
【Linux】sed 命令详解及使用样例:流式文本编辑器 引言 sed 是 Linux/Unix 系统中一个强大的流式文本编辑器,名称来源于 “Stream EDitor”(流编辑器)。它允许用户在不打开文件的情况下对文本进行筛选和转换,是命令行…...

机器学习:聚类算法及实战案例
本文目录: 一、聚类算法介绍二、分类(一)根据聚类颗粒度分类(二)根据实现方法分类 三、聚类流程四、K值的确定—肘部法(一)SSE-误差平方和(二)肘部法确定 K 值 五、代码重…...
预览pdf(url格式和blob格式)
<template><div class"pdf-container"><div v-if"loading" class"loading-state"><a-spin size"large" /></div><div v-else-if"error" class"loading-state">加载失败&…...

【p2p、分布式,区块链笔记 MESH】 论文阅读 Thread/OpenThread Low-Power Wireless Multihop Net
paperauthorThread/OpenThread: A Compromise in Low-Power Wireless Multihop Network Architecture for the Internet of ThingsHyung-Sin Kim, Sam Kumar, and David E. Culler 目录 引言RPL 标准设计目标与架构设计选择与特性shortcomIngs of RPL设计选择的反面影响sImulta…...
for AC500 PLCs 3ADR025003M9903的安全说明
1安全说明 必须遵守特殊的环境条件(例如,由于爆炸性物质、重污染或腐蚀影响的危险区域)。必须在指定的技术数据和系统数据范围内处理和操作设备。该装置不含可维修部件,不得打开。除非另有规定,否则操作过程中必须关闭可拆卸的盖子。拒绝对不…...

moon游戏服务器-demo运行
下载地址 https://github.com/sniper00/MoonDemo redis安装 Redis-x64-3.0.504.msi 服务器配置文件 D:\gitee\moon_server_demo\serverconf.lua 貌似不修改也可以的,redis不要设置密码 windows编译 安装VS2022 Community 下载premake5.exe放MoonDemo\server\moon 双…...
前端(vue)学习笔记(CLASS 7):vuex
vuex概述 vuex是一个vue的状态管理工具,状态就是数据 大白话:vuex是一个插件,可以帮我们管理vue通用的数据(多组件共享的数据) 场景 1、某个状态在很多个组件来使用(个人信息) 2、多个组件…...
[特殊字符] 在 React Native 项目中封装 App Icon 一键设置命令(支持参数与默认路径)
📦 前置依赖 使用的是社区维护的 CLI 工具: @bam.tech/react-native-make它扩展了 react-native 命令,支持 set-icon 功能。 安装: yarn add -D "@bam.tech/react-native-make"🧠 封装目标 我们希望能够通过以下方式调用: # 默认使用 ./icon.png yarn …...
基于深度学习(Unet和SwinUnet)的医学图像分割系统设计与实现:超声心脏分割
基于深度学习的医学图像分割系统设计与实现 摘要 本文提出了一种基于深度学习的医学图像分割系统,该系统采用U-Net和Swin-Unet作为核心网络架构,实现了高效的医学图像分割功能。系统包含完整的训练、验证和推理流程,并提供了用户友好的图形界面。实验结果表明,该系统在医…...

Qt学习及使用_第1部分_认识Qt---学习目的及技术准备
前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…...
如何把本地服务器变成公网服务器?内网ip网址转换到外网连接访问
内网IP只能在本地内部网络连接访问,当本地搭建服务器部署好相关网站或应用后,在局域网内可以通过内网IP访问,但在外网是无法直接访问异地内网IP端口应用的,只有公网IP和域名才能实现互联网上的访问。那么需要如何把本地服务器变…...
Java+Access综合测评系统源码分享:含论文、开题报告、任务书全套资料
JAVAaccess综合测评系统毕业设计 一、系统概述 本系统采用Java Swing开发前端界面,结合Access数据库实现数据存储,专为教育机构打造的综合测评解决方案。系统包含学生管理、题库管理、在线测评、成绩分析四大核心模块,实现了测评流程的全自…...