Blogs

复习智能体搭建

程序调用 AI 大模型

SDK 接入

首先需要按照官方文档安装 SDK: 安装SDK官方指南

在选择 SDK 版本时,建议在 Maven 仓库查看最新的版本号: Maven 中央仓库版本信息

  • 在 pom.xml 中引入依赖:
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dashscope-sdk-java</artifactId>
    <version>2.19.1</version>
</dependency>
  • 创建一个接口类​来存储密钥信息(在‎实际生产环境中,应‌使用配置文件或环境变量)
public interface TestApiKey {
    String API_KEY = "你的 API Key";
}
package com.example.superaiagent.demo.invoke;// 建议dashscope SDK的版本 >= 2.12.0import java.util.Arrays;  
import java.lang.System;  
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;  
  
/*  
* 阿里云灵积 AI SDK 调用  
* */  
public class SdkAiInvoke {  
    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(TestApiKey.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);  
    }  
}

HTTP 接入

  1. 对于 SD⁠K 不支持的编程语言‌或需要更灵活控制的场​景,可以直接使用 H‎TTP 请求调用 A‌I 大模型的 API
  2. 一⁠般来说,如果有官方 SDK 支持,优‌先使用 SDK;只有在不支持 SDK​ 的情况下,再考虑直接 HTTP 调用‎
  3. HTTP 调用的详细说明可参考官方文档: 通过 API 调用通义千问
package com.example.superaiagent.demo.invoke;  
  
import cn.hutool.http.HttpRequest;  
import cn.hutool.http.HttpResponse;  
import cn.hutool.json.JSONArray;  
import cn.hutool.json.JSONObject;  
  
/*  
 * 阿里云灵积 AI Http 调用  
 * */public class HttpAiInvoke {  
  
    public static void main(String[] args) {  
        // 替换为您的API密钥  
        String apiKey = TestApiKey.API_KEY;  
  
        // 构建请求URL  
        String url = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions";  
  
        // 构建请求体  
        JSONObject requestBody = new JSONObject();  
        requestBody.put("model", "qwen-plus");  
          
        // 构建messages数组  
        JSONArray messages = new JSONArray();  
          
        // system消息  
        JSONObject systemMessage = new JSONObject();  
        systemMessage.put("role", "system");  
        systemMessage.put("content", "You are a helpful assistant.");  
        messages.add(systemMessage);  
          
        // user消息  
        JSONObject userMessage = new JSONObject();  
        userMessage.put("role", "user");  
        userMessage.put("content", "你是谁?");  
        messages.add(userMessage);  
          
        requestBody.put("messages", messages);  
  
        try {  
            // 发送POST请求  
            HttpResponse response = HttpRequest.post(url)  
                    .header("Authorization", "Bearer " + apiKey)  
                    .header("Content-Type", "application/json")  
                    .body(requestBody.toString())  
                    .execute();  
  
            // 打印响应结果  
            System.out.println("响应状态码: " + response.getStatus());  
            System.out.println("响应内容: " + response.body());  
  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

Spring A‌I

  • Spring AI 默认没有支持所有的大模型(尤其是国产的),更多的是支持兼容 OpenAI API 的大模型的集成

Prompt、Agent、MCP是什么

Prompt

UserPrompt

23年 OpenAI 刚发布 ChatGPT 的时候,AI看起来还是一个聊天框,我们通过聊天框发送的消息,然后AI模型生成一个回复,我们发的信息就叫用户提示词(UserPrompt)

SystemPrompt

但是现实生活中,问每个人同一句话都可能得到不同的回复。比如我说:我饿了;爷爷奶奶可能会说:要不要煮点东西给你吃;朋友会说:别饿;女朋友会说:滚一边去,我也饿。但是AI没有这样的人设,所以只能给出一个通用的回复:饿了就吃饭。

于是我们就希望给AI也加上一个人设,最直接的方法就是把人设信息和用户要说的话打包成一条 UserPrompt 发过去,比如你说:你是我朋友,我饿了;然后AI就会回答:别饿。

但问题是,你扮演我的朋友这句话不是我们真正想说的内容,每次都要提及显得麻烦,于是我们将人设信息单独拎了出来,放在另一个Prompt里面,这就是系统提示词(SystemPrompt),像角色、性格、背景知识、语气等等这些不是直接由用户说出来的内容都可以放在 SystemPrompt 里。

每次用户发送 UserPrompt 的时候,系统会自动把 SystemPrompt 也一起发给AI模型,这样整个对话就显得更加自然了。

Agent

上面说了这么多,说到底,AI还是一个聊天机器人,你问一个问题,他也只能给你一个回复,告诉你怎么做,实际动手的还是自己,如何让AI来帮我们完成,第一个做出尝试的是 AutoGPT。

快速上手SpringAI 2.0

前面那篇1.0没用,一点用没有,还得是CSDN大佬啊

快速使用

创建项目

  • 选择创建 Spring Initializr 项目,JDK最低要求17,不可低于17

  • 依赖选择

    • SpringBoot版本需要高于3.X
  • 需要的依赖项:

    • Lombok
    • Spring Web
    • MySQL Driver
    • openAI

最终的xml文件应为:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>SpringAI_Study</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringAI_Study</name>
    <description>SpringAI_Study</description>

    <properties>
        <java.version>17</java.version>
        <spring-boot.version>3.5.3</spring-boot.version>
        <spring-ai.version>1.0.0</spring-ai.version>
    </properties>

    <!-- 添加仓库配置 -->
    <repositories>
        <repository>
            <id>maven-central</id>
            <url>https://repo1.maven.org/maven2</url>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-openai</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 关键:手动导入 BOM 管理版本 -->
    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot BOM -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Spring AI BOM -->
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

配置文件

application.yaml

快速上手SpringAI

快速入门

导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springAi_deepseek</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <!-- 明确指定Spring Boot和Spring AI版本 -->
        <spring-boot.version>3.2.0</spring-boot.version>
        <spring-ai.version>1.0.0-M5</spring-ai.version>
    </properties>

    <!-- 仓库配置:确保依赖可下载 -->
    <repositories>
        <repository>
            <id>maven-central</id>
            <url>https://repo1.maven.org/maven2</url>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <!-- Spring Boot Web Starter(版本由下方BOM管理) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 复用OpenAI Starter兼容DeepSeek(版本由Spring AI BOM管理) -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
        </dependency>

        <!-- Spring Boot Test Starter(版本由下方BOM管理) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 关键:手动导入Spring Boot和Spring AI的BOM管理版本 -->
    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot的BOM,管理所有starter的版本 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring AI的BOM,管理AI相关依赖版本 -->
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

配置文件

server.port=8899  
spring.application.name=spring-ai-deepseek-demo  
  
spring.ai.openai.api-key=sk-43745c46cd5a4d80821e998030******  
spring.ai.openai.base-url=https://api.deepseek.com  
spring.ai.openai.chat.options.model=deepseek-chat  
spring.ai.openai.chat.options.temperature=0.7
    • temperature参数用于控制生成文本的多样性。具体来说:

快速上手LangChain4j

LangChain4j入门

创建一个Maven项目

创建空项目并且导入依赖

<properties>  
    <maven.compiler.source>17</maven.compiler.source>  
    <maven.compiler.target>17</maven.compiler.target>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    <spring-boot.version>3.2.6</spring-boot.version>  
    <knife4j.version>4.3.0</knife4j.version>  
    <mybatis-plus.version>3.5.11</mybatis-plus.version>  
    <langchain4j.version>1.0.0-beta3</langchain4j.version>  
</properties>

<dependencies>
	<!-- web应用程序核心依赖 -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<!-- 编写和运行测试用例 -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<!-- 前后端分离中的后端接口测试工具 -->
	<dependency>
		<groupId>com.github.xiaoymin</groupId>
		<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
		<version>${knife4j.version}</version>
	</dependency>
</dependencies>

<dependencyManagement>
	<dependencies>
		<!--引入SpringBoot依赖管理清单-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>${spring-boot.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

配置文件

先随便写点,写个端口让他跑起来先