Agent入门开发

今天起我们开始学习利用大模型进行个人 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);
        }
    }
}

对话演示:

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

相关推荐
0xDevNull20 小时前
Java十道高频面试题(二)
java·开发语言
java1234_小锋20 小时前
Spring AI 2.0 开发Java Agent智能体 - 会话记忆(Chat Memory)
java·人工智能·spring
Sylvia33.20 小时前
世界杯数据链路解析:从球场传感器到终端推送的毫秒级架构
java·前端·python·架构
xlq2232220 小时前
53.tcp socket
linux·服务器·开发语言·网络·网络协议·tcp/ip
Royzst20 小时前
Lambda 算法基础 集合概述
java·开发语言
wanhengidc20 小时前
云手机的兼容性与稳定性
大数据·运维·服务器·网络·人工智能·智能手机
Web极客码20 小时前
2026年自建网站实战指南:从服务器到上线的完整方案
运维·服务器·php
Yeh20205820 小时前
Mybatis笔记一
java·笔记·mybatis
likerhood20 小时前
Java 动态代理深度解析:从“为什么“到“底层原理“
java
念何架构之路20 小时前
负载均衡详解
运维·php·负载均衡