前言
刚开始学习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应用的基础。
包括:
- Spring AI
- LangChain4j
- Agent
- RAG
本质上都建立在这个流程之上。
运行结果
启动项目后。
发送请求:

返回:

因为我增加了会话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应用
而我接下来也会按照自己的学习路径。
把这些内容一步步记录下来。