今天起我们开始学习利用大模型进行个人 Agent 的开发。
一、准备工作
在基于大模型构建智能体时,所有对话交互均需要通过网络请求远端大模型服务实现。而完成调用的前提是获得大模型平台颁发的身份凭证 ------API_KEY。本文以深度求索(DeepSeek)大模型开放平台为例进行讲解。
在 DeepSeek 官网完成平台注册与实名认证后,进入其 API 开放平台,在 API keys 界面创建API key 并及时复制,密钥仅在创建时显示一次,关闭页面后将无法再次查看完整密钥。

由于后续开发 Agent 需要调用 API,我们需要购买适量 token,十元已足够入门使用。
在完成 API_KEY 身份凭证配置后,我们还需要明确请求的目标地址 ,才能让智能体与云端大模型建立网络连接。这需要用到 URL(Uniform Resource Locator,统一资源定位符,俗称网络地址) ,它是是程序与大模型通信的唯一入口。
java
// DeepSeek 大模型对话接口地址
public static final String URL = "https://api.deepseek.com/chat/completions";
智能体(Java 程序)和大模型(云端服务)的交互就是数据的收发过程,但它们是完全不同的系统,无法直接交流,必须使用全行业通用的数据格式:JSON 。然而原生 Java 无法处理 JSON,为了解决这个问题,我们必须引入 Java 生态最主流的 JSON 处理工具:Jackson 库。我们需要用到三个依赖包:
jackson-databind:核心功能包(ObjectMapper、JsonNode 所在包)jackson-core:JSON 底层解析包jackson-annotations:注解支持包
将它们导入即可。
在完成身份凭证(API_KEY)、服务地址(URL)、外部依赖库(Jackson) 三大前置准备后,我们需要创建两个工具对象。
java
// JSON 序列化/反序列化核心工具
private static final ObjectMapper mapper = new ObjectMapper();
// 网络请求客户端工具
private static final HttpClient httpClient = HttpClient.newHttpClient();
ObjectMapper 是 Jackson 库的核心对象,可以实现 Java 对象与 JSON 格式的相互转换。 HttpClient 是 Java 原生的 HTTP 客户端,用于建立网络连接、发送请求并接收大模型的返回数据。
二、交互功能
完成准备工作后,我们可以着手设计交互功能。在与 AI 对话时,智能体通常能通过历史对话,即上下文记忆给出相应回答。为了使我们的自定义 Agent 拥有"短期记忆",我们可以初始化一个全局高效字符串工具 StringBuilder,用于动态拼接并存储用户与 AI 的历史对话内容,完成连贯的多轮交互。
java
static final StringBuilder stringBu = new StringBuilder();
在完成上下文记忆的载体准备后,我们首先要为大模型定义清晰的交互指令与输出规范 ,这一步正是通过提示词拼接实现的。
java
// 拼接提示词与约束规则
String input = """
用户问题:%s
规制:回答简洁明了,不要捏造数据
""".formatted(prompt);
这里采用了文本块语法,利用三引号实现多行字符串编写,并结合 formatted() 方法动态插入用户提问内容。我们在指令中严格设定了交互规则,控制大模型的输出风格和内容边界。这种固定规则模板确保了 AI 始终遵循统一标准生成回答。
之后再通过核心交互方法 chat() 完成用户输入接收、上下文拼接、大模型请求、响应解析、对话记忆更新的智能体实现自然对话交互的流程。
java
public static void chat(String prompt) throws Exception {
// 拼接提示词与约束规则
String input = """
用户问题:%s
规制:回答文件简洁明了,不要捏造数据
""".formatted(prompt);
// 将本轮用户输入追加到全局上下文,构建对话记忆
stringBu.append(input);
// 1. 构建请求参数:封装模型名称、对话上下文、生成风格等核心配置
Map<String, Object> body = new HashMap<>();
body.put("model", "deepseek-chat");
// 传入完整的历史对话上下文,让大模型理解多轮对话
body.put("messages", new Object[]{Map.of("role", "user","content",stringBu.toString() )});
body.put("temperature", 0.1); // 控制输出风格:数值越低,回答越严谨、简洁
// 2. 序列化:通过ObjectMapper将Java参数转换为JSON格式,适配大模型接口要求
String json = mapper.writeValueAsString(body);
// 3. 构建HTTP请求:绑定接口地址、身份凭证、请求体,发起POST请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(URL))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
// 4. 发送网络请求:通过HttpClient完成通信,获取大模型返回的响应数据
HttpResponse<String> resp = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// 5. 反序列化:解析JSON响应结果,提取AI生成的文本内容
JsonNode root = mapper.readTree(resp.body());
String str = root.path("choices").get(0).path("message").path("content").asText();
// 输出AI回答,并将回答追加到上下文记忆中,为下一轮对话做准备
System.out.println("AI:"+str);
stringBu.append(str);
}
该方法完整实现了带记忆能力的 AI 对话。接收用户问题后,会把历史对话一并发送给大模型,保证交互的连贯性同时依托前置初始化的核心工具,完成数据格式转换与网络通信,最终将 AI 回答输出并更新记忆库。
在智能体对接大模型的开发过程中,chat() 方法采用了标准化的代码编写范式。该实现结构清晰、通用性强,是 Java 实现 AI 对话交互的标准方案。开发者无需深入每行代码细节,只需掌握其六大核心模块的设计原理,就能快速复用这套基础代码框架。
三、对话演示
构建主函数实现持续对话:
java
public static void main(String[] args) {
// 无限循环,实现持续对话
while (true) {
try {
// 获取控制台输入
Scanner scan = new Scanner(System.in);
System.out.print("我:");
// 读取用户输入的问题
String prompt = scan.nextLine();
// 调用核心对话方法,完成AI交互
DPAgent.chat(prompt);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
对话演示:

可以看见,智能体按我们的要求进行了相应回答,并能够获取历史对话信息。然而智能体底层依赖大模型离线训练完成的静态知识库 ,其既无法主动联网获取最新信息,也未接入任何外部数据接口。因此,面对天气、实时新闻、动态数据等时效性较强的问题时,纯大模型对话智能体无法回答,这也是我们需要为智能体拓展外部工具调用能力的原因。在之后的学习中,我们将通过接入第三方实时服务等方式进一步丰富智能体的功能,使其从 "纯文本对话机器人" 升级为工具增强型智能体。