AI超级智能体 - 一、接入AI大模型

一、核心知识

⚠️项目源码地址: https://github.com/ruogu-coder/ruogu-ai-agent

(一) AI 大模型

1. 概念

一种超大规模参数的深度学习模型。显著特征是参数量巨大(数亿至数万亿),海量训练数据(TB 级别文本图形),依赖高性能的 GPU/TPU 集群,训练耗时长。

GPU:图形处理器,最初设计用来图形渲染,现在广泛用于并行计算,尤其是深度学习和 AI 领域。

TPU:张量处理单元,谷歌专门为机器学习定制的处理器,特定任务上的效率更高。

AI 知识库:

2. 特点

  • 超大规模参数
  • 海量训练数据
  • 强大的逻辑推理能力
  • 强大的生成能力
  • 涌现能力(模型到达一定规模后表现出新的能力,比如逻辑推理)

(二) AI 大模型的分类

(三) 关注焦点

作为一个开发,我们对 AI 大模型关注焦点不需要放到大模型的原理(如 Transformer 架构 、注意力机制或训练的细节),应该专注于:

  • 能力边界: 知识截止日期、幻觉率(看起来合理但和真实情况不符合,或者无法通过已知的知识验证)
  • 成本结构: API 单次调用单价、token 消耗
  • 工程适配度: SDK 成熟度、错误处理机制

(四) 大模型的选择

维度关键指标
功能支持多模态能力/工具集成/上下文长度/复杂指令处理
性能指标响应质量/准确性/知识时效性/并发能力处理
部署集成云API/本地部署/私有云部署
商业合规数据安全/合规认证/调用成本/数据隐私和安全
生态文档完善度/技术支持/是否可扩展

核心口诀

"三看三问"选模型:

  • 一看模态需求(文/图/音)
  • 二看数据隐私(云端/本地)
  • 三看成本结构(API/算力)

(五) 开发框架的选择

  1. LangChain4j

    1. 支持语言:java
    2. 核心特点: Java版LangChain,支持主流LLM(OpenAI/Gemini/Claude等),提供链式调用、Memory管理、工具集成。
    3. 适用场景:企业级 AI 应用开发,复杂业务逻辑集成
    4. 支持的大模型:https://docs.langchain4j.dev/integrations/language-models/
    5. 官方文档LangChain4j
  2. Spring AI

    1. 支持语言:java
    2. 核心特点: Spring生态官方AI框架,支持OpenAI、Azure、HuggingFace等,与Spring Boot无缝集成。
    3. 适用场景:企业级 AI 应用开发,Spring技术栈整合
    4. 大模型对比
    5. 官方文档Spring AI 文档
  3. Spring AI Alibaba

    1. 支持语言:java
    2. 核心特点: 阿里开源框架,深度集成通义千问、灵积等国产模型,支持RAG、函数调用。
    3. 适用场景:企业级 AI 应用开发,Spring技术栈整合,国内企业应用、阿里云生态整合
    4. 官方文档SSpring AI Alibaba GitHub

(六) 接入 AI 大模型

1. 接入方式

分类接入方法代表工具/平台适用场景特点
AI平台接入云服务商AI应用平台阿里云百炼企业级应用开发快速搭建AI解决方案一站式服务可视化配置内置行业解决方案支持模型精调
客户端桌面端Cherry Studio非技术人员快速验证原型设计零代码操作内置模板库支持多模态交互
IDE集成工具Cursor开发者日常编码辅助代码自动补全上下文感知支持私有模型部署
程序接入SDK集成DashScope SDK深度集成需求类型安全高性能支持异步调用
原生API调用OpenAI API跨语言调用灵活定制需要处理HTTP协议手动管理请求/响应
开发框架集成Spring AISpring生态项目声明式编程统一接口支持自动配置
LangChain4j复杂AI工作流支持RAG工具链整合多模型编排

2. 接入途径

接入路径实现方式使用技术/工具
☁️云服务API调用Spring AI / LangChain4j
🖥️自部署本地模型部署Ollama + Spring AI
💻客户端可视化操作Cursor / Cherry

3. 调用方式

方式适用场景优点缺点
SDK深度集成类型安全/完善的错误处理语言限制/依赖特定版本/项目体积增加
HTTP跨语言/快速验证无语言限制/灵活手动处理错误、序列化
Spring AISpring生态整合完美融合 spring 项目不支持特定模型/版本目前快速迭代
LangChain4j复杂AI应用流/RAG 应用开发复杂工作流/丰富组件和工具文档较少/学习曲线陡

4. 总结推荐

场景特征推荐路径适用调用方式典型案例
快速验证原型客户端HTTP产品演示/POC验证
企业级Spring项目云服务Spring AI电商智能客服系统
跨语言团队协作云服务HTTP多语言微服务架构
高数据隐私要求自部署SDK医疗病历分析系统
复杂AI工作流云服务LangChain4j智能合同审核平台
低成本本地推理自部署Spring AI制造业缺陷检测系统
可视化无代码开发客户端-市场部门快速搭建问答机器人
多模型组合应用云服务LangChain4j金融风控多模型决策系统

二、项目搭建

1. 环境准备

JDK 版本:17 或者 21(SpringBoot3 和 SpringAI 最低支持 JDK17)

2. 创建项目

  • 语言选择(Language):Java
  • 构建工具:maven
  • JDK:21
  • SpringBoot 版本:3.4.x
  • 依赖:Spring Web 、Lombok

3. 多环境配置

在项目的resource目录下操作:

  1. 删除原有的application.properties文件
  2. 创建application.yml文件
yaml
复制代码
spring: profiles: active: local application: name: ruogu-ai-agent server: servlet: context-path: /api
  1. 创建application-local.yml文件
yaml
复制代码
server: port: 8123
  1. 创建application-prod.yml文件
yaml
复制代码
server: port: 48080
  1. 通过修改active的值启动项目

4. 依赖整合

  1. Hutool 工具类

在 pom.xml 中添加依赖:

xml
复制代码
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.37</version> </dependency>
  1. Knife4J 接口文档

  2. 在 pom.xml 中添加依赖(选择 SpringBoot3 版本):

xml
复制代码
<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> <version>4.4.0</version> </dependency>
  1. 在 application.yml 中追加接口文档配置(注意修改packages-to-scan对应自己的controller包路径):
yaml
复制代码
# springdoc-openapi项目配置 springdoc: swagger-ui: path: /swagger-ui.html tags-sorter: alpha operations-sorter: alpha api-docs: path: /v3/api-docs group-configs: - group: 'default' paths-to-match: '/**' packages-to-scan: com.ruogu.agent.controller # knife4j的增强配置 knife4j: enable: true setting: language: zh_cn
  1. com.ruogu.agent下新建controller包,新建HealthController文件,检查knife4J是否生效:
java
复制代码
@RestController @RequestMapping("/health") public class HealthController { @GetMapping public String healthCheck() { return "ok"; } }
  1. 启动项目,访问http://localhost:8123/api/doc.html

三、调用 AI 大模型

这里是使用阿里云百炼平台, 对 Java开发生态支持好, 新建demo.invoke包,放示例代码。

1. SDK 接入

官方文档:SDK 安装指南 -> 查看最新 SDK 版本

  1. 在 pom.xml 中添加依赖:
xml
复制代码
<!-- https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dashscope-sdk-java</artifactId> <version>2.19.2</version> </dependency>
  1. 阿里云百炼平台申请一个 ApI Key:

  1. 根据官方的示例文档,通过 API 调用通义千问:

  1. 在 application-local.yml 中新增配置项:
yaml
复制代码
ruogu: ai: dash-scope: api-key: xxx enable: true model: qwen-plus
  1. 使用 SDK 调用模型完整代码:
java
复制代码
package com.ruogu.agent.demo.invoke; import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationParam; import com.alibaba.dashscope.aigc.generation.GenerationResult; import com.alibaba.dashscope.common.Message; import com.alibaba.dashscope.common.Role; import com.alibaba.dashscope.exception.ApiException; import com.alibaba.dashscope.exception.InputRequiredException; import com.alibaba.dashscope.exception.NoApiKeyException; import com.alibaba.dashscope.utils.JsonUtils; import java.util.Arrays; /** * @author ruogu * @date 2025/4/27 12:10 */ public class SdkAiInvoke { // TODO 替换为实际的密钥 private static final String API_KEY = "123"; public static GenerationResult callWithMessage() throws ApiException, NoApiKeyException, InputRequiredException { Generation gen = new Generation(); Message systemMsg = Message.builder() .role(Role.SYSTEM.getValue()) .content("You are a helpful assistant.") .build(); Message userMsg = Message.builder() .role(Role.USER.getValue()) .content("你是谁?") .build(); GenerationParam param = GenerationParam.builder() // 若没有配置环境变量,请用百炼API Key将下行替换为:.apiKey("sk-xxx") .apiKey(API_KEY) // 此处以qwen-plus为例,可按需更换模型名称。模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models .model("qwen-plus") .messages(Arrays.asList(systemMsg, userMsg)) .resultFormat(GenerationParam.ResultFormat.MESSAGE) .build(); return gen.call(param); } public static void main(String[] args) { try { GenerationResult result = callWithMessage(); System.out.println(JsonUtils.toJson(result)); } catch (ApiException | NoApiKeyException | InputRequiredException e) { // 使用日志框架记录异常信息 System.err.println("An error occurred while calling the generation service: " + e.getMessage()); } System.exit(0); } }

2. HTTP 接入

针对 SDK 不支持的编程语言,需要更灵活的控制场景,可以直接使用 HTTP 调用。

优点:跨语言/快速验证

💡 使用建议:优先使用 SDK;只有在不支持 SDK 的情况下,再考虑直接 HTTP调用。

参考官方文档

使用 AI 将 Curl 代码转换为 Java 的 HTTP 代码:

java
复制代码
package com.ruogu.agent.demo.invoke; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.hutool.log.Log; import cn.hutool.log.LogFactory; /** * @author ruogu * @date 2025/4/27 12:56 */ public class HttpAiInvoke { private static final Log log = LogFactory.get(); // API端点配置 private static final String API_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"; // TODO 替换为实际的API密钥 private static final String API_KEY = ""; public static void main(String[] args) { try { String responseContent = sendAiRequest("你是谁?"); log.info("AI回复:\n{}", responseContent); } catch (Exception e) { log.error("请求处理失败", e); } } /** * 发送AI请求并获取结果 * * @param userQuestion 用户问题 * @return AI回复内容 */ public static String sendAiRequest(String userQuestion) { // 构建请求体 JSONObject requestBody = buildRequestBody(userQuestion, "qwen-plus"); // 发送请求 HttpResponse response = HttpRequest.post(API_URL) .header("Authorization", "Bearer " + API_KEY) .header("Content-Type", "application/json") .body(requestBody.toString()) .timeout(5000) .execute(); // 4. 处理响应 if (response.getStatus() != 200) { throw new RuntimeException("API请求失败,状态码:" + response.getStatus()); } return parseResponse(response.body()); } /** * 构建请求JSON */ private static JSONObject buildRequestBody(String userQuestion, String model) { JSONArray messages = new JSONArray(); messages.add(JSONUtil.createObj() .set("role", "system") .set("content", "You are a helpful assistant.")); messages.add(JSONUtil.createObj() .set("role", "user") .set("content", userQuestion)); return JSONUtil.createObj() .set("model", model == null ? "qwen-plus" : model) .set("input", JSONUtil.createObj().set("messages", messages)) .set("parameters", JSONUtil.createObj() .set("result_format", "message")); } /** * 解析API响应 */ private static String parseResponse(String responseBody) { JSONObject responseJson = JSONUtil.parseObj(responseBody); // 根据API文档调整解析路径 return responseJson.getByPath("output.choices[0].message.content", String.class); } }

3. Spring AI

Spring AI 默认没有支持所有的大模型(尤其是国产),更多的支持 OpenAPI 的大模型的集成,可参考模型对比。我们想要使用阿里的大模型,可以使用 Spring AI Alibaba 是 Spring AI 的扩展,通过官方文档接入阿里大模型:

  1. 在 pom.xml 引入依赖:
xml
复制代码
<dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter</artifactId> <version>1.0.0-M6.1</version> </dependency>

💡注意:由于 spring-ai 相关依赖包还没有发布到中央仓库,如出现 spring-ai-core 等相关依赖解析问题,请在您项目的 pom.xml 依赖中加入如下仓库配置。

xml
复制代码
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
  1. 配置 application.yml 文件:
yaml
复制代码
spring: ai: dashscope: api-key: ${AI_DASHSCOPE_API_KEY} chat: options: model: qwen-plus

4. LangChain4j

LangChain4j 是 LangChain 的 java 版本,提供了丰富的组件和抽象层,简化与 LLM 的交互和应用。

LangChain官方是没有支持阿里大模型的,在官方文档中查询支持的模型列表:LangChain4j模型集成

Langchain 的社区版本的整合大模型包

  1. 引入 pom 依赖:
xml
复制代码
<!-- https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-community-dashscope --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-community-dashscope</artifactId> <version>1.0.0-beta2</version> </dependency>

Lanchain4j 提供了 Spring Boot Starter 方便在项目中使用可在 maven 仓库中查看最新版本,官方文档

这里因为引入了 Spring AI 所以就不在引入langchain4j-community-dashscope-spring-boot-starter

  1. 编写示例代码
java
复制代码
public class LangChainAiInvoke { private static final String API_KEY = "sk-4fe1bd815896478bb4bf76170840c678"; public static void main(String[] args) { ChatLanguageModel qwenModel = QwenChatModel.builder() .apiKey(API_KEY) .modelName("qwen-max") .build(); String answer = qwenModel.chat("你好"); System.out.println(answer); } }

四、本地部署和接入

1. 本地安装大模型

本地安装 Ollama 工具快速安装大模型。Ollama 不仅提供了友好的命令行界面,还支持通过 API 调用,方便与各种应用程序集成,参考 官方文档

  1. 下载 Ollama

根据自己的电脑系统对应安装:

  1. 下载完右键打开

  1. 安装完成后,打开终端执行 ollama --help 可以查看用法:

  1. 选择模型

我这里选择一个 deepseek,建议先选择个小模型,下载速度快,硬件要求低

执行命令:ollama run deepseek-r1:1.5b

本地访问:http://localhost:11434

2. Spring AI 调用本地大模型

Spring AI 原生支持调用 Ollama 大模型,直接参考 官方文档 编写配置和代码即可。

  1. 引入依赖
xml
复制代码
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>
  1. 填写配置 是我们刚刚下载的
yaml
复制代码
spring: ai: dashscope: api-key: sk-4fe1bd815896478bb4bf76170840c678 chat: options: model: qwen-plus ollama: base-url: http://localhost:11434 chat: model: deepseek-r1:1.5b
  1. 编写测试代码
java
复制代码
package com.ruogu.agent.demo.invoke; import jakarta.annotation.Resource; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; /*** *@author ruogu *@date 2025/4/27 17:33 * 取消注释即可在 SpringBoot 项目启动时执行 **/ @Component public class OllamaAiInvoke implements CommandLineRunner { @Resource private ChatModel ollamaChatModel; @Override public void run(String... args) throws Exception { AssistantMessage output = ollamaChatModel.call(new Prompt("你好,请问如何创建一个springboot项目")) .getResult() .getOutput(); System.out.println(output.getText()); } }

五、修复日志错误

看见控制台有红色警告就很难受,想办法给去除掉

当前情况检测到两个 SLF4J 提供商:

ch.qos.logback.classic.spi.LogbackServiceProvider

org.slf4j.simple.SimpleServiceProvider

在项目根目录打开控制台输入:mvn dependency:tree -Dincludes=org.slf4j

可以看出有两个地方引入了 slf4j:

  • dashscop-sdk-java
  • springboot-starter-web

我这里选择移除 dashscop-sdk-java 的slf4j-simple

xml
复制代码
<!-- https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dashscope-sdk-java</artifactId> <version>2.19.2</version> <exclusions> <!-- 排除冲突的SLF4J简单实现 --> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> </exclusion> </exclusions> </dependency>

然后重新启动项目,红色警告就消失了。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
若谷
下载 APP