Spring-Ai

Spring Boot 无缝接入 DeepSeek 和通义千问

本文将带你了解如何在 Spring Boot 中使用 spring-ai 无缝接入 DeepSeek 和通义千问来构建自己的 AI 应用。 Spring & JDK 版本: springboot 3.4.3 jdk17 1、maven依赖 <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> 2、application.yaml 配置 # DeepSeek 配置,完全兼容openai配置 # spring: # ai: # openai: # base-url: https://api.deepseek.com # DeepSeek的OpenAI式端点 # api-key: sk-xxxxxxxxx # chat.options: # model: deepseek-chat # 指定DeepSeek的模型名称 # 通义千问配置 spring: ai: openai: base-url: https://dashscope.aliyuncs.com/compatible-mode # 通义千问 api-key: sk-xxxxxxxxxxx chat.options: model: qwen-plus 3、Controller package org.example.springboot3ds.controller; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.

使用 DeepSeek 模型和 Spring AI 构建 AI 聊天机器人

1、概览 现代 Web 应用越来越多地与大型语言模型(LLM)集成,以构建解决方案。 DeepSeek 是一家中国的 AI 研究公司,致力于开发功能强大的 LLM,最近凭借其 DeepSeek-V3 和 DeepSeek-R1 模型颠覆了人工智能世界。DeepSeek-V3 和 DeepSeek-R1 模型揭示了它的思维链(CoT),让我们了解了 AI 模型是如何解释和处理给定提示的。 本文将带你了解如何将 DeepSeek 模型与 Spring AI 集成,以构建一个能够进行多轮文本对话的简单聊天机器人。 2、依赖和配置 有多种方法可以将 DeepSeek 模型集成到我们的应用中。 2.1、使用 OpenAI DeepSeek 模型与 OpenAI API 完全兼容,可以使用任何 OpenAI 客户端或库进行访问。 首先,在项目的 pom.xml 文件中添加 Spring AI 的 OpenAI Starter 依赖: <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency> 由于当前的 1.0.0-M6 版本是里程碑版本,因此还需要在 pom.xml 中添加 Spring Milestones Repository: <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> 该 Repository 是发布里程碑版本的地方,而不是标准的 Maven Central Repository。无论我们选择哪种配置选项,都需要添加这个里程碑 Repository。

使用 Spring AI 和 PGVector 实现语义搜索

1、概览 搜索 是软件中的一个基本概念,目的是在大数据集中查找相关信息。它涉及在一系列项目中查找特定项目。 本文将带你了解如何使用 Spring AI、PGVector 和 Ollama 实现语义搜索。 2、基础概念 语义搜索是一种先进的搜索技术,它利用词语的含义来查找最相关的结果。要构建语义搜索应用,需要了解一些关键概念: 词嵌入(Word Embedding):词嵌入是一种词表示类型,允许具有相似含义的单词具有类似的表示形式。词嵌入将单词转换为数值向量,可以在机器学习模型中使用。 语义相似性:语义相似性是衡量两段文本在意义上相似程度的一种方法。它用于比较单词、句子或文档的含义。 向量空间模型:向量空间模型是一种数学模型,用于将文本文档表示为高维空间中的向量。在该模型中,每个单词都表示为一个向量,两个单词之间的相似度根据它们向量之间的距离来计算。 余弦相似度:余弦相似度是内积空间中两个非零向量之间的相似度量,它测量的是两个向量之间角度的余弦值。它计算向量空间模型中两个向量之间的相似度。 3、先决条件 首先,我们需要在机器上安装 Docker,以便运行 PGVector 和 Ollama。 然后,在 Spring 应用中添加 Spring AI Ollama 和 PGVector 依赖: <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId> </dependency> 还要添加 Spring Boot 的 Docker Compose 支持,以管理 Ollama 和 PGVector Docker 容器: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-docker-compose</artifactId> <version>3.1.1</version> </dependency> 除了依赖外,还要在 docker-compose.yml 文件中描述这两个服务: services: postgres: image: pgvector/pgvector:pg17 environment: POSTGRES_DB: vectordb POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - "5434:5432" healthcheck: test: [ "CMD-SHELL", "pg_isready -U postgres" ] interval: 10s timeout: 5s retries: 5 ollama: image: ollama/ollama:latest ports: - "11435:11434" volumes: - ollama_data:/root/.

Spring AI Advisor 指南

1、概览 AI 驱动的应用已成为我们的新现实。我们正在广泛实现各种 RAG 应用和提示 API,并使用 LLM 创建令人印象深刻的项目。借助 Spring AI,我们可以更快、更稳定地完成这些任务。 本文将带你了解 Spring AI Advisor 这一功能,它可以为我们处理各种常规任务。 2、Spring AI Advisor 是什么? Advisors 是在 AI 应用程序中处理请求和响应的拦截器。我们可以使用它们为提示流程设置额外的功能。例如,可以建立聊天历史、排除敏感词或为每个请求添加额外的上下文。 该功能的核心组件是 CallAroundAdvisor 接口。我们通过实现该接口来创建 Advisor 链,从而影响我们的请求或响应。Advisor 流程如下图所示: 我们会将提示(prompt)发送到一个聊天模型,该模型关联了一个 Advisor 链。在发送提示之前,链上的每个 Advisor 都会执行其 before 操作。同样,在收到聊天模型的回复之前,每个 Advisor 都会调用自己的 after 操作。 3、ChatMemoryAdvisor ChatMemoryAdvisor 是一组非常有用的 Advisor 实现。我们可以使用这些 Advisor 提供与聊天提示的交流历史,从而提高聊天回复的准确性。 3.1、MessageChatMemoryAdvisor 使用 MessageChatMemoryAdvisor,我们可以通过 messages 属性提供聊天客户端调用的聊天历史记录。我们可以将所有消息保存在 ChatMemory 实现中,并控制历史记录的大小。 示例如下: @SpringBootTest(classes = ChatModel.class) @EnableAutoConfiguration @ExtendWith(SpringExtension.class) public class SpringAILiveTest { @Autowired @Qualifier("openAiChatModel") ChatModel chatModel; ChatClient chatClient; @BeforeEach void setup() { chatClient = ChatClient.

使用 MongoDB 和 Spring AI 构建 RAG 应用

1、概览 AI(人工智能)技术的使用正成为现代开发中的一项关键技能。在本文中,我们将构建一个 RAG Wiki 应用,它可以根据存储的文档回答问题。 我们会通过 Spring AI 将应用与 MongoDB Vector 数据库 和 LLM 集成。 2、RAG 应用 当自然语言生成需要依赖上下文数据时,我们就会使用 RAG(Retrieval-Augmented Generation)应用。RAG 应用的一个关键组成部分是向量数据库(Vector Database),它在有效管理和检索这些数据方面起着至关重要的作用: 我们使用 Embedding Model 来处理源文件。Embedding Model 将文档中的文本转换为高维向量。这些向量捕捉了内容的语义,使我们能够根据上下文而不仅仅是关键词匹配来比较和检索类似的内容。然后,我们将文档存储到向量数据库。 保存文档后,我们可以通过以下方式发送提示信息: 首先,我们使用 Embedding Model 来处理问题,将其转换为捕捉其语义的向量。 接下来,进行相似性搜索,将问题的向量与存储在向量库中的文档向量进行比较。 从最相关的文档中,为问题建立一个上下文。 最后,将问题及其上下文发送给 LLM,LLM 会根据所提供的上下文构建与查询相关的回复。 3、MongoDB Atlas Search 在本教程中,我们将使用 MongoDB Atlas Search 作为我们的向量数据库。它提供的向量搜索功能可以满足我们在本项目中的需求。为了测试,我们使用 mongodb-atlas-local Docker 容器来设置 MongoDB Atlas Search 的本地实例。 创建一个 docker-compose.yml 文件: version: '3.1' services: my-mongodb: image: mongodb/mongodb-atlas-local:7.0.9 container_name: my-mongodb environment: - MONGODB_INITDB_ROOT_USERNAME=wikiuser - MONGODB_INITDB_ROOT_PASSWORD=password ports: - 27017:27017 4、依赖和配置 首先,添加必要的依赖项。由于我们的应用要提供 HTTP API,因此加入 spring-boot-starter-web 依赖:

Spring AI 与 NVIDIA LLM API

Spring AI 现在支持 NVIDIA®(英伟达™)的 大型语言模型 API,可与各种 模型 集成。通过利用 NVIDIA 的 OpenAI 兼容 API,Spring AI 允许开发人员通过熟悉的 Spring AI API 使用 NVIDIA LLM。 本文将带你了解如何配置和使用 Spring AI OpenAI 聊天客户端来连接 NVIDIA LLM API。 完整的示例代码可从 nvidia-llm GitHub 仓库获取。 SpringAI / NVIDIA 整合文档。 先决条件 创建 NVIDIA 帐户并获得足够的积分。 从 NVIDIA 提供的 LLM 模型 中选择自己喜欢的模型。如下面截图中的 meta/llama-3.1-70b-instruct。 从模型页面获取所选模型的 API Key。 依赖 首先,将 Spring AI OpenAI Starter 添加到 Maven pom.xml 中: <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> 对于 Gradle 来说,需要在 build.gradle 添加如下依赖:

Spring AI 拥抱 OpenAI 的结构化输出:增强 JSON 响应的可靠性

OpenAI 最近 推出了 一项名为 “结构化输出”(Structured Outputs)的强大功能,可确保 AI 生成的响应严格遵守预定义的 JSON Schema。这一功能大大提高了 AI 生成的内容在实际应用中的可靠性和可用性。 Spring AI(1.0.0-SNAPSHOT) 已 完全集成 了对 OpenAI 的结构化输出的支持,以一种无缝的 Spring 原生方式为 Java 开发人员带来了这一功能。 下图显示了新的结构化输出功能如何扩展 OpenAI Chat API: 注:Spring AI 已经提供了 功能强大、与模型无关的结构化输出 工具,可用于包括 OpenAI 在内的各种 AI 模型。OpenAI 结构化输出功能提供了一个额外的、一致的、但针对特定模型的解决方案,目前仅适用于 gpt-4o、gpt-4o-mini 和更高版本的模型。 OpenAI 结构化输出功能可确保 AI 模型生成的响应符合所提供的 JSON Schema。这解决了 AI 驱动的应用程序中的几个常见难题: 类型安全:不再担心缺少必填 KEY 或枚举值无效; 明确拒绝:基于安全性的模型拒绝变得可以通过编程检测到; 简化的提示:实现一致的格式化,而无需使用过于具体的 Prompt(提示)。 Spring AI 允许开发人员以最少的配置利用这一功能。接下来看看如何在 Spring 应用中使用它。 编程式配置 你可以使用 OpenAiChatOptions Builder 以编程式设置响应格式,如下所示: String jsonSchema = """ { "type": "object", "properties": { "steps": { "type": "array", "items": { "type": "object", "properties": { "explanation": { "type": "string" }, "output": { "type": "string" } }, "required": ["explanation", "output"], "additionalProperties": false } }, "final_answer": { "type": "string" } }, "required": ["steps", "final_answer"], "additionalProperties": false } """; Prompt prompt = new Prompt("how can I solve 8x + 7 = -23", OpenAiChatOptions.

Spring AI 集成 Groq - 一个运行速度极快的 AI 推理引擎

更快的信息处理速度不仅能提供信息,还能改变我们的认知和创新方式。 Spring AI 是一个强大的框架,用于将 AI 能力集成到 Spring 应用中,现在已支持 Groq - 一个运行速度极快的 AI 推理引擎,并支持工具/函数调用。 利用 Groq 的 OpenAI 兼容 API,Spring AI 通过调整其现有的 OpenAI Chat 客户端实现了无缝集成。这种方法使开发人员能够通过熟悉的 Spring AI API 利用 Groq 的高性能模型。 本文将带你了解如何配置和使用 Spring AI OpenAI 聊天客户端与 Groq 进行连接。详细信息请查阅 Spring AI Groq 文档 和相关 测试。 Groq API Key 要与 Groq 交互,你需要从 https://console.groq.com/keys 获取 Groq API Key。 依赖 将 Spring AI OpenAI Starter 添加到项目中。 <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> 对于 Gradle,在 build.gradle 中添加以下内容:

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.