Spring-Ai

Spring AI 对 Ollama Tool 的支持

本周早些时候,Ollama 推出 了一项令人兴奋的新功能:对大型语言模型(LLM)的工具支持。 今天,我们非常高兴地宣布 Spring AI(1.0.0-SNAPSHOT)已完全支持这一强大功能,将 Ollama 的函数调用功能引入 Spring 生态系统。 Ollama 的工具支持允许模型决定何时调用外部函数以及如何使用返回的数据。这为访问实时信息到执行复杂计算等各种可能性打开了大门。Spring AI 采用了这一概念,并将其与 Spring 生态系统无缝集成,使 Java 开发人员能够非常轻松地在其应用程序中利用这一功能。Spring AI 的 Ollama 函数调用支持的主要功能包括: 轻松集成:将 Java 函数注册为 Spring Bean,并与 Ollama 模型一起使用。 灵活配置:多种注册和配置函数的方法。 支持多种函数:在一个聊天会话中注册和使用多种函数。 运行时函数选择:动态选择为每个提示(Prompt)启用哪些函数。 代码可移植性:使用不同的 LLM 提供商(如 OpenAI、Mistral、VertexAI、Anthropic、Groq),无需修改代码即可重复使用你的应用代码。 工作原理 定义自定义 Java 函数并将其注册到 Spring AI。 执行可能需要调用函数才能完成回答的聊天请求。 当 AI 模型确定需要调用一个函数时,它会生成一个包含函数名称和参数的 JSON 对象。 Spring AI 会拦截该请求,调用你的 Java 函数,并将结果返回给模型。 该模型将函数的输出纳入其响应中。 入门 先决条件 首先需要在本地计算机上运行 Ollama(0.2.8 以上)。请参阅官方的 Ollama 项目 README,开始在本地计算机上运行模型。然后调出支持模型的工具,例如 Llama 3.1、Mistral、Firefunction v2、Command-R +。。。支持的模型列表可在 模型页面的工具类别 下找到。 ollama pull mistral 依赖 要开始在 Spring AI 中使用 Ollama 函数调用,请在项目中添加以下依赖:

使用 Redis 和 Spring AI 创建 RAG(检索增强生成)应用

1、概览 在本教程中,我们将使用 Spring AI 框架和 RAG(检索增强生成)技术构建一个 ChatBot(聊天机器人)。在 Spring AI 的加持下,我们将与 Redis Vector(向量)数据库集成,以存储和检索数据,从而增强 LLM(大型语言模型)的提示功能。一旦 LLM 接收到包含相关数据的提示,它就会有效地用自然语言生成带有最新数据的响应,以回应用户的查询。 2、RAG 是什么? LLM 是根据互联网上的大量数据集预先训练的机器学习模型。要使 LLM 在私营企业中发挥作用,我们必须根据特定组织的知识库对其进行微调。然而,微调通常是一个耗时的过程,需要大量的计算资源。此外,经过微调的 LLM 很有可能会对查询生成不相关或误导性的响应。这种行为通常被称为 LLM 幻觉(LLM Hallucinations)。 在这种情况下,RAG 是一种优秀的技术,用于限制或将 LLM 的响应置于特定上下文中。向量数据库在 RAG 架构中发挥着重要作用,为 LLM 提供上下文信息。但是,在 RAG 架构中使用矢量(向量)数据库之前,应用必须通过 ETL(提取、转换和加载)流程对其进行填充: Reader 从不同源检索组织的知识库文档。然后,Transformer(转换器)将检索到的文档分割成小块,并使用嵌入模型对内容进行矢量化。最后,Writer 将向量或 Embedding 加载到向量数据库。向量数据库是专门的数据库,可以在多维空间中存储这些 Embedding。 在 RAG 中,如果矢量数据库定期从组织的知识库中更新,那么 LLM 就能对几乎实时的数据做出响应。 一旦矢量数据库中的数据准备就绪,应用就可以使用它来检索用户查询的上下文数据: 应用将用户查询与矢量数据库中的上下文数据相结合形成提示,最后将其发送给 LLM。LLM 在上下文数据的范围内用自然语言生成回复,并将其发送回应用。 3、使用 Spring AI 和 Redis 实现 RAG Redis Stack 提供矢量搜索服务,我们将使用 Spring AI 框架与之集成,并构建一个基于 RAG 的 ChatBot(聊天机器人)应用。此外,我们还要使用 OpenAI 的 GPT-3.

Spring AI 结构化输出

1、简介 本文将带你了解如何格式化 Spring AI 的输出结构,使其更易于使用且更加直观。 2、聊天模型简介 ChatModel 接口是向 AI 模型发出提示的基本结构: public interface ChatModel extends Model<Prompt, ChatResponse> { default String call(String message) { // 忽略实现。。。 } @Override ChatResponse call(Prompt prompt); } call() 方法的作用是向模型发送消息并接收响应,仅此而已。 自然而然地,我们期望提示和响应是 String 类型。然而,现代模型的实现通常具有更复杂的结构,可以进行更精细的调整,提高模型的可预测性。例如,虽然可用的默认 call() 方法接受 String 参数,但更实用的做法是使用 Prompt。Prompt 可以包含多个消息或包括诸如 “温度” 之类的选项,以调节模型的表现力。 我们可以自动装配 ChatModel 并直接调用它。例如,如果我们的依赖中有用于 OpenAI API 的 spring-ai-openai-spring-boot-starter,那么就会自动注入 OpenAI 的实现 OpenAiChatModel。 3、结构化输出 API 要获得数据结构化的输出,Spring AI 提供了使用结构化输出 API 封装 ChatModel 调用的工具。此 API 的核心接口是 StructuredOutputConverter(结构化输出转换器): public interface StructuredOutputConverter<T> extends Converter<String, T>, FormatProvider {} 它结合了另外两个接口,第一个是 FormatProvider:

Spring AI 和 Open AI 入门

Open AI 和 Spring AI 简介 当 OpenAI 发布 ChatGPT 时,它在全球掀起了一场风暴。这是第一次有语言模型能够根据提示生成类似人类的回答。此后,OpenAI 又发布了其他几个模型,包括可以根据文字提示生成图像的 DALL-E。 Spring AI 是一个 Java 库,为与 LLM 模型交互提供了一个简单易用的接口。Spring AI 提供了与各种 LLM(如 Open AI、Azure Open AI、Hugging Face、Google Vertex、Ollama、Amazon Bedrock 等)交互的高级抽象。 本文将带你了解如何使用 Spring AI 与 Open AI 能进行交互。 首先,需要在 OpenAI 上创建账户并获取 API Key。 访问 OpenAI Platform 并创建账户。 在控制面板中,点击左侧导航菜单中的 API Keys,创建一个新的 API Key。 如果你是新用户,你可能会获得一些免费点数来使用 OpenAI API。否则,你需要购买点数才能使用 OpenAI API。 获得 API KEY 后,把它添加到环境变量 OPENAI_API_KEY 中。 export OPENAI_API_KEY=<your-api-key> 创建 Spring AI 项目 使用 Spring Initializr 创建一个新的 Spring Boot 项目。

使用 Embedding 模型和向量数据库的 Spring AI RAG

本文主要介绍以下内容: 嵌入式模型简介。 使用 DocumentReader 加载数据。 在 VectorStore 中存储 Embedding。 实现 RAG(Retrieval-Augmented Generation,检索增强生成),又名 Prompt Stuffing。 你可以在 GitHub 中找到本文的示例代码 大型语言模型(LLM),如 OpenAI、Azure Open AI、Google Vertex 等,都是在大型数据集上训练出来的。但这些模型并不是在你的私人数据上训练出来的,因此它们可能无法回答你所在领域的特定问题。但是,在你的私人数据上训练模型可能既昂贵又耗时。那么,我们该如何使用这些 LLM 来回答我们领域的特定问题呢? 其中一种方法是使用 RAG(Retrieval-Augmented Generation,检索增强生成),又称 Prompt Stuffing(提示填充)。使用 RAG,从数据存储中检索相关文档,并将其传递给 LLM 以生成答案。在这一过程中,使用嵌入模型将文档转换为 Embedding,并将其存储到向量数据库中。 了解检索增强生成(RAG) 你可能在关系数据库中存储结构化数据,在 NoSQL 数据库中存储非结构化数据,甚至在文件中存储结构化数据。你能够使用 SQL 有效地查询关系数据库,使用 NoSQL 数据库的查询语言有效地查询 NoSQL 数据库。你还可以使用 Elasticsearch、Solr 等全文搜索引擎来查询非结构化数据。 不过,你可能希望使用具有语义的自然语言检索数据。 例如,“我喜欢 Java 编程语言” 和 “Java 始终是我的首选语言” 具有相同的语义,但使用了不同的词语。尝试使用准确的词语检索数据可能不会有效。 这就是 Embedding 的作用所在。Embedding 是单词、句子或文档的向量表示。你可以通过这些 Embedding,使用自然语言检索数据。 你可以将结构化和非结构化数据转换为 Embedding,并将其存储在向量数据库中。然后,你可以使用自然语言查询向量数据库并检索相关数据。然后,你可以通过相关数据查询 AI 模型,以获得响应。 检索增强生成(RAG)是在生成响应之前,通过使用训练数据之外的额外知识库来优化 LLM 输出的过程。 Embedding API Embedding API 可以将单词、句子、文档或图像转换为 Embedding 。Embedding 是单词、句子或文档的向量表示。

Spring AI - 结构化输出

科学处理事物的片段和碎片,并假设存在连续性,而艺术则只关注事物的连续性,假设存在片段和碎片。- 罗伯特·M·皮尔西格 LLM(大型语言模型)生成结构化输出的能力对于依赖于可靠解析输出值的下游应用非常重要。开发人员希望将 AI 模型的结果快速转化为数据类型,如 JSON、XML 或 Java 类,以便传递给应用中的其他函数和方法。 Spring AI Structured Output Converter(结构化输出转换器)有助于将 LLM 输出转换为结构化格式。如下图所示,这种方法围绕 LLM 文本补全端点进行操作: 使用通用的补全 API 从大型语言模型(LLM)生成结构化输出需要对输入和输出进行仔细处理。结构化输出转换器在 LLM 调用之前和之后发挥着关键作用,确保实现所需的输出结构。 在进行 LLM 调用之前,转换器会将格式指令附加到提示中,为模型提供明确的指导,以生成所需的输出结构。这些指令充当蓝图,使模型的响应符合指定的格式。 在 LLM 调用之后,转换器会获取模型的输出文本,并将其转换为结构化类型的实例。转换过程包括解析原始文本输出,并将其映射到相应的结构化数据表示,如 JSON、XML 或特定领域(Domain)的数据结构。 注意,AI 模型不能保证按要求返回结构化输出。它可能不理解提示,也可能无法按要求生成结构化输出。 TIP: 如果你不想深入了解 API 的细节,可以过下一段,直接看 “使用转换器 ”部分。 1、结构化输出 API StructuredOutputConverter 接口定义如下: public interface StructuredOutputConverter<T> extends Converter<String, T>, FormatProvider { } 它以目标结构化类型 T 为参数,结合了 Spring Converter<String, T> 接口和 FormatProvider 接口: public interface FormatProvider { String getFormat(); } 下图说明了通过结构化输出 API 组件的数据流程。

使用最新的Mistral AI API,在 Java 和 Spring AI 中进行函数调用

领先的开源大型语言模型开发商 Mistral AI 宣布,其尖端模型新增了 函数调用 支持。 函数调用 是一种便于 LLM 与外部工具和 API 集成的功能。它使语言模型能够请求执行客户端函数,从而访问必要的运行时信息或动态执行任务。 本文将带你了解如何将 Mistral AI 的新函数调用功能与 Java 特别是 Spring AI 结合使用。 如果你对底层的 Java 客户端的详细细节不感兴趣,不想浪费时间,可以直接看 使用 Spring AI 调用函数 章节。 1、使用 Java 调用函数 如果你想使用 Java 和 Spring AI 测试最新的 Mistral AI 功能,你会发现 Mistral 不支持 Java 客户端,也还没有发布函数调用 API。 因此,我不得不通过探索他们的 JavaScript/Python 客户端来解决这个问题。下面是一个类图,说明了 API 的各个组件及其相互联系。 熟悉 OpenAI API 的人会注意到,Mistral AI 的新 API 几乎与 OpenAI API 相同,只有一些细微差别。不过,还有一个重要的限制: 在撰写本文时,Mistral AI 不支持并行函数调用,这使它与 OpenAI、Azure OpenAI 和 Vertex AI Gemini 提供的最新 LLM 模型有所不同。

Spring AI 简介

1、概览 Spring 通过 Spring AI 项目正式启用了 AI(人工智能)生成提示功能。本文将带你了解如何在 Spring Boot 应用中集成生成式 AI,以及 Spring AI 如何与模型互动。 2、Spring AI 的主要概念 首先回顾一下一些关键的领域术语和概念。 Spring AI 最初专注于处理语言输入和生成语言输出的模型。该项目的理念是为开发人员提供一个抽象接口,为将生成式 AI 作为独立组件纳入应用奠定基础。 接口 AiClient 就是这样一个抽象,它有两个基本实现:OpenAI 和 Azure OpenAI。 public interface AiClient { default String generate(String message); AiResponse generate(Prompt prompt); } AiClient 为生成函数提供了两个选项。简化版生成函数:generate(String message),使用 String 作为输入和输出,可以避免使用 Prompt 和 AiResponse 类的额外复杂性。 2.1、高级的 Prompt 和 AiResponse 在 AI 领域,Prompt(提示)是指提供给 AI 的文本信息。它由上下文和问题组成,该模型用于生成答案。 从 Spring AI 项目的角度来看,Prompt 是一个参数化 Message 列表。 public class Prompt { private final List<Message> messages; // 构造函数和其他方法 } public interface Message { String getContent(); Map<String, Object> getProperties(); MessageType getMessageType(); } Prompt 使开发人员能够对文本输入进行更多控制。Prompt 模板就是一个很好的例子,它使用预定义文本和占位符集构建。然后,可以使用传递给 Message 构造函数的 Map<String, Object> 值填充它们。