亲爱的技术同仁们,大家好!近期AI agent技术风靡一时,不管是正在准备毕业设计还是从事Web开发的朋友,想必都希望能提高工作效率。今天我想和大家分享一下Spring AI agent的一些实用技巧。

温馨提示:本文阅读时长约6分钟,作者亲测有效(虽然为此熬了几个通宵)。各位精神股东,大家好。最近AI agent爆火,相信做毕业设计,web开发的股东们,都希望自己不被爆肝,借此机会,谈一谈spring ai agent的一小部分。推荐阅读时间:6分钟,作者,已经爆肝好几天了。


一,前期准备(新手必看)

1.1:环境配置

1.1.1 环境要求:

  • JDK:推荐使用17及以上版本(不推荐Java8)
  • Spring Boot:3.4.x及以上版本

1.1.2 开发工具:

  • 推荐使用VSCode(开源编辑器)
  • 需安装Java相关插件:在插件市场中搜索"Java"并安装所有相关插件即可 1.1.1:JDK17及以上版本(别用Java8 ​​Spring Boot 3.4.x​​以上版本)
    1.1.2:VScode(开源编辑工具可以满足需求),记得安装java相关插件,在插件栏直接搜索java全部安装即可

1.2:准备API

强调,大模型API随便用(只要spring ai支持,不局限本篇文章)

1.2.1:在 :博客提到,智谱大模型新用户免费送token,如果用完了,也没事,还是可以demo;同样的我们接入deepseek也需要API。
1.2.2:点击进入deepseekAPI平台deepseek同样的,新用户送token,可以随便demo。

1.3:项目初始化:

芜湖,利用国内加速站start.spring.io启动
点击create创建压缩包,之后进行解压,利用你的vscode打开
你好

项目结构如下所示:

  • demo文件夹下创建两个.java文件
  • resources文件夹下配置application.yml文件

请注意文件路径的正确性。项目结构如下所示:记得在demo这个文件夹下面创建两个.java文件哦,还有resources文件夹下的application.yml,不要搞错咯,股东们。
在这里插入图片描述

二、进入代码环节

2.1:pom.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>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.5.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
		<spring-ai.version>1.0.0</spring-ai.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
        <!-- 智谱AI -->
		<dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-zhipuai</artifactId>
        </dependency>
		<!-- 深度求索 -->
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-starter-model-deepseek</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>


	<dependencyManagement>
		<dependencies>
			<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>
			</plugin>
		</plugins>
	</build>

</project>

请注意!!!!如果你们选择其他大模型,请修改如下pom代码

<dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-yourmodel</artifactId>
        </dependency>
		<!-- 深度求索 -->
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-starter-model-yourmodel</artifactId>
		</dependency>

2.2:appication.yml文件预览

代码如下(示例):

spring:
  application:
    name: mcp
  ai:
    deepseek:
      api-key: your_api_key
      chat:
        enabled: true
        options:
          model: deepseek-chat
          temperature: 0.7
    zhipuai:
      api-key: your_api_key
      chat:
        enabled: true
        options:
          model: glm-4-plus
          temperature: 0.7
    


server:
  port: 8080


重要提示:请将"your_api_key"替换为你的实际API密钥,并将模型名称更改为对应的大模型。例如,若使用OpenAI的API密钥,应将model替换为"openai"。

2.3:Application.java文件预览

package com.example.demo;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@SpringBootApplication
@Configuration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    // 配置Orchestrator专用的AI模型(deepseek)
    @Bean
    public ChatClient orchestratorClient(DeepSeekChatModel deepSeekChatModel) {
        return ChatClient.create(deepSeekChatModel);
    }

    // 配置Worker专用的AI模型(zhipuai)
    @Bean
    public ChatClient workerClient(ZhiPuAiChatModel zhiPuAiChatModel) {
        return ChatClient.create(zhiPuAiChatModel);
    }

    @Bean
    public CommandLineRunner commandLineRunner(
        @Qualifier("orchestratorClient") ChatClient orchestratorClient,
        @Qualifier("workerClient") ChatClient workerClient
    ) {
        return args -> {
            OrchestratorWorkers agent = new OrchestratorWorkers(orchestratorClient, workerClient);
            
            // 示例任务
            String task = "如何让我的CSDN博客获取更多流量,谈一谈你的看法";
            
            // 处理任务
            OrchestratorWorkers.FinalResponse response = agent.process(task);
            
            // 打印模型使用信息
            System.out.println("\n=== 模型使用报告 ===");
            System.out.println("编排器模型: " + response.orchestratorModel());
            System.out.println("工作单元模型: " + response.workerModel());
            
            // 打印任务执行详情
            System.out.println("\n=== 任务执行详情 ===");
            response.taskDetails().forEach(detail -> 
                System.out.printf(
                    "[任务类型: %s]\n描述: %s\n使用模型: %s\n输出:\n%s\n\n",
                    detail.taskType(),
                    detail.taskDescription(),
                    detail.modelUsed(),
                    detail.response()
                )
            );
        };
    }
}	

同样的,也需要注意,根据自己选择的大模型进行修改


// 配置Orchestrator专用的AI模型(deepseek)
    @Bean
    public ChatClient orchestratorClient(YourmodleChatModel yourmodleChatModel) {
        return ChatClient.create(yourmodleChatModel);
    }

    // 配置Worker专用的AI模型(zhipuai)
    @Bean
    public ChatClient workerClient(YourmodleChatModel yourmodleChatModel) {
        return ChatClient.create(yourmodleChatModel);
    }

2.4:OrchestratorWorkers.java文件预览

package com.example.demo;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.util.Assert;

public class OrchestratorWorkers {

    private final ChatClient orchestratorClient;
    private final ChatClient workerClient;
    private final String orchestratorPrompt;
    private final String workerPrompt;

    public static final String DEFAULT_ORCHESTRATOR_PROMPT = """
            分析任务并将其分解为1-3种不同的方法:
            
            任务: {task}
            
            请使用以下JSON格式返回响应:
            \\{
            "analysis": "解释你对任务的理解以及不同方法的价值,重点说明每种方法如何服务任务的不同方面",
            "tasks": [
                \\{
                "type": "正式",
                "description": "撰写精确、技术性强的版本,强调规范要求"
                \\},
                \\{
                "type": "对话式",
                "description": "撰写引人入胜、友好的版本,与读者建立联系"
                \\}
            ]
            \\}
            """;

    public static final String DEFAULT_WORKER_PROMPT = """
            根据以下要求生成内容:
            原始任务: {original_task}
            风格类型: {task_type}
            详细说明: {task_description}
            """;

    public static record Task(String type, String description) {
    }

    public static record OrchestratorResponse(String analysis, List<Task> tasks) {
    }

    // 最终响应结构
    public static record FinalResponse(
        String analysis, 
        List<String> workerResponses,
        String orchestratorModel,  // 编排器模型名称
        String workerModel,        // 工作单元模型名称
        List<TaskExecutionInfo> taskDetails // 任务执行详情
    ) {}
    
    // 任务执行详情记录
    public static record TaskExecutionInfo(
        String taskType,
        String taskDescription,
        String modelUsed,  // 记录执行该任务的模型
        String response
    ) {}

    public OrchestratorWorkers(ChatClient orchestratorClient, ChatClient workerClient) {
        this(orchestratorClient, workerClient, DEFAULT_ORCHESTRATOR_PROMPT, DEFAULT_WORKER_PROMPT);
    }

    public OrchestratorWorkers(
        ChatClient orchestratorClient, 
        ChatClient workerClient,
        String orchestratorPrompt, 
        String workerPrompt
    ) {
        Assert.notNull(orchestratorClient, "编排器的 ChatClient 不能为空");
        Assert.notNull(workerClient, "工作单元的 ChatClient 不能为空");
        Assert.hasText(orchestratorPrompt, "编排器提示词不能为空");
        Assert.hasText(workerPrompt, "工作单元提示词不能为空");

        this.orchestratorClient = orchestratorClient;
        this.workerClient = workerClient;
        this.orchestratorPrompt = orchestratorPrompt;
        this.workerPrompt = workerPrompt;
    }

    public FinalResponse process(String taskDescription) {
        Assert.hasText(taskDescription, "任务描述不能为空");

        // 获取模型名称
        String orchestratorModel = extractModelName(this.orchestratorClient);
        String workerModel = extractModelName(this.workerClient);
        
        System.out.println("=== 编排器使用模型: " + orchestratorModel + " ===");
        System.out.println("=== 工作单元使用模型: " + workerModel + " ===");

        // 步骤1: 使用Orchestrator AI分解任务
        OrchestratorResponse orchestratorResponse = this.orchestratorClient.prompt()
                .user(u -> u.text(this.orchestratorPrompt)
                        .param("task", taskDescription))
                .call()
                .entity(OrchestratorResponse.class);
        if(orchestratorResponse == null) {
            throw new RuntimeException("编排器响应为空");
        }
        System.out.println(String.format("\n=== ORCHESTRATOR OUTPUT ===\n分析: %s\n\n任务: %s\n",
                orchestratorResponse.analysis(), orchestratorResponse.tasks()));

        // 执行子任务并记录模型信息
        List<TaskExecutionInfo> taskDetails = orchestratorResponse.tasks().stream()
            .map(task -> {
                String response = this.workerClient.prompt()
                    .user(u -> u.text(this.workerPrompt)
                        .param("original_task", taskDescription)
                        .param("task_type", task.type())
                        .param("task_description", task.description()))
                    .call()
                    .content();
                
                return new TaskExecutionInfo(
                    task.type(),
                    task.description(),
                    workerModel, // 记录使用的模型
                    response
                );
            }).collect(Collectors.toList());

        // 提取所有工作单元响应
        List<String> workerResponses = taskDetails.stream()
            .map(TaskExecutionInfo::response)
            .collect(Collectors.toList());

        System.out.println("\n=== WORKER OUTPUT ===\n" + workerResponses);

        return new FinalResponse(
            orchestratorResponse.analysis(),
            workerResponses,
            orchestratorModel,
            workerModel,
            taskDetails
        );
    }

    // 从ChatClient提取模型名称
    private String extractModelName(ChatClient chatClient) {
        try {
            // 通过反射获取底层的ChatModel
            Field chatModelField = ChatClient.class.getDeclaredField("chatModel");
            chatModelField.setAccessible(true);
            ChatModel chatModel = (ChatModel) chatModelField.get(chatClient);
            
            // 尝试调用getModel()方法获取模型名称
            Method getModelMethod = chatModel.getClass().getMethod("getModel");
            return (String) getModelMethod.invoke(chatModel);
        } catch (Exception e) {
            System.err.println("无法获取模型名称: " + e.getMessage());
            return "unknown-model";
        }
    }
}

三:启动

3.1.1:打开Application,点击Debug,启动

你好

3.1.2:效果如下:

1. 首先,审视你向大模型提出的问题,可以根据各位的需求进行灵活调整

你好

2:查看DeepSeek和智谱API的最新变动,确认是否已全面接入两个大模型。

智谱:

你好

deepseek:

你好

开始启动

你好

表现令人满意。

**一、内容优化**

1. **专业性保障**:确保博文内容具备高度的专业性和准确性,避免误导读者。在撰写技术文章时,应进行充分调研,引用 权威资料,并辅以个人实践心得。

2. **结构化排版**:采用清晰的标题层级、合理的段落划分以及突出重点的标记方式(如加粗、斜体、列表等),提升阅读 体验。

3. **原创性坚持**:坚持原创内容输出,避免简单复制粘贴。对于必须引用的内容,应注明出处,尊重知识产权。

4. **时效性更新**:紧跟行业动态,定期更新博文,保持内容的新鲜度和相关性。

**二、SEO策略**

1. **关键词优化**:深入研究目标受众的搜索习惯,合理嵌入相关关键词。标题、摘要、正文及标签中均应巧妙融入关键词 ,但需避免过度堆砌。

2. **描述标签完善**:充分利用文章描述标签,简洁明了地概括文章主旨,提高搜索引擎的抓取效率。

3. **内部链接构建**:在博文中适当添加指向其他相关文章的内部链接,形成良好的信息网络,提升页面权重。

4. **移动端适配**:确保博客模板对移动端友好,适应不同设备的访问需求,优化移动搜索排名。

**三、用户互动**

1. **评论区管理**:积极回应读者评论,营造活跃的讨论氛围。对于建设性意见,及时采纳并反馈,提升用户参与感。     

2. **问答互动**:利用CSDN的问答平台,解答相关问题并附上博客链接,引流潜在读者。

3. **读者调研**:定期开展读者满意度调查,了解用户需求,调整内容方向,增强用户粘性。

**四、平台推广**

1. **社交媒体引流**:利用微博、微信、知乎等社交媒体平台,分享博客链接,扩大曝光度。

2. **技术社区参与**:积极参与CSDN及其他技术社区的讨论,分享专业知识,顺带推广个人博客。

3. **合作互推**:与其他博主建立合作关系,通过互相推荐博文,实现资源共享和流量互通。

4. **平台活动参与**:积极参加CSDN举办的各种线上线下活动,提升个人及博客的知名度。

综上所述,提升CSDN博客流量需多管齐下,综合运用内容优化、SEO策略、用户互动及平台推广等手段。唯有坚持规范操作, 持续输出高质量内容,方能实现博客流量的稳步增长,进而打造具有影响力的个人技术品牌。, 嘿,你好呀!? 最近在捣鼓你的CSDN博客呢?是不是在头疼怎么才能吸引更多小伙伴来围观呀?别急,咱们一起来聊聊,看看有哪些小妙招能帮到你!    

### ? 1. 内容为王,质量先行
首先啊,得说说内容。你知道吗,高质量的内容就像是磁铁,能把读者牢牢吸住。试着写一些**原创的、有深度的技术文章**,分享你的独到见解或者实战经验。比如,你可以写写最近遇到的一个技术难题,是怎么一步步解决掉的。这样不仅展示你的实力,还能帮到有同样困惑的小伙伴。

### ? 2. 标题吸睛,引人入胜
标题可是文章的门面!一个有趣、有料的标题能瞬间抓住读者的眼球。比如,你可以用“震惊!Python还能这样用!”或者“小 白也能看懂的机器学习入门指南”这样的标题。当然啦,标题党可不行,内容得实打实地匹配上哦。

### ? 3. SEO优化,提升曝光
SEO(搜索引擎优化)可是个神器!通过优化关键词、标签和描述,能让你的文章在搜索引擎中排名更高,更容易被大家找到 。比如,你可以在文章中自然地插入一些热门关键词,像“Python教程”、“前端开发技巧”等等。

### ? 4. 互动交流,建立社群
博客不是孤岛,互动很重要!你可以多回复读者的评论,和他们聊聊技术心得,甚至可以建个微信群或者QQ群,把志同道合的小伙伴聚集起来。这样不仅能增加粉丝黏性,还能激发更多的创作灵感。

### ? 5. 多渠道推广,扩大影响力
别只守着CSDN哦,多渠道推广也很重要!你可以把文章分享到朋友圈、技术论坛、知乎等平台,甚至可以考虑在B站做个视频 讲解。多管齐下,流量自然就上来了。

### ? 6. 定期更新,保持活跃
保持一定的更新频率也很关键。你可以制定一个简单的写作计划,比如每周至少更新一篇。这样不仅能保持博客的活跃度,还能让读者养成定期来你博客的习惯。

### ? 7. 举办活动,吸引关注
偶尔搞搞小活动也挺有意思的。比如,你可以举办一个技术问答比赛,或者送送小礼品,吸引更多人来参与和关注。        

怎么样,这些小建议对你有没有启发呀?? 记住,坚持和用心才是最重要的!慢慢来,一步一个脚印,你的博客一定会越来越火的!加油哦~ ?

如果你还有啥疑问或者想深入聊聊,随时欢迎来找我哦!???]

=== 模型使用报告 ===
编排器模型: unknown-model
工作单元模型: unknown-model

=== 任务执行详情 ===
[任务类型: 正式]
描述: 撰写精确、技术性强的版本,强调规范要求
使用模型: unknown-model
输出:
**关于提升CSDN博客流量的策略分析**

在当今信息爆炸的时代,拥有一个高流量的技术博客对于个人品牌塑造及知识分享具有重要意义。针对如何有效提升CSDN博客的流量,本文将从内容优化、SEO策略、用户互动及平台推广四个方面进行详细阐述,旨在提供一套系统化、规范化的操作指 南。

**一、内容优化**

1. **专业性保障**:确保博文内容具备高度的专业性和准确性,避免误导读者。在撰写技术文章时,应进行充分调研,引用 权威资料,并辅以个人实践心得。

2. **结构化排版**:采用清晰的标题层级、合理的段落划分以及突出重点的标记方式(如加粗、斜体、列表等),提升阅读 体验。

3. **原创性坚持**:坚持原创内容输出,避免简单复制粘贴。对于必须引用的内容,应注明出处,尊重知识产权。

4. **时效性更新**:紧跟行业动态,定期更新博文,保持内容的新鲜度和相关性。

**二、SEO策略**

1. **关键词优化**:深入研究目标受众的搜索习惯,合理嵌入相关关键词。标题、摘要、正文及标签中均应巧妙融入关键词 ,但需避免过度堆砌。

2. **描述标签完善**:充分利用文章描述标签,简洁明了地概括文章主旨,提高搜索引擎的抓取效率。

3. **内部链接构建**:在博文中适当添加指向其他相关文章的内部链接,形成良好的信息网络,提升页面权重。

4. **移动端适配**:确保博客模板对移动端友好,适应不同设备的访问需求,优化移动搜索排名。

**三、用户互动**

1. **评论区管理**:积极回应读者评论,营造活跃的讨论氛围。对于建设性意见,及时采纳并反馈,提升用户参与感。     

2. **问答互动**:利用CSDN的问答平台,解答相关问题并附上博客链接,引流潜在读者。

3. **读者调研**:定期开展读者满意度调查,了解用户需求,调整内容方向,增强用户粘性。

**四、平台推广**

1. **社交媒体引流**:利用微博、微信、知乎等社交媒体平台,分享博客链接,扩大曝光度。

2. **技术社区参与**:积极参与CSDN及其他技术社区的讨论,分享专业知识,顺带推广个人博客。

3. **合作互推**:与其他博主建立合作关系,通过互相推荐博文,实现资源共享和流量互通。

4. **平台活动参与**:积极参加CSDN举办的各种线上线下活动,提升个人及博客的知名度。

综上所述,提升CSDN博客流量需多管齐下,综合运用内容优化、SEO策略、用户互动及平台推广等手段。唯有坚持规范操作, 持续输出高质量内容,方能实现博客流量的稳步增长,进而打造具有影响力的个人技术品牌。

[任务类型: 对话式]
描述: 撰写引人入胜、友好的版本,与读者建立联系
使用模型: unknown-model
输出:
嘿,你好呀!? 最近在捣鼓你的CSDN博客呢?是不是在头疼怎么才能吸引更多小伙伴来围观呀?别急,咱们一起来聊聊,看看有哪些小妙招能帮到你!

### ? 1. 内容为王,质量先行
首先啊,得说说内容。你知道吗,高质量的内容就像是磁铁,能把读者牢牢吸住。试着写一些**原创的、有深度的技术文章**,分享你的独到见解或者实战经验。比如,你可以写写最近遇到的一个技术难题,是怎么一步步解决掉的。这样不仅展示你的实力,还能帮到有同样困惑的小伙伴。

### ? 2. 标题吸睛,引人入胜
标题可是文章的门面!一个有趣、有料的标题能瞬间抓住读者的眼球。比如,你可以用“震惊!Python还能这样用!”或者“小 白也能看懂的机器学习入门指南”这样的标题。当然啦,标题党可不行,内容得实打实地匹配上哦。

### ? 3. SEO优化,提升曝光
SEO(搜索引擎优化)可是个神器!通过优化关键词、标签和描述,能让你的文章在搜索引擎中排名更高,更容易被大家找到 。比如,你可以在文章中自然地插入一些热门关键词,像“Python教程”、“前端开发技巧”等等。

### ? 4. 互动交流,建立社群
博客不是孤岛,互动很重要!你可以多回复读者的评论,和他们聊聊技术心得,甚至可以建个微信群或者QQ群,把志同道合的小伙伴聚集起来。这样不仅能增加粉丝黏性,还能激发更多的创作灵感。

### ? 5. 多渠道推广,扩大影响力
别只守着CSDN哦,多渠道推广也很重要!你可以把文章分享到朋友圈、技术论坛、知乎等平台,甚至可以考虑在B站做个视频 讲解。多管齐下,流量自然就上来了。

### ? 6. 定期更新,保持活跃
保持一定的更新频率也很关键。你可以制定一个简单的写作计划,比如每周至少更新一篇。这样不仅能保持博客的活跃度,还能让读者养成定期来你博客的习惯。

### ? 7. 举办活动,吸引关注
偶尔搞搞小活动也挺有意思的。比如,你可以举办一个技术问答比赛,或者送送小礼品,吸引更多人来参与和关注。        

怎么样,这些小建议对你有没有启发呀?? 记住,坚持和用心才是最重要的!慢慢来,一步一个脚印,你的博客一定会越来越火的!加油哦~ ?

如果你还有啥疑问或者想深入聊聊,随时欢迎来找我哦!???






最后看一下各大模型的使用情况

deepseek从8次增加一次,9次

在这里插入图片描述

智谱,余额也变了。

你好

最后,看到余额变化证明我们调用了两个AI大模型,这次实验也是以成功结尾。

请注意:本演示仅为示例,旨在展示不同大模型的能力差异与适用场景。实际生产中,自己的Agent请根据需求选择合适的模型。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐