AI概念

AI模型

AI模型是用于处理和生成信息的算法,通常模拟人类认知功能。通过从大规模数据中学习模式与洞察,这些模型能够进行预测、生成文本、图像或其他输出,从而推动各行业的应用发展。

模型类型

AI模型种类繁多,各适配特定应用场景。尽管ChatGPT及其生成式AI能力因文本输入输出而广受关注,但许多模型和公司提供了多样化的输入输出形式。在ChatGPT之前,文本生成图像模型(如Midjourney和Stable Diffusion)已引发广泛兴趣。

以下表格根据输入输出类型对模型分 在这里插入图片描述

Spring AI支持的模型

Spring AI目前支持处理语言、图像和音频 输入输出的模型。表格最后一行(文本输入输出数值)通常称为文本嵌入(Embedding) ,表示AI模型内部的数据结构。Spring AI已支持嵌入技术以实现更高级的用例。

预训练模型的优势

以GPT(Chat Generative Pre-trained Transformer)为代表的模型因其预训练(Pre-trained)特性而脱颖而出。预训练使AI成为通用开发工具,开发者无需深厚的机器学习或模型训练背景即可使用。

提示(Prompts)

提示是指导AI模型生成特定输出的语言输入基础 。对于熟悉ChatGPT的用户,提示可能看似只是输入到对话框中的文本,但其内涵远不止于此。在许多AI模型中,提示文本并非简单的字符串。

以ChatGPT的API为例,提示包含多个文本输入,每个输入被赋予不同角色:

  • 系统角色(System Role) :定义模型的行为和交互上下文(如“你是一个友好的助手”)。
  • 用户角色(User Role) :通常为用户的输入内容。

设计有效提示既是艺术也是科学。与SQL等结构化查询语言不同,与AI模型的交互更接近人与人的对话 ,需通过自然语言引导模型生成期望结果。

  • 重要性:提示工程已成为独立学科,涌现了大量提升提示效果的技术。精心设计的提示可显著优化输出质量。
  • 实践与研究:提示共享成为社区实践,学术界也在积极研究这一领域。例如,研究发现以“深呼吸并逐步解决问题”开头的提示效果显著,凸显了语言表达的关键性。

提示模板(Prompt Templates)

有效提示的创建需结合上下文定义 和动态替换用户输入 。Spring AI通过开源库StringTemplate 实现模板化管理。

示例模板 :

讲一个{形容词}的关于{内容}的笑话。  

在Spring AI中,提示模板类似Spring MVC架构中的“视图”:

  • 提供java.util.Map对象填充占位符(如形容词和内容)。
  • 渲染后的字符串作为提示内容传递给AI模型。

提示的数据格式已从简单的字符串发展为多消息结构 ,每条消息代表不同角色(如系统、用户、工具调用)。这种结构化设计增强了模型对复杂交互的处理能力。

嵌入(Embeddings)

嵌入是文本、图像或视频的数值表示,能够捕捉输入数据之间的关联。 其工作原理是将文本、图像和视频转换为浮点数数组(即向量),这些向量旨在捕获原始数据的语义。向量的长度称为维度 ,例如一个嵌入向量可能是768维或1536维。

在这里插入图片描述

通过计算两个文本向量表示之间的数值距离(如余弦相似度或欧氏距离),应用程序可判断生成这些向量的对象之间的相似性。

Java开发者视角

作为探索AI的Java开发者,无需深入理解嵌入背后的复杂数学理论或具体实现。仅需了解其在AI系统中的作用与功能 ,尤其在集成AI功能时。

实际应用与语义空间

嵌入在检索增强生成(RAG)等场景中至关重要。它们将数据表示为 语义空间 中的点,类似于欧几里得几何的2D空间,但维度更高:

  • 语义空间特性 :
    • 点之间的接近性反映语义相似性(如相似主题的句子在空间中位置更近)。
    • 例如,在文本分类中,嵌入可将“猫”和“狗”映射到相邻区域,而“汽车”则可能位于更远的位置。
  • 应用场景 :
    • 文本分类 :通过向量聚类识别相似内容。
    • 语义搜索 :返回与查询意图最接近的结果。
    • 产品推荐 :基于用户行为嵌入推荐关联商品。

令牌(Tokens)

令牌是AI模型处理和生成文本的基本单元。

  • 输入阶段 :模型将单词转换为令牌。
  • 输出阶段 :令牌被转换回单词。 在英语中,一个令牌约等于3/4个单词。例如,莎士比亚全集约90万单词,对约120万个令牌。

在这里插入图片描述

令牌与成本

在托管AI模型中,令牌数量直接决定费用 。输入和输出的令牌总数均会计入成本。

令牌限制与上下文窗口

模型对单次API调用处理的令牌数量设有上限,称为上下文窗口 。超出限制的文本将被截断。

示例 :

  • ChatGPT-3:4K令牌
  • GPT-4:8K、16K、32K选项
  • Anthropic的Claude:100K令牌
  • Meta最新研究模型:1M令牌

处理长文本的策略

若需处理长文本(如莎士比亚全集),需通过分块(chunking)等工程策略将数据分割为符合模型上下文窗口的片段。Spring AI项目提供了相关工具支持此任务。

结构化输出(Structured Output)

传统上,AI模型的输出以java.lang.String形式返回,即使请求JSON格式的响应也是如此。尽管输出可能是有效的JSON,但它本质上仍是一个字符串,而非结构化的数据结构。此外,通过提示词请求“JSON格式”并不能保证100%的准确性。

这一复杂性催生了一个专门领域:通过精心设计的提示词生成目标输出,并将原始字符串转换为可集成到应用程序中的结构化数据 。

结构化输出转换器架构

结构化输出转换依赖精心设计的提示词 ,通常需要多次与模型交互以实现期望的格式。例如: 在这里插入图片描述

  • 转换器会将预定义的输出格式(如JSON Schema)附加到提示词中,引导模型生成结构化结果。
  • 若模型未能按预期输出,可能需要通过多轮迭代调整提示词或采用约束解码(Constrained Decoding)技术。

核心挑战与解决方案

  • 挑战 :模型可能忽略格式指令或生成不合规的结构。
  • 解决方案 :
    • 使用输出解析器 (如Spring AI的StructuredOutputConverter)将原始响应转换为Java对象。
    • 通过提示工程 明确约束条件(如JSON Schema),提升生成结果的可靠性。

将数据与API引入AI模型

如何让AI模型掌握其未受训的数据? 需注意,GPT 3.5/4.0的数据集更新截止到2021年9月。因此,模型对涉及该日期后的信息会回答“未知”。有趣的是,该数据集规模约为650GB。

三种定制模型的技术

  • 微调(Fine Tuning) 传统机器学习方法,通过调整模型内部权重适配特定数据。但对大型模型(如GPT)而言,此过程对机器学习专家极具挑战且资源消耗巨大,部分模型甚至不开放此功能。
  • 提示填充(Prompt Stuffing) 更实用的替代方案,将外部数据嵌入到模型的输入提示(Prompt)中。由于模型存在上下文窗口限制,需通过技术(如分块)在窗口内呈现关键数据。此方法俗称“填塞提示”,Spring AI库通过**检索增强生成(RAG)**简化其实施。
  • 工具调用(Tool Calling) 通过注册自定义工具(如API服务),将大语言模型与外部系统连接。Spring AI大幅减少了支持工具调用所需的代码量。 核心机制与挑战

检索增强生成(Retrieval Augmented Generation, RAG)

检索增强生成(RAG) 是一种新兴技术,旨在解决将相关数据整合到提示中以提升AI模型响应准确性的挑战。

RAG的核心流程

  • ETL(提取、转换、加载)管道
    • 批量处理模式 :从原始文档中读取非结构化数据,经过转换后存入向量数据库。
    • 关键作用 :向量数据库用于RAG的检索阶段,能够高效匹配相似内容。
  • 文档分割的关键步骤
    • 语义边界保留 : 避免在段落、表格或代码方法中间分割文档,确保内容完整性。
    • 分块大小控制 : 每个分块的大小需控制在模型上下文窗口的较小比例内(如10-20%的令牌限制)。

用户输入处理阶段 当用户提问时,RAG会执行以下操作:

  • 从向量数据库中检索与问题相关的文档片段。
  • 将问题与检索到的文档片段共同注入提示(Prompt),发送给AI模型生成响应。

Spring AI中的RAG实现

在这里插入图片描述

  • ETL管道 : 详细说明如何从数据源提取数据、转换为优化格式,并存储到向量数据库,确保高效检索。
  • ChatClient与RAG : 通过 QuestionAnswerAdvisor 实现RAG能力,动态检索外部数据并增强生成结果。

工具调用(Tool Calling)

大型语言模型(LLMs)在训练后参数被冻结,导致其知识无法更新,且无法直接访问或修改外部数据。 工具调用机制 通过以下方式解决这些问题:

  • 允许将自定义服务注册为工具,连接LLMs到外部系统的API。
  • 为LLMs提供实时数据访问能力,并代其执行数据处理操作。

Spring AI大幅简化了工具调用的代码实现:

  • 通过@Tool注解标记工具方法,并在提示选项中声明工具即可供模型使用。
  • 支持在单个提示中定义并引用多个工具。

在这里插入图片描述

工具调用的核心流程

  • 工具定义 :在聊天请求中包含工具定义(名称、描述、输入参数模式)。
  • 模型决策 :模型根据需求选择调用工具,并返回工具名称及符合模式的输入参数。
  • 应用执行 :应用通过工具名称识别并执行对应操作,传入参数。
  • 结果处理 :应用将工具调用结果返回给模型。
  • 最终响应 :模型结合工具结果生成最终回答。