模型
AI模型是设计用于处理和生成信息的算法,通常模仿人类认知功能。 通过从大型数据集中学习模式和洞察力,这些模型可以生成预测、文本、图像或其他输出,增强各行业的各种应用。 有许多不同类型的AI模型,每种类型都适合特定的用例。 虽然ChatGPT及其生成式AI功能通过文本输入和输出吸引了用户,但许多模型和公司提供多样化的输入和输出。 在ChatGPT之前,许多人对诸如Midjourney和Stable Diffusion等文本到图像生成模型很着迷。 下表根据输入和输出类型对几种模型进行了分类:
模型类型
提示词
提示词作为基于语言的输入的基础,引导AI模型产生特定的输出。 对于熟悉ChatGPT的人来说,提示词可能看起来只是输入到对话框中发送给API的文本。 然而,它包含的内容远不止于此。 在许多AI模型中,提示词的文本不仅仅是一个简单的字符串。 ChatGPT的API在一个提示词中有多个文本输入,每个文本输入都被分配一个角色。 例如,有系统角色,它告诉模型如何行为并为交互设置上下文。 还有用户角色,通常是用户的输入。 制作有效的提示词既是一门艺术,也是一门科学。 ChatGPT是为人类对话而设计的。 这与使用类似SQL的方式”提问”有很大不同。 人们必须与AI模型进行交流,就像与另一个人对话一样。如此重要的交互方式,以至于”提示词工程”一词已经成为独立的学科。
有越来越多的技术可以提高提示词的有效性。
花时间精心制作提示词可以大大提高最终输出的质量。
提示词模板
创建有效的提示词涉及建立请求的上下文,并将请求的部分替换为特定于用户输入的值。 此过程使用传统的基于文本的模板引擎来创建和管理提示词。 Spring AI使用开源库StringTemplate来实现这一目的。 例如,考虑这个简单的提示词模板:java.util.Map
,来填充模板中的占位符。
“渲染”的字符串成为提供给AI模型的提示词内容。
发送到模型的提示词的具体数据格式存在相当大的变化。
最初从简单的字符串开始,提示词已经演变为包含多个消息,其中每个消息中的每个字符串代表模型的不同角色。
嵌入
嵌入是文本、图像或视频的数值表示,捕捉输入之间的关系。 嵌入通过将文本、图像和视频转换为浮点数数组(称为向量)来工作。 这些向量旨在捕捉文本、图像和视频的含义。 嵌入数组的长度称为向量的维度。 通过计算两段文本的向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。
嵌入
令牌
令牌作为AI模型工作方式的基本构建块。 在输入时,模型将单词转换为令牌。在输出时,它们将令牌转换回单词。 在英语中,一个令牌大约相当于75%的一个单词。作为参考,莎士比亚的全部作品,总计约90万字,转化为大约120万个令牌。
令牌
也许更重要的是,令牌 = 金钱。
在托管AI模型的环境中,你的费用由使用的令牌数量决定。输入和输出都会计入总令牌数。
结构化输出
AI模型的输出传统上以java.lang.String
形式到达,即使你要求回复以JSON格式呈现。
它可能是正确的JSON,但它不是JSON数据结构。它只是一个字符串。
此外,在提示中要求”JSON”并不是100%准确的。
这种复杂性导致了一个专门领域的出现,涉及创建提示以产生预期输出,然后将产生的简单字符串转换为可用的数据结构,以便应用程序集成。

结构化输出转换器架构
将你的数据和API带给AI模型
你如何为AI模型提供它未经训练的信息?GPT 3.5/4.0数据集仅延伸至2021年9月。
因此,当模型遇到需要超出该日期知识的问题时,它会声明不知道答案。
一个有趣的琐事是,这个数据集大约为650GB。
微调
微调
这种传统的机器学习技术涉及调整模型并改变其内部权重。
然而,对于机器学习专家来说,这是一个具有挑战性的过程,对于GPT等模型来说,由于其规模,这个过程极其资源密集。此外,某些模型可能不提供此选项。
提示填充(RAG)
提示填充(RAG)
一种更实用的替代方法是将你的数据嵌入到提供给模型的提示中。鉴于模型的令牌限制,需要一些技术来在模型的上下文窗口内呈现相关数据。
这种方法俗称为”塞满提示”。
Spring AI库帮助你实现基于”塞满提示”技术的解决方案,也称为检索增强生成(RAG)。

工具调用
工具调用
这种技术允许注册工具(用户定义的服务),将大型语言模型连接到外部系统的API。
Spring AI大大简化了支持工具调用所需的代码。
检索增强生成
检索增强生成(RAG)技术应运而生,解决了将相关数据纳入提示以获取准确AI模型响应的挑战。 该方法采用批处理风格的编程模型,作业从文档中读取非结构化数据,进行转换,然后将其写入向量数据库。 从高层次来看,这是一个ETL(提取、转换和加载)管道。 向量数据库用于RAG技术的检索部分。 作为将非结构化数据加载到向量数据库的一部分,最重要的转换之一是将原始文档分割成更小的片段。 将原始文档分割成更小部分的过程有两个重要步骤:1
保持语义边界的分割
在保留内容语义边界的同时将文档分成多个部分。
例如,对于带有段落和表格的文档,应避免在段落或表格中间分割文档。
对于代码,避免在方法实现的中间分割代码。
2
针对令牌限制优化
将文档的部分进一步分割成大小为AI模型令牌限制的一小部分的片段。

Spring AI RAG
- ETL管道提供了更多关于协调从数据源提取数据并将其存储在结构化向量存储中的流程的信息,确保数据在传递给AI模型时处于最佳检索格式。
- ChatClient - RAG解释了如何使用
QuestionAnswerAdvisor
在你的应用程序中启用RAG功能。
工具调用
大型语言模型(LLM)在训练后被冻结,导致知识过时,并且它们无法访问或修改外部数据。 工具调用机制解决了这些缺点。 它允许你将自己的服务注册为工具,将大型语言模型连接到外部系统的API。 这些系统可以为LLM提供实时数据,并代表它们执行数据处理操作。 Spring AI大大简化了支持工具调用所需编写的代码。 它为你处理工具调用对话。 你可以将工具提供为带有@Tool
注解的方法,并在提示选项中提供它,使其对模型可用。
此外,你可以在单个提示中定义和引用多个工具。

工具调用的主要操作顺序
1
工具定义
当我们想让一个工具对模型可用时,我们在聊天请求中包含其定义。每个工具定义包括名称、描述和输入参数的模式。
2
模型工具调用
当模型决定调用工具时,它会发送一个响应,其中包含工具名称和根据定义的模式建模的输入参数。
3
工具执行
应用程序负责使用工具名称来识别并执行具有提供的输入参数的工具。
4
结果处理
应用程序处理工具调用的结果。
5
返回给模型
应用程序将工具调用结果发送回模型。
6
最终响应
模型使用工具调用结果作为额外上下文生成最终响应。
评估AI响应
有效评估AI系统对用户请求的输出对于确保最终应用的准确性和实用性非常重要。 几种新兴技术使得可以使用预训练模型本身来达到此目的。 这个评估过程涉及分析生成的响应是否符合用户的意图和查询的上下文。使用相关性、连贯性和事实正确性等指标来衡量AI生成响应的质量。 一种方法是将用户的请求和AI模型的响应一起呈现给模型,询问响应是否与提供的数据一致。 此外,利用存储在向量数据库中的信息作为补充数据可以增强评估过程,帮助确定响应的相关性。 Spring AI项目提供了一个Evaluator
API,目前提供了评估模型响应的基本策略访问。
请查阅评估测试文档以了解更多信息。
文档有误?请协助编辑
发现文档问题?点击此处直接在 GitHub 上编辑并提交 PR,帮助我们改进文档!