ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

掌握 DDD:开发可维护、可扩展的大模型 Agent,小白程序员必备(收藏版)

掌握 DDD:开发可维护、可扩展的大模型 Agent,小白程序员必备(收藏版)

本文探讨了使用领域驱动设计(DDD)开发大模型 Agent 的必要性,指出了传统 Agent 开发方式在工程化中遇到的问题。文章详细阐述了如何划定 Agent 领域边界,区分聚合根、实体和值对象,并给出了具体的领域模型拆解示例。此外,还介绍了模型之间的协作流程和工程落地的实操建议,最后总结了该模型能支撑的高级能力,为开发生产级 Agent 提供了实用指导。

一、先回答一个核心问题:为什么 Agent 需要 DDD?

传统写 Agent 的方式是过程式思维: 接收用户消息 → 交给 LLM 思考 → 选择工具 → 执行工具 → 拼接结果返回。

这套思路跑 Demo 没问题,但一旦进入工程化,会遇到一堆典型问题:

  1. 会话只是一串消息数组,没有区分 “用户输入、模型思考、工具入参、工具返回、系统通知”;

  2. Agent 状态是零散变量,存 Redis 的时候不知道哪些要持久、哪些是临时计算值;

  3. 工具只是一个个函数,没有统一描述、权限、限流、版本、超时定义;

  4. 任务指令没有生命周期,没有待执行、执行中、成功、失败、取消这些状态流转;

  5. 多 Agent 委派场景下,主管 Agent 下发任务,Worker 接收任务,没有统一的领域契约。

DDD 的核心价值,就是把 Agent 的业务能力和底层执行逻辑分开。 我们先定义领域里有什么 “东西”,这些东西有什么属性、能发生什么行为、互相怎么关联,再去写框架代码、做存储、做通信。

一句话总结:LLM 只是领域里的一个 “能力组件”,而不是整个系统的中心。


二、划定 Agent 领域边界:限界上下文

做 DDD 第一步,先划限界上下文,避免无限膨胀。 我们这里聚焦独立执行单元 Agent 上下文(单 Agent,后续多 Agent 委派、A2A 通信属于另外一个限界上下文,不要混在一起)。

✅ 当前上下文包含的内容:

  • 用户发起的指令(任务)
  • Agent 会话,所有交互消息记录
  • Agent 自身运行时状态
  • 工具定义、工具调用请求与结果
  • 记忆快照(短期记忆、摘要记忆)
  • 校验规则、权限标签

❌ 不属于这个上下文,要剥离出去:

  • 消息总线、A2A 跨 Agent 通信(多 Agent 上下文)
  • 向量库检索底层实现(RAG 基础设施上下文)
  • 日志链路追踪、计费统计(可观测上下文)
  • 用户账号、租户权限主数据(用户中心上下文)

边界划清楚,建模才不会越写越杂。

很多项目翻车,就是把跨上下文逻辑揉在一起:Agent 里面直接写 MQ 发送逻辑、直接写向量库连接代码,领域模型和基础设施耦合死。


三、领域模型拆解:区分聚合根、实体、值对象

DDD 里有两个基础概念,这里简单说清楚,不用晦涩术语:

  • 聚合根:整个聚合的入口,是外部唯一可以直接引用的对象,拥有独立全局 ID;

  • 实体:有唯一标识,会持续变化;

  • 值对象:没有独立 ID,只描述属性,不可变,依附于实体。

我们直接落地 Agent 领域的模型清单。

  1. 1 聚合根:AgentSession 会话聚合根

聚合根:会话 Session

所有本次任务相关的消息、状态、子指令、工具调用记录,都归属在这个会话下。外部只能通过 Session ID 访问这一组数据。

核心属性:

  • sessionId:全局唯一 ID(聚合根标识)
  • tenantId:租户标识(多租户场景必备)
  • agentCode:Agent 类型编码(不同业务 Agent 区分)
  • status:会话状态枚举:CREATED / RUNNING / PAUSED / COMPLETED / FAILED / CANCELLED
  • createdAt、updatedAt、expireAt:时间戳
  • parentSessionId:父会话 ID,用于支持任务委派(A2A 场景,主管 Agent 会话关联 Worker 会话)
  • metadata:扩展标签,比如触发渠道、优先级

内部包含子实体 / 值对象:

  • 消息实体 Message
  • 运行状态实体 AgentState
  • 指令实体 Instruction
  • 工具调用记录 ToolCallRecord

规则约束(聚合内不变性): 会话一旦标记完成 / 失败,不允许新增消息和工具调用; 所有子对象不能脱离 Session 单独存在。

  1. 2 实体 1:Instruction 指令(任务)

指令就是 Agent 要完成的目标,是用户或者上级 Agent 下发的任务,这是 Agent 领域里非常核心的实体。 很多 Demo 直接把指令塞在 prompt 里,工程上必须抽成独立实体,管理生命周期。

属性:

  • instructionId:指令唯一标识
  • sessionId:归属会话
  • content:原始指令文本
  • goal:结构化目标(拆解后的目标,方便校验是否完成)
  • status:指令状态:PENDING / PLANNING / EXECUTING / VERIFYING / DONE / REJECTED
  • plan:执行计划(LLM 输出的分步方案,值对象)
  • deadline:截止时间
  • retryCount:重试次数
  • assignee:执行 Agent 标识(A2A 委派时使用)

行为:

  • 生成执行计划
  • 校验目标是否达成
  • 标记失败 / 重派
  • 取消任务

区分:用户输入的一句话,只是指令的来源;Instruction 实体承载的是这个任务完整生命周期。

  1. 3 实体 2:Message 交互消息

消息是会话里每一轮交互记录,不要简单存纯字符串数组,这是最常见的坏习惯。

属性:

  • messageId:消息 ID
  • sessionId
  • senderType:发送方枚举 USER / LLM / TOOL / SYSTEM / AGENT_PEER
  • senderId:发送方标识,工具 ID、AgentID、用户 ID
  • messageType:消息类型 TEXT / TOOL_CALL_REQUEST / TOOL_CALL_RESULT / ERROR / NOTICE
  • payload:结构化内容(json)
  • rawContent:原始文本
  • tokenUsage:本次消耗 token(值对象)
  • createdAt

重点好处: 后续做检索、过滤、可观测、成本统计,不需要去解析文本,直接按类型筛选。

  1. 4 实体 3:Tool 工具定义 & ToolCallRecord 调用记录

这里分成两块:工具定义(领域实体)和单次调用记录(会话内实体)。

Tool(工具定义,全局实体,跨会话复用)

  • toolId、toolCode、name、description
  • inputSchema、outputSchema
  • authRule:权限标签
  • timeout、rateLimit、retryPolicy
  • provider:工具提供者(MCP 服务地址、本地函数标识)

ToolCallRecord(单次调用记录,归属会话聚合)

  • recordId、sessionId、instructionId
  • toolId
  • inputArgs:入参
  • output:返回结果
  • status:INIT / RUNNING / SUCCESS / ERROR / TIMEOUT
  • cost、costTime

划重点:Tool 是 “能力定义”,ToolCallRecord 是 “这一次的执行流水”。 对接 MCP 的时候,MCP 服务就是 Tool 的一个 provider 实现,模型完全不用改动,这也是之前 A2A+MCP 链路能顺畅打通的底层原因。

  1. 5 实体 4:AgentState 运行状态

AgentState,就是大家常说的 Agent 状态,属于会话内实体,保存 Agent 思考过程中的中间变量。区分临时状态和持久化状态,是做断点续传的关键。

属性:

  • stateId
  • sessionId
  • memorySnapshot:摘要记忆快照(值对象)
  • variableMap:业务中间变量(结构化 KV,比如查询出来的数据、临时计算结果)
  • nextStepHint:下一步要执行的动作标记
  • checkpointVersion:快照版本号(断点续传用)

⚠️ 重要原则: 不要把大模型的完整思考日志塞进 State;State 只存结构化、机器可读的数据,用来恢复执行。大模型思考文本放在 Message 里面。

  1. 6 值对象清单(无独立 ID,不可变)

  • TokenUsage:输入 token、输出 token、花费
  • PlanStep:计划单步内容、顺序、依赖项
  • MemorySummary:摘要内容、摘要范围、生成时间
  • ErrorInfo:错误码、错误信息、根因标签
  • PermissionTag:权限标签集合

四、模型之间的协作流程(一条完整链路)

我们用一个简单场景串一遍:用户下发一条指令,Agent 调用 MCP 工具查询数据库。

用户提交需求,系统创建Session(聚合根),同时生成一条Instruction(指令实体),状态 PENDING;

  1. Agent 读取 Instruction,生成执行 Plan(值对象),指令状态变为 PLANNING;

  2. 写入 Message(LLM 类型消息,内容是执行方案),更新 AgentState 快照;

  3. 生成 ToolCallRecord,关联对应 Tool 定义,通过 MCP 协议发起工具调用;

  4. MCP 返回结果,写入新的 Message 和 ToolCallRecord,状态更新 SUCCESS;

  5. Agent 校验指令目标是否达成,达成后 Instruction 标记 DONE,Session 标记 COMPLETED;

  6. 每一步都可以打 Checkpoint,保存 AgentState,支持暂停、断点恢复。

如果是 A2A 委派场景: 主管 Agent 创建新的子 Session,下发子 Instruction,通过 A2A 协议把指令发给 Worker Agent,Worker 内部复用同一套领域模型。通信协议(A2A)只是传输层,两边 Agent 的领域模型保持统一。

这就是这套模型强大的地方:单 Agent、多 Agent 委派,一套领域模型复用。


五、工程落地的实操建议 & 避坑点

坑 1:不要把领域模型和框架数据结构绑定

LangGraph 有 State,Spring AI 有 ChatMemory。这些是框架运行载体,不是领域模型。 正确做法:领域模型是独立 POJO / 数据类,框架 state 只负责映射领域模型,框架换了,领域模型不动。

坑 2:状态里面塞满非结构化文本

很多开发者直接把历史消息字符串全部塞状态,导致快照巨大、恢复慢、难以检索。 遵循我们的模型:Message 存交互文本,AgentState 只存结构化变量和摘要快照。

坑 3:指令没有生命周期,无法做任务管控

没有 Instruction 实体,你就没法做:任务超时提醒、任务取消、任务重分配、委派失败回滚。 这也是生产 Agent 和 Demo Agent 最核心分界线。

坑 4:工具和调用记录混在一起

Tool 定义全局统一管理,方便权限、限流、版本管理;调用记录归属会话,用来审计、重试、回放。对接 MCP 的时候,只需要新增一类 Tool Provider,不用改动指令、会话逻辑。

存储落地建议

  • Session、Instruction、ToolCallRecord、Message:数据库持久化(PostgreSQL、MySQL)
  • AgentState 快照:Redis,配合版本号做断点
  • Tool 定义:配置中心或者数据库,支持动态注册 MCP 工具

六、这套模型能支撑哪些高级能力?

建好这套领域模型之后,后面很多高级功能是自然而然生长出来的,而不是硬编码:

✅ 会话断点续传、暂停恢复

✅ 指令超时、失败重试、人工介入

✅ 工具调用审计、回放测试

✅ A2A 跨 Agent 任务委派(主管→Worker)

✅ Agent 评测:基于 Instruction 的目标结果做自动化校验

✅ 记忆分层:会话绑定记忆快照,长期记忆单独领域模块

✅ 多租户隔离:tenantId 作为顶层过滤条件


七、本篇小结

DDD 不是玄学,放到 Agent 开发里,本质就是一句话:把模糊的智能行为,拆成有身份、有生命周期、有明确行为的对象。

我们这一篇,划定了 Agent 单执行单元的限界上下文,定义了聚合根 Session,以及指令、消息、工具、运行状态四大核心实体,区分了实体和值对象,打通了从用户任务下发到工具执行的模型流转。

LLM 负责思考和生成方案,但是任务是谁、进度到哪、有哪些交互记录、工具怎么调用、能不能断点恢复,全部由领域模型接管。 这是从写 Demo,走向可维护、可扩展生产级 Agent 架构非常关键的一步。

大模型的知识又多又杂,到底怎么学?

做这行久了,被问最多的问题就一个:大模型的知识又多又杂,我到底先学啥?翻了一堆资料,看啥都像重点,结果啥都没学进去。今天把我自己一路摸出来的顺序捋一遍,零基础、应届生、转行的都适用。跟着走,至少方向不乱、不瞎忙,学完拿得出手。

第一阶段(10天):初阶应用

这一阶段就一个目标:把大模型真正"玩明白",不是只会聊天那种,而是能调教它、能用代码把大模型和业务接起来。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
  • …
第二阶段(30天):高阶应用

这阶段正式进实战,目标很实在:做出两个能拿出手的东西——一个私有知识库,一个 agent 对话机器人。

  • 为什么要做 RAG

  • 搭建一个简单的 ChatPDF

  • 检索的基础概念

  • 什么是向量表示(Embeddings)

  • 向量数据库与向量检索

  • 基于向量检索的 RAG

  • 搭建 RAG 系统的扩展知识

  • 混合检索与 RAG-Fusion 简介

  • 向量模型本地部署

  • …

走完这 30 天,Python 或 JavaScript 背景的基本能独立做一套 RAG 应用,简历上也敢写"大模型应用开发"了。

第三阶段(约20天):动手微调

学到这,你已经开始 “造” 模型了 —— 通过微调,搞出垂直领域的专用小模型。

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
  • …

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你从 “只会用” 变成 “能造” 的 AI 小子。那么你还想往下探索吗?

想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!

第四阶段(20天):商业闭环,部署落地

技术学完,落地才算数。这阶段带你搞明白大模型怎么真正跑起来、用起来。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案
  • …

想要入坑大模型的朋友,给大家准备了一份2026 年最新 AI 大模型全套学习资料:

1、大模型系统化学习路线

2、大模型学习视频教程

3、大模型学习书籍&电子文档

4、AI大模型最新行业报告

5、大模型项目实战&配套源码

6、2026大模型大厂面试真题

7、为什么要学习大模型?

我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。

8、适合谁学?
  • 传统后端 / Java / 前端开发,想转型 AI 应用
  • 大学生、应届生,想拿更好的 offer
  • 产品经理、运营,想武装职业竞争力
  • 技术负责人,想给团队落地提效

学习是反人性的,但回报是真金白银。技术会更新,赛道会切换,但只要你先动手,机会就永远站在你这边。

9、这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!

好了,就写到这。路线是死的,人是活的,卡住了随时来问我。觉得有用就点个收藏,别让它进收藏夹吃灰——动起来比啥都强。

返回列表