Agent 到底是什么?一个 Java 开发者的认知纠偏

我花了不少时间看一个多 Agent 面试平台的代码,越看越觉得不对劲——Agent 怎么就是数据库里的一行配置?这和我之前看的 LangChain、AutoGPT 完全是两回事。后来才想明白,Agent 有两种形态,而大多数人接触的其实是简化版。


目录


从一个误会说起

第一次打开这个面试平台的 Agent 模块,我愣了好几秒。

数据库里存着一张 agent_properties 表,每个 Agent 就是一行:名字、API Key、API Secret、工作流 ID。没了。

SELECT * FROM agent_properties;
id agent_name api_key api_secret api_flow_id
1 通用智能体 abc123 secret1 flow_001
2 面试出题官 def456 secret2 flow_002
3 用户答案评分官 ghi789 secret3 flow_003
4 神态分析官 jkl012 secret4 flow_004
5 面试提问官 mno345 secret5 flow_005

这就是 Agent?我当时的第一反应是——这不就是配置嘛。几个 key,一个工作流 ID,跟我在博客和论文里看到的 Agent(推理、工具调用、自主决策)差了十万八千里。

后来花了一整天把代码啃完,才搞清楚:Agent 这个词在不同语境下指的是完全不同的东西。


一个真实项目里的 5 个 Agent

先说说这个项目是干什么的。

码上面试平台——基于 Spring Boot 3.4 + Java 17 + 星辰大模型的模拟面试系统。用户上传简历,AI 自动出题、提问、评分、追问,最后生成面试报告。

面试这件事在现实里本来就是多人协作的:一个人看简历出题,另一个人负责提问,还有人专门打分。这个项目把这套分工搬到了代码里——每个面试官就是一个 Agent。

现实世界                              代码世界
---------                              --------
出题官 → 看简历,出题目               Agent("面试出题官") → 调 AI → 返回面试题
提问官 → 读题目,问候选人             Agent("面试提问官") → 调 AI → 返回提问内容
评分官 → 听答案,打分数               Agent("用户答案评分官") → 调 AI → 返回分数
追问官 → 看分数,决定要不要追问       Agent("追问官") → 调 AI → 返回是否追问
表情官 → 观察仪态                     Agent("神态分析官") → 调 AI → 返回仪态评分

5 个 Agent 各司其职,通过编排组合起来完成一场完整的模拟面试。后面的文章会专门讲编排模式(Facade、Chain、ReAct),这篇先聚焦一件事:单个 Agent 到底是怎么实现的。


5 步实现一个 Agent

这个项目的 Agent 实现分 5 层,从数据库到 API 调用,每层各管一件事。

第 1 步:建表

CREATE TABLE agent_properties (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    agent_name VARCHAR(100) COMMENT '智能体名称',
    api_key VARCHAR(200) COMMENT 'API Key',
    api_secret VARCHAR(200) COMMENT 'API Secret',
    api_flow_id VARCHAR(100) COMMENT '星辰工作流 ID',
    create_time DATETIME,
    del_flag INT DEFAULT 0
);
INSERT INTO agent_properties (agent_name, api_key, api_secret, api_flow_id)
VALUES ('面试出题官', 'abc123', 'secret1', 'flow_002');

第 2 步:实体类

@Data
@TableName("agent_properties")
public class AgentProperties {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String agentName;
    private String apiKey;
    private String apiSecret;
    private String apiFlowId;
    private LocalDateTime createTime;
    private Integer delFlag;
}

第 3 步:场景枚举

public enum BusinessAgentEnum {
    INTERVIEW_QUESTION_GENERATOR("面试出题官"),
    INTERVIEW_QUESTIONER("面试提问官"),
    INTERVIEW_ANSWER_EVALUATOR("用户答案评分官"),
    INTERVIEW_FOLLOWUP("追问官"),
    INTERVIEW_EXPRESSION_ANALYZER("神态分析官");

    private final String agentName;

    BusinessAgentEnum(String agentName) {
        this.agentName = agentName;
    }
}

第 4 步:场景解析器

@Service
public class BusinessAgentResolver {

    private final AgentPropertiesMapper agentPropertiesMapper;

    public AgentProperties resolve(BusinessAgentEnum agentEnum) {
        // 根据场景枚举,从数据库查出对应的 Agent 配置
        return agentPropertiesMapper.selectByAgentName(agentEnum.getAgentName());
    }
}

这是整个设计里最巧妙的地方。业务代码不直接写死调哪个 Agent,而是通过枚举告诉解析器:我需要面试出题官。解析器去数据库查配置,拿到 API Key 和工作流 ID。要换 Agent?改数据库就行,代码不用动。

第 5 步:调用 AI

@Service
public class InterviewWorkflowService {

    private final BusinessAgentResolver resolver;
    private final XingChenAIClient aiClient;

    public InterviewQuestionRespDTO extractInterviewQuestions(InterviewQuestionReqDTO req) {
        // 1. 解析出面试出题官的配置
        AgentProperties agent = resolver.resolve(BusinessAgentEnum.INTERVIEW_QUESTION_GENERATOR);

        // 2. 组装参数,调用星辰大模型
        Map<String, Object> params = buildParams(req);
        String result = aiClient.execute(agent.getApiKey(), agent.getApiSecret(),
                                          agent.getApiFlowId(), params);

        // 3. 解析返回的 JSON,转成 DTO
        return parseResult(result);
    }
}

5 步走完,一个 Agent 就能从数据库配置到实际调用 AI 全链路跑通。整个过程没有推理、没有工具选择、没有自主决策——就是查配置、传参数、调接口、解析结果


星辰大模型:Agent 背后的 AI 引擎

这个项目用的 AI 不是直接调 OpenAI 或 DeepSeek 的 chat 接口,而是星辰大模型的工作流平台。

普通大模型调用是一问一答:你丢一段 Prompt,它回一段文本。但星辰平台不一样,它支持工作流——你可以把多个处理步骤串成一条流水线。

普通大模型调用:
用户输入 → 大模型 → 输出

星辰工作流:
用户输入 → 步骤1:解析简历 → 步骤2:提取技能 → 步骤3:生成面试题 → 步骤4:格式化输出

5 个 Agent 背后实际上是 5 个不同的工作流——出题有出题的流程,评分有评分的流程。每个 Agent 的 api_flow_id 就是它在星辰平台上的流水线编号。


Facade 协调:Agent 不是自己跑的

有一个容易忽略的点:Agent 本身不会自己被调用。它需要一个协调员来安排什么时候该找谁。

这个项目用的是 Facade 模式,InterviewSessionFacade 就是那个协调员。

@Service
public class InterviewSessionFacade {

    private final InterviewWorkflowService workflowService;
    private final InterviewSessionService sessionService;
    private final InterviewRecordService recordService;

    public InterviewQuestionRespDTO extractInterviewQuestions(...) {
        // 1. 先告诉会话管理:状态改成上传中
        sessionService.markUploading(sessionId, userId);

        // 2. 调用工作流服务,找到出题官 Agent,调 AI
        InterviewQuestionRespDTO response =
            workflowService.extractInterviewQuestions(req);

        // 3. 搞定了,状态改成准备就绪
        sessionService.markReady(sessionId, userId, ...);

        return response;
    }
}

前端代码只调一行 facade.extractInterviewQuestions(),不用知道里面有状态管理、Agent 解析、AI 调用、结果解析这些步骤。

没有 Facade 的话,前端得自己一步步调:先标状态、再找 Agent、再调 AI、再更新状态。任何一个步骤出错或者顺序变了,前端就得跟着改。Facade 把这些封装起来,前端只管要出题,内部怎么协调它不关心。

类比一下:你找婚礼策划师,策划师去对接酒店、摄影、化妆。你不用挨个打电话。


认知升级:从配置到自主决策

回到开头的问题:Agent 到底是什么?

啃完这个项目的代码后,我把自己的认知升级路径整理了一下:

第一层:Agent = 配置。 数据库里存几个 key,代码根据场景找配置、调接口。这就是这个项目在做的事。

第二层:Agent = 配置 + 调用逻辑。 不光有配置,还有 Resolver 做场景匹配、Facade 做流程协调、XingChenAIClient 做 API 调用。配置本身不干活,这些胶水代码才是 Agent 能跑起来的原因。

第三层:Agent = 大模型 + 工具 + 记忆 + 调度。 这是 LangChain、AutoGPT 里说的 Agent——能自己决定调什么工具、记住历史对话、动态调整行为。标准说法是四大组件:推理层(大脑,负责任务拆解和决策判断)、工具执行层(手脚,RAG 检索和 API 调用等外部能力)、记忆模块(短期记忆存对话上下文,长期记忆存历史偏好)、规划编排层(调度中枢,判断任务是否完成、要不要调下一个工具)。这个项目的 Agent 没有这些能力,调谁、传什么参数都是代码写死的。

第四层:Agent = 自主决策系统。 ReAct 模式(Reasoning + Acting:思考→行动→观察→循环)、多轮工具调用、根据中间结果改变策略。这是完整形态的 Agent,但实现成本也最高。

这个面试平台的 Agent 处在第一层和第二层之间。但已经能跑通完整业务了——5 个 Agent 配合起来,完成一场模拟面试没有问题。

那什么时候需要第三层、第四层?当流程不固定的时候。

面试出题→评分→追问,这个流程是固定的,每一步找哪个 Agent、传什么参数,在代码里写得清清楚楚。不需要 AI 自己决定要不要调工具或者该调哪个工具。

但如果你要做一个智能客服——用户说我的订单没发货,Agent 需要自己决定先查订单、再查物流、然后根据结果决定怎么回复——这就需要完整的 Agent 了。流程不是写死的,AI 得自己判断下一步干什么。

大部分业务场景其实不需要完整的 Agent。流程固定、输入输出明确、步骤可预期——简化版就够了。别被网上那些 Agent 革命的文章吓到,觉得不上 ReAct、不接向量数据库就不叫 Agent。

先把简化版跑通,验证业务价值。 如果发现流程经常变化、需要 AI 自己判断,再升级也不迟。


系列导航

这是「Agent 架构认知升级手册」系列的第 1 篇,从一个 Java 开发者的视角,走一遍对 Agent 的认知纠偏。

主题 核心问题 状态
1 Agent 到底是什么(本篇) 简化版 vs 标准版 Agent
2 多 Agent 编排实战 Facade、Chain、4 层输出校验 计划中
3 Agent 为什么总是失忆 从数据库到 RAG 的 3 种记忆方案 计划中
4 ReAct、Chain 还是 Facade Agent 推理模式的选择指南 计划中
5 RAG + Agent vs 纯 RAG 什么时候需要研究助理 计划中

系列阅读路径: 1→2→3→4→5(完整学习路径),每篇也可单独阅读。

关联已发布博客:


一句话总结

Agent 的核心不是有没有 AI 大脑,而是什么场景 -> 找谁 -> 怎么调 -> 怎么处理结果这条链路能不能跑通。 能跑通,它就是 Agent——哪怕大脑在云端,本地代码只负责调度。

更多推荐