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);
        }
    }
}

对话演示:

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

相关推荐
做时间的朋友。2 小时前
Java虚拟线程详解:从原理到实战,解锁百万并发新姿势
java·开发语言
一只大袋鼠2 小时前
MyBatis 从入门到实战(二):代理 Dao 开发与多表关联查询
java·开发语言·数据库·mysql·mybatis
周末也要写八哥2 小时前
C++实际开发之泛型编程(模版编程)
java·开发语言·c++
好家伙VCC2 小时前
**发散创新:用 Rust实现游戏日引擎核心模块——从事件驱动到多线程调度的实战
java·开发语言·python·游戏·rust
014-code2 小时前
Chronicle Queue:把 Disruptor 的数据落盘
java·服务器
小江的记录本2 小时前
【系统设计】《2026高频经典系统设计题》(秒杀系统、短链接系统、订单系统、支付系统、IM系统、RAG系统设计)(完整版)
java·后端·python·安全·设计模式·架构·系统架构
希望永不加班2 小时前
SpringBoot 中 AOP 实现权限校验(角色/权限)
java·spring boot·后端·spring
殷紫川2 小时前
Docker Compose实战指南
运维·docker
桌面运维家2 小时前
IDV云桌面vDisk机房部署方案模板特性解析
java·开发语言·devops