30分钟实现自己的AI聊天机器人(SpringBoot接入DeepSeek API)

前言

刚开始学习AI的时候。

我和很多Java开发一样。

每天都在看:

越看越焦虑。

感觉每个概念都很复杂。

直到后来我才发现。

自己走错了方向。

对于传统开发来说。

学习AI最好的方式不是先研究各种框架。

而是先做出一个真正能运行的AI应用。

而AI应用里最简单的是什么?

答案就是:

聊天机器人。

这一篇文章。

我就分享一下当时是如何用SpringBoot在30分钟内实现自己的第一个AI聊天机器人的。

AI聊天机器人的本质是什么

很多人第一次接触AI的时候。

会觉得:

复制代码
ChatGPT太神奇了

其实从开发角度看。

一个聊天机器人本质上只有三部分:

复制代码
用户问题
↓
Prompt
↓
大模型
↓
返回答案

说白了。

就是一次HTTP请求。

所以不要被AI吓到。

先把它当成一个普通接口服务。

很多东西反而更容易理解。

为什么不直接用网页版DeepSeek?

很多人可能会问:

既然网页版已经能聊天。

为什么还要调用API?

原因很简单。

网页版是给人使用的。

API是给程序使用的。

只有通过API。

才能:

  • 集成到自己的系统
  • 开发AI助手
  • 实现RAG知识库
  • 实现Agent
  • 实现Workflow

后面所有AI应用开发能力。

几乎都是建立在API调用之上的。

所以学会调用API。

就是传统开发者进入AI开发的第一步。

准备工作:获取你的第一个大模型API

在开始写代码之前。

首先需要一个能够调用的大模型。

目前国内外主流平台都提供开放API,例如:

  • DeepSeek
  • 阿里百炼
  • OpenAI
  • 智谱AI

这里我使用的是 DeepSeek。

原因很简单:

便宜。

对于学习阶段来说完全够用。

注册地址:(链接

注册完成后:

1、充值(10元足够练习很久)

2、创建API Key

3、保存生成的sk开头密钥

这里要特别注意:

API Key相当于银行卡密码。

千万不要提交到GitHub或者上传到公开仓库。

否则别人调用消耗的是你的余额。

创建完成后。

就可以开始编写代码了。

创建过程如下:

这里要特别注意:

API Key 相当于银行卡密码,不要上传到 GitHub 或公开仓库。

最后附上DeepSeek的接口文档地址(链接)

代码实现

请求流程

其实整个AI聊天机器人本质上就是一次HTTP调用。

理解了这一点。

后面学习Spring AI、Agent、RAG都会轻松很多。

复制代码
前端页面

↓

Controller

↓

ChatService

↓

DeepSeek API

↓

返回结果

业务代码

项目中调用,这里以Java为例,Python等其他语言同理。这里先用Http RestTemplate方式调用。是不是很熟悉呢。

完整代码我会同步上传到 GitHub。 后续 Spring AI、RAG、Agent 相关代码也会持续更新。

GitHub地址: (仓库地址)

ini 复制代码
private static final String DEEPSEEK_URL = "https://api.deepseek.com/chat/completions";  
  
private static final String SYSTEM_PROMPT = "你是一个AI助手";  
  
private final RestTemplate restTemplate;  
private final String apiKey;  
  
/** 会话 id -> 该会话的 messages 历史(第一条固定为 system) */  
private final ConcurrentHashMap<String, List<ChatMessage>> conversations = new ConcurrentHashMap<>();  
  
public ChatConversationService(RestTemplate restTemplate, @Value("${deepseek.api-key}") String apiKey) {  
    this.restTemplate = restTemplate;  
    this.apiKey = apiKey.strip();  
}  
  
public ChatResponse chat(String conversationId, String userMessage) {  
    //处理会话ID(可忽略)
    String convId = (conversationId == null || conversationId.isBlank())  
          ? UUID.randomUUID().toString()  
          : conversationId.trim();  
         
       //如果get(id)的值不存在,则把新list封装后返回,否则直接返回list (可忽略)
    List<ChatMessage> history = conversations.computeIfAbsent(convId, id -> {  
       List<ChatMessage> list = new ArrayList<>();  
       list.add(new ChatMessage("system", SYSTEM_PROMPT));  
       return list;  
    });  
  
    synchronized (history) {  
       history.add(new ChatMessage("user", userMessage));  
  
       DeepSeekChatRequest body = new DeepSeekChatRequest();  
       body.setModel("deepseek-v4-flash");  
       body.setMessages(new ArrayList<>(history));  
  
       HttpHeaders headers = new HttpHeaders();  
       headers.setContentType(MediaType.APPLICATION_JSON);  
       headers.setBearerAuth(apiKey);  
  
       HttpEntity<DeepSeekChatRequest> entity = new HttpEntity<>(body, headers);  
	  //http调用大模型接口
       DeepSeekChatResponse apiResponse = restTemplate.postForObject(  
             DEEPSEEK_URL,  
             entity,  
             DeepSeekChatResponse.class  
       );  
  
       String reply = "";  
       if (apiResponse != null  
             && apiResponse.getChoices() != null  
             && !apiResponse.getChoices().isEmpty()  
             && apiResponse.getChoices().get(0).getMessage() != null) {  
          String content = apiResponse.getChoices().get(0).getMessage().getContent();  
          reply = content != null ? content : "";  
       }  
  
       history.add(new ChatMessage("assistant", reply));  
       return new ChatResponse(reply, convId);  
    }  
}

其实整个流程总结下来只有三步:

复制代码
用户问题
↓
组装Message
↓
HTTP调用大模型
↓
返回答案

这也是后面所有AI应用的基础。

包括:

本质上都建立在这个流程之上。

运行结果

启动项目后。

发送请求:

返回:

因为我增加了会话ID的设置,系统保存了历史消息。

所以第二次提问:

模型依然能够结合上下文回答。

这也是最简单的会话记忆实现方式(这一步也可以忽略,后面会详细讲大模型记忆机制

)。

第一个版本为什么不用Spring AI

很多人看到这里可能会问:

为什么不用Spring AI?

原因很简单。

学习任何新技术。

第一步都应该先理解底层原理。

如果一上来就使用框架:

scss 复制代码
chatClient.prompt() 
	.user(question)
	.call()

虽然很方便。

但很难理解:

  • Message是什么
  • Prompt是什么
  • Token是什么
  • 请求到底发给了谁

所以我的第一版故意选择:

复制代码
RestTemplate + HTTP

直接调用模型接口。

先把整个流程跑通。

之后再引入Spring AI。

这样学习效率反而更高。

写在最后

做到这里。

其实你已经完成了自己的第一个AI应用。

虽然它还很简单。

但已经具备了:

  • 会话能力
  • Prompt能力
  • 大模型调用能力

而这也是后面所有AI项目的基础。

很多人做到这里会产生一个错觉:

复制代码
AI开发好像也没那么难

事实上。

你只是刚刚完成了:

复制代码
AI开发 = Hello World

接下来真正的学习路线通常是:

javascript 复制代码
聊天机器人
↓
Spring AI
↓
流式输出(SSE)
↓
会话记忆
↓
Function Calling
↓
RAG知识库
↓
Agent
↓
Workflow
↓
企业级AI应用

而我接下来也会按照自己的学习路径。

把这些内容一步步记录下来。

相关推荐
再吃一根胡萝卜1 小时前
从最左前缀到地址索引:我对 MySQL 索引的一次完整复盘
后端
郡杰1 小时前
Spring Boot 请求流转与 RESTful
后端
再吃一根胡萝卜2 小时前
Redis 都有哪些用处?都会用在什么地方?
后端
再吃一根胡萝卜2 小时前
分布式与分布式锁:从访问量到数据一致性
后端
再吃一根胡萝卜2 小时前
分库分表:为什么我不建议一上来就分表
后端
再吃一根胡萝卜2 小时前
MySQL 慢查询优化:从定位到根治的完整思路
后端
Nturmoils3 小时前
订单查询丢数据,查了半天原来是 WHERE 惹的祸
数据库·后端
叫我Paul就好3 小时前
自从用上 Agents View 之后, 我的心力交瘁感消失了
后端
SamDeepThinking3 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试