30分钟实现自己的AI聊天机器人(SpringBoot接入DeepSeek API)
前言
刚开始接触AI那会儿,说实话,我和不少Ja va开发者差不多。每天看到的都是
Agent
RAG
Workflow
MCP
直到后来才想明白:自己一开始就走错了方向。
学AI,尤其对传统开发来说,最好的路径不是先啃框架,而是先亲手做出一个能跑的AI应用。
聊天机器人
下面就来复盘一下,当时是怎么用SpringBoot在30分钟内,跑通第一个AI聊天机器人的。
AI聊天机器人,到底是个啥?
很多人第一次接触这类工具时,第一反应往往是:“ChatGPT太神奇了!”
但从纯开发视角来看,
聊天机器人本质上就三个环节
说白了,它其实就是一次HTTP请求。所以,
别被“AI”这俩字吓到
为什么不直接用网页版DeepSeek?
肯定会有人问:“网页版聊天那么方便,干嘛还要去调API?”
道理很简单:
网页版是给人用的,API是给程序用的。
后面所有高级的AI应用开发能力,根基都在API调用上
所以,学会调API,就是传统开发者迈入AI开发的第一步。
准备工作:搞到你的第一个大模型API
动手敲代码之前,得先有个能调的大模型。目前国内外主流平台都开放了API,比如DeepSeek、阿里百炼、OpenAI、智谱AI等。
这里选的是DeepSeek,理由特简单:便宜,学习阶段用足够了。
注册完了,需要做几件事:
- 充值(10块钱够你折腾很久)
- 创建API Key
- 保存好那个以“sk”开头的密钥
这玩意儿千万不能提交到GitHub或公开仓库里,不然别人调用,花的可都是你的钱。千万注意:
创建过程大致如下:
代码实现
请求流程
整个聊天机器人的核心,其实就是一次HTTP调用。明白这一点,后面再学Spring AI、Agent、RAG,都会轻松不少。
前端页面 → Controller → ChatService → DeepSeek API → 返回结果
业务代码
这里用Ja va来示范,Python、Go等其他语言道理都一样。先直接用RestTemplate调,是不是感觉特别熟悉?
完整代码会同步到仓库,后续Spring AI、RAG、Agent相关代码也会持续更新。
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> 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 history = conversations.computeIfAbsent(convId, id -> {
List 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 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应用的根基,包括Spring AI、LangChain4j、Agent、RAG,本质上都跑在这个流程上。
运行结果
启动项目后,发送请求:
返回:
因为加了会话ID的设置,系统记住了历史消息。所以第二次提问:
模型依然能结合上下文回答。这也是最简单的会话记忆实现方式(这一步也可以先忽略,后面会详细讲大模型的记忆机制)。
第一个版本,为什么不用Spring AI?
肯定有人会问:“现在Spring AI那么火,干嘛不用,非要自己写?”
理由很简单:
学任何新技术,第一步都得先理解底层原理。
chatClient.prompt()
.user(question)
.call()
但很难真正搞明白:Message是什么?Prompt是什么?Token是什么?请求到底发给了谁?
所以第一版故意选了
RestTemplate + HTTP
写在最后
做到这一步,其实你已经完成了自己的第一个AI应用。虽然还很基础,但已经具备了
会话能力、Prompt能力、大模型调用能力
很多人做到这里会忍不住想:“AI开发好像也没那么难嘛。”说实话,你只是刚刚完成了AI开发的
Hello World
接下来真正的学习路线通常是:
聊天机器人 → Spring AI → 流式输出(SSE) → 会话记忆 → Function Calling → RAG知识库 → Agent → Workflow → 企业级AI应用
接下来也会按照这条路径,把这些内容一步步记录下来。欢迎持续关注。