Agent 设计模式系列

Agent 设计模式 2:顺序工作流:生成与优化简历

把简历生成与岗位定制串成顺序工作流,分别阅读无类型与结构化输出的写法。

上一讲介绍了基础 Agent。本讲把简历生成与岗位定制依次串联,对应原文参考资料中的 Prompt Chaining 模式。

顺序工作流模式

原文配图:顺序工作流模式。

在上一讲生成简历的基础上,先为全栈工程师岗位准备职位描述(JD):

job_description_fullstack.txt

职位描述 ID: 123B
全栈开发工程师(SaaS 数据分析平台,欧盟远程)
------------------------------------------------
我们正在寻找一位**全栈开发工程师**加入我们的 SaaS 数据分析平台团队。该岗位将涉及后端和前端的工作,核心是为数据密集型产品提供高质量的用户体验。

**职责:**
*   使用 **Java** 或 **Node.js** 开发和维护后端服务,数据存储在 **PostgreSQL** 和 **Redis** 中。
*   使用 **React** 构建并完善仪表板和管理工具。
*   与产品经理和设计师合作,完成功能的端到端上线。
*   参与扩展用于数据处理的异步任务系统。

**要求:**
*   扎实的后端开发经验(Java 或 Node.js)。
*   具备现代 JavaScript 框架(最好是 React)的实际项目经验。
*   深入了解数据库和缓存解决方案。
*   能够在远程团队中独立工作,将功能从概念推进到生产。
*   有 SaaS 产品交付经验者优先。
*   要求英语熟练。

再准备一个后端工程师岗位的 JD,供后面对比:

job_description_backend.txt

职位描述 ID: 123A
后端工程师(金融科技,安特卫普)
------------------------------------------------------------
我们正在招聘一位**后端工程师**,协助我们构建并完善支付与对账服务。您将主要使用 **Java (Spring Boot)**,并与产品及运营团队紧密合作,确保金融交易系统的可靠性和可扩展性。

**职责:**
*   设计、实现并维护能够处理大规模支付与对账业务的后端服务。
*   在云原生环境中使用 **PostgreSQL**、**Kafka**、**Docker** 和 **Kubernetes**。
*   专注于构建可靠、幂等的系统,并具备强大的可观测性。
*   支持将遗留服务迁移至现代的 REST API。

**要求:**
*   具备 Java 和 Spring Boot 后端开发的职业经验。
*   深入理解关系型数据库和事件驱动架构。
*   熟悉容器化技术和部署流程。
*   有金融或定价系统相关经验者优先。
*   要求英语流利,会荷兰语者更佳。

接下来,按岗位要求调整简历的表达重点,使已有经历与该岗位更匹配。

一、定义简历优化Agent

/**
 * 简历优化器
 */
public interface CvTailor {

    @Agent("根据特定要求优化简历")
    @SystemMessage("""
            这里有一份需要根据特定职位描述、反馈或其他指示进行优化的简历。
            你可以让简历看起来更符合要求,但不能编造事实。
            如果去掉不相关的内容能让简历更符合要求,你可以进行删减。
            目标是让申请人获得面试机会,并能在面试中证明简历内容。不要让简历过于冗长。
            
            原始简历:{{masterCv}}
            """)
    @UserMessage("""
            以下是优化简历的具体要求:{{instructions}}
            """)
    String tailorCv(@V("masterCv") String masterCv, @V("instructions") String instructions);
}

这个 Agent 接收简历与岗位要求,返回调整后的简历。

二、创建无类型的顺序工作流

/**
 * 【顺序工作流示例】(改编自<a href="https://github.com/langchain4j/langchain4j-examples">langchain4j官网示例</a>)
 * 该示例演示了如何实现两个Agent:
 * - CvGenerator(接收个人简介并生成一份完整的主简历)
 * - CvTailor(接收原始简历并根据特定指令(职位描述、反馈等)进行定制)
 * 然后使用 sequenceBuilder 按顺序工作流依次调用它们,
 * 并演示如何在它们之间传递参数。
 */
public class _2a_Sequential_Agent_Example {

    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext context = SpringApplication.run(AgentDesignPatternApplication.class, args);
        ChatModel model = context.getBean("ollamaChatModel", ChatModel.class);


        CvGenerator cvGenerator = AgenticServices
                .agentBuilder(CvGenerator.class)
                .chatModel(model)
                .outputKey("masterCv")
                // 如果要将此变量从agent-1传递到agent-2,
                // 请确保此处的outputKey与第二个agent接口中指定的输入变量名匹配
                // 对应 CvTailor.java 文件中的变量名
                .build();


        CvTailor cvTailor = AgenticServices
                .agentBuilder(CvTailor.class)
                // 注意:可以为不同agent使用不同的模型
                .chatModel(model)
                // 定义输出对象的键
                // 如果在这里使用 "masterCv",原始的主简历会被第二个agent覆盖
                .outputKey("tailoredCv")
                .build();

        UntypedAgent tailoredCvGenerator = AgenticServices
                .sequenceBuilder()
                // 可以包含任意多个代理,顺序很重要
                .subAgents(cvGenerator, cvTailor)
                // 这是合成Agent的最终输出
                // 注意:可以使用 AgenticScope 中的任何字段作为输出
                // 例如,可以输出 'masterCv' 而不是 tailoredCv(尽管在本例中没有意义)
                .outputKey("tailoredCv")
                .build();

        // 从 resources/documents/ 目录下的文本文件加载参数
        // - user_life_story.txt
        // - job_description_backend.txt
        String lifeStory = StringLoader.loadFromResource("/documents/user_life_story.txt");
        String instructions = "根据以下职位描述优化简历。" + StringLoader.loadFromResource("/documents/job_description_backend.txt");

        // 由于使用的是无类型Agent,需要传递参数映射
        Map<String, Object> arguments = Map.of(
                // 匹配 CvGenerator.java 中的变量名
                "lifeStory", lifeStory,
                // 匹配 CvTailor.java 中的变量名
                "instructions", instructions
        );

        // 调用合成 Agent 生成优化后的简历
        String tailoredCv = (String) tailoredCvGenerator.invoke(arguments);

        // 打印生成的简历
        System.out.println("=== 优化后的简历(无类型代理)===");
        System.out.println((String) tailoredCv);
        // 可以尝试,当使用job_description_fullstack.txt 作为输入时,
        // 生成的简历会有很大不同
    }
}

解释一下:

  • 16-23行定义了1个Agent:从“个人资料”生成“简历”(masterCv)
  • 26-33行定义了另1个Agent:将生成的简历,针对后端岗位要求进行优化
  • 35-43行定义了顺序工作流,将上述2个Agent串起来

图示如下:

简历生成与岗位优化的顺序连接

原文配图:简历生成与岗位优化的顺序连接。

时序图(简化版,原文标注为 AI 生成)

顺序工作流:生成与优化简历:简化时序图

原文配图:顺序工作流:生成与优化简历:简化时序图。

时序图(详细版,原文标注为 AI 生成)

顺序工作流:生成与优化简历:详细时序图

原文配图:顺序工作流:生成与优化简历:详细时序图。

运行结果:

展开原文日志或请求/响应(未复测)
2026-01-11T20:26:25.538+08:00  INFO 7904 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: http://localhost:11434/api/chat
- headers: [Content-Type: application/json]
- body: {
  "model" : "deepseek-v3.1:671b-cloud",
  "messages" : [ {
    "role" : "user",
    "content" : "以下是我的个人生活和职业经历信息,\n请将其整理成一份清晰、完整的简历。\n\n注意事项:\n1. 不要编造任何事实\n2. 不要遗漏任何技能或经历\n3. 这份简历后续会进一步优化,请确保内容完整\n\n我的个人经历:John Doe 现居比利时安特卫普(Rue des Carmes 12, 2000 Antwerp),联系方式为 john.doe.dev@protonmail.com 或 +32 495 67 89 23。他在 LinkedIn 和 GitHub 上保持活跃。\r\n\r\n- 2020 年完成夜间 Java 集训营(2019–2020)后从机械工程领域转型至软件开发。\r\n- 拥有 4 年软件开发经验,其中最近 2 年专注于 Java 后端开发(Spring Boot、PostgreSQL、Kafka 基础)。\r\n- 开发了一款内部报价工具,将报价周转时间缩短约 35%。\r\n- 领导 3 人专项小组,将遗留 SOAP 服务迁移至 REST 架构。\r\n- 熟悉 Docker 与 CI 流水线(GitHub Actions)。\r\n- 具备 React 使用经验,曾开发内部管理面板(非核心优势)。\r\n- 重视代码整洁与可维护性,乐于指导实习生。\r\n- 偏好产品开发而非外包项目;不喜冗长会议,注重交付实际价值。\r\n- 语言:荷兰语(母语)、英语(C1)、法语(B1)。\r\n- 教育背景:机械工程学士(2016 年),Java 集训营(2019–2020)。\r\n- 个人项目包括一款小型预算管理应用(Spring + Vue)和一套家庭物联网系统(ESP32 + MQTT)。\n"
  } ],
  "options" : {
    "stop" : [ ]
  },
  "stream" : false,
  "tools" : [ ]
}

2026-01-11T20:26:34.001+08:00  INFO 7904 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP response:
- status code: 200
- headers: [content-type: application/json; charset=utf-8], [date: Sun, 11 Jan 2026 12:26:33 GMT], [transfer-encoding: chunked]
- body: {"model":"deepseek-v3.1:671b-cloud","remote_model":"deepseek-v3.1:671b","remote_host":"https://ollama.com:443","created_at":"2026-01-11T12:26:33.720616987Z","message":{"role":"assistant","content":"# John Doe - 简历\n\n**地址**  \nRue des Carmes 12, 2000 Antwerp, Belgium  \n**电子邮件**  \njohn.doe.dev@protonmail.com  \n**电话**  \n+32 495 67 89 23  \n**在线资料**  \nLinkedIn, GitHub\n\n---\n\n## 个人简介\n\n拥有4年经验的软件开发工程师,其中最近2年专注于Java后端开发。2020年通过夜间集训营从机械工程成功转型至软件行业。具备Spring Boot、PostgreSQL、Kafka和Docker实践经验。曾领导小型团队完成服务架构迁移,并开发内部工具显著提升效率。重视代码质量与团队协作,乐于指导新人。偏好产品导向的开发环境,注重交付实际价值。\n\n---\n\n## 技能摘要\n\n- **后端开发**: Java, Spring Boot, REST APIs, SOAP, PostgreSQL\n- **工具与平台**: Docker, GitHub Actions (CI), Kafka (基础), MQTT\n- **前端技能**: React (具备经验), Vue.js\n- **语言**: 荷兰语 (母语), 英语 (C1), 法语 (B1)\n- **实践理念**: 代码整洁、可维护性、敏捷交付\n\n---\n\n## 职业经历\n\n**软件开发工程师**  \n*2020年 – 至今*  \n- 主要从事Java后端开发,技术栈包括Spring Boot、PostgreSQL和Kafka。\n- 设计并开发内部报价工具,将报价周转时间缩短约35%。\n- 领导3人专项小组,成功将遗留SOAP服务迁移至REST架构。\n- 使用Docker进行应用容器化,并维护基于GitHub Actions的CI流水线。\n- 参与开发内部管理面板,使用React实现部分功能。\n- 负责指导实习生,协助其适应开发流程与最佳实践。\n\n---\n\n## 教育背景\n\n**Java夜间集训营**  \n*2019年 – 2020年*  \n- 密集型编程训练,完成从机械工程至软件开发的职业转型。\n\n**机械工程学士**  \n*2016年毕业*\n\n---\n\n## 个人项目\n\n- **预算管理应用**: 使用Spring Boot与Vue.js开发的小型个人财务管理工具。\n- **家庭物联网系统**: 基于ESP32与MQTT协议搭建的智能家居监控系统。\n\n---\n*简历内容基于提供信息整理,可根据具体职位要求进一步优化重点。*"},"done":true,"done_reason":"stop","total_duration":6556040264,"prompt_eval_count":387,"eval_count":500}


2026-01-11T20:26:34.037+08:00  INFO 7904 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: http://localhost:11434/api/chat
- headers: [Content-Type: application/json]
- body: {
  "model" : "deepseek-v3.1:671b-cloud",
  "messages" : [ {
    "role" : "system",
    "content" : "这里有一份需要根据特定职位描述、反馈或其他指示进行优化的简历。\n你可以让简历看起来更符合要求,但不能编造事实。\n如果去掉不相关的内容能让简历更符合要求,你可以进行删减。\n目标是让申请人获得面试机会,并能在面试中证明简历内容。不要让简历过于冗长。\n\n原始简历:# John Doe - 简历\n\n**地址**  \nRue des Carmes 12, 2000 Antwerp, Belgium  \n**电子邮件**  \njohn.doe.dev@protonmail.com  \n**电话**  \n+32 495 67 89 23  \n**在线资料**  \nLinkedIn, GitHub\n\n---\n\n## 个人简介\n\n拥有4年经验的软件开发工程师,其中最近2年专注于Java后端开发。2020年通过夜间集训营从机械工程成功转型至软件行业。具备Spring Boot、PostgreSQL、Kafka和Docker实践经验。曾领导小型团队完成服务架构迁移,并开发内部工具显著提升效率。重视代码质量与团队协作,乐于指导新人。偏好产品导向的开发环境,注重交付实际价值。\n\n---\n\n## 技能摘要\n\n- **后端开发**: Java, Spring Boot, REST APIs, SOAP, PostgreSQL\n- **工具与平台**: Docker, GitHub Actions (CI), Kafka (基础), MQTT\n- **前端技能**: React (具备经验), Vue.js\n- **语言**: 荷兰语 (母语), 英语 (C1), 法语 (B1)\n- **实践理念**: 代码整洁、可维护性、敏捷交付\n\n---\n\n## 职业经历\n\n**软件开发工程师**  \n*2020年 – 至今*  \n- 主要从事Java后端开发,技术栈包括Spring Boot、PostgreSQL和Kafka。\n- 设计并开发内部报价工具,将报价周转时间缩短约35%。\n- 领导3人专项小组,成功将遗留SOAP服务迁移至REST架构。\n- 使用Docker进行应用容器化,并维护基于GitHub Actions的CI流水线。\n- 参与开发内部管理面板,使用React实现部分功能。\n- 负责指导实习生,协助其适应开发流程与最佳实践。\n\n---\n\n## 教育背景\n\n**Java夜间集训营**  \n*2019年 – 2020年*  \n- 密集型编程训练,完成从机械工程至软件开发的职业转型。\n\n**机械工程学士**  \n*2016年毕业*\n\n---\n\n## 个人项目\n\n- **预算管理应用**: 使用Spring Boot与Vue.js开发的小型个人财务管理工具。\n- **家庭物联网系统**: 基于ESP32与MQTT协议搭建的智能家居监控系统。\n\n---\n*简历内容基于提供信息整理,可根据具体职位要求进一步优化重点。*\n"
  }, {
    "role" : "user",
    "content" : "以下是优化简历的具体要求:根据以下职位描述优化简历。职位描述 ID: 123A\r\n后端工程师(金融科技,安特卫普)\r\n------------------------------------------------------------\r\n我们正在招聘一位**后端工程师**,协助我们构建并完善支付与对账服务。您将主要使用 **Java (Spring Boot)**,并与产品及运营团队紧密合作,确保金融交易系统的可靠性和可扩展性。\r\n\r\n**职责:**\r\n*   设计、实现并维护能够处理大规模支付与对账业务的后端服务。\r\n*   在云原生环境中使用 **PostgreSQL**、**Kafka**、**Docker** 和 **Kubernetes**。\r\n*   专注于构建可靠、幂等的系统,并具备强大的可观测性。\r\n*   支持将遗留服务迁移至现代的 REST API。\r\n\r\n**要求:**\r\n*   具备 Java 和 Spring Boot 后端开发的职业经验。\r\n*   深入理解关系型数据库和事件驱动架构。\r\n*   熟悉容器化技术和部署流程。\r\n*   有金融或定价系统相关经验者优先。\r\n*   要求英语流利,会荷兰语者更佳。\n"
  } ],
  "options" : {
    "stop" : [ ]
  },
  "stream" : false,
  "tools" : [ ]
}

2026-01-11T20:26:39.942+08:00  INFO 7904 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP response:
- status code: 200
- headers: [content-type: application/json; charset=utf-8], [date: Sun, 11 Jan 2026 12:26:39 GMT], [transfer-encoding: chunked]
- body: {"model":"deepseek-v3.1:671b-cloud","remote_model":"deepseek-v3.1:671b","remote_host":"https://ollama.com:443","created_at":"2026-01-11T12:26:39.665928619Z","message":{"role":"assistant","content":"**John Doe**  \nRue des Carmes 12, 2000 Antwerp, Belgium  \n+32 495 67 89 23 | john.doe.dev@protonmail.com  \nLinkedIn | GitHub\n\n---\n\n## 个人简介\n\n拥有4年经验的Java后端工程师,专注于构建可靠、可扩展的系统。具备Spring Boot、PostgreSQL、Kafka和Docker实践经验,曾主导服务迁移与内部工具开发,提升系统效率与处理能力。熟悉金融相关系统开发,曾参与报价工具开发以优化流程。追求代码质量与团队协作,偏好产品导向的金融科技环境。荷兰语母语,英语流利(C1)。\n\n---\n\n## 技术能力\n\n- **后端开发**: Java, Spring Boot, REST APIs, SOAP, PostgreSQL\n- **工具与平台**: Docker, Kafka, GitHub Actions (CI), Kubernetes (了解中)\n- **架构经验**: 事件驱动系统、服务迁移、系统可维护性与可观测性\n- **语言**: 荷兰语 (母语), 英语 (C1), 法语 (B1)\n\n---\n\n## 职业经历\n\n**软件开发工程师**  \n*2020年 – 至今*  \n- 使用Spring Boot和PostgreSQL开发并维护高可用后端服务,处理业务流程与数据对账。\n- 主导3人专项小组,将遗留SOAP服务迁移至REST架构,提升系统可扩展性。\n- 设计并实现内部报价工具,将报价周转时间缩短35%,支持定价流程优化。\n- 使用Docker容器化应用,结合GitHub Actions搭建CI流水线,提升部署效率。\n- 参与构建内部管理面板,强化系统可观测性与服务可靠性。\n\n---\n\n## 教育背景\n\n**Java夜间集训营**  \n*2019年 – 2020年*  \n- 密集型全栈开发训练,重点为Java、Spring Boot及现代软件工程实践。\n\n**机械工程学士**  \n*2016年毕业*\n\n---\n\n## 个人项目\n\n- **预算管理应用**(Spring Boot + Vue.js):模拟交易与对账流程的个人财务管理工具。\n- **家庭物联网系统**(ESP32 + MQTT):基于事件驱动的设备监控与数据采集系统。\n\n---\n*简历内容已根据金融科技后端工程师职位优化,可进一步按需调整重点。*"},"done":true,"done_reason":"stop","total_duration":5540916018,"prompt_eval_count":831,"eval_count":488}


=== 优化后的简历(无类型代理)===
**John Doe**  
Rue des Carmes 12, 2000 Antwerp, Belgium  
+32 495 67 89 23 | john.doe.dev@protonmail.com  
LinkedIn | GitHub

---

## 个人简介

拥有4年经验的Java后端工程师,专注于构建可靠、可扩展的系统。具备Spring Boot、PostgreSQL、Kafka和Docker实践经验,曾主导服务迁移与内部工具开发,提升系统效率与处理能力。熟悉金融相关系统开发,曾参与报价工具开发以优化流程。追求代码质量与团队协作,偏好产品导向的金融科技环境。荷兰语母语,英语流利(C1)。

---

## 技术能力

- **后端开发**: Java, Spring Boot, REST APIs, SOAP, PostgreSQL
- **工具与平台**: Docker, Kafka, GitHub Actions (CI), Kubernetes (了解中)
- **架构经验**: 事件驱动系统、服务迁移、系统可维护性与可观测性
- **语言**: 荷兰语 (母语), 英语 (C1), 法语 (B1)

---

## 职业经历

**软件开发工程师**  
*2020年 – 至今*  
- 使用Spring Boot和PostgreSQL开发并维护高可用后端服务,处理业务流程与数据对账。
- 主导3人专项小组,将遗留SOAP服务迁移至REST架构,提升系统可扩展性。
- 设计并实现内部报价工具,将报价周转时间缩短35%,支持定价流程优化。
- 使用Docker容器化应用,结合GitHub Actions搭建CI流水线,提升部署效率。
- 参与构建内部管理面板,强化系统可观测性与服务可靠性。

---

## 教育背景

**Java夜间集训营**  
*2019年 – 2020年*  
- 密集型全栈开发训练,重点为Java、Spring Boot及现代软件工程实践。

**机械工程学士**  
*2016年毕业*

---

## 个人项目

- **预算管理应用**(Spring Boot + Vue.js):模拟交易与对账流程的个人财务管理工具。
- **家庭物联网系统**(ESP32 + MQTT):基于事件驱动的设备监控与数据采集系统。

---
*简历内容已根据金融科技后端工程师职位优化,可进一步按需调整重点。*

从优化后的简历来看,因为我们是针对后端岗位优化,所以把跟前端相关的项目和技能,尽量弱化掉了。

三、结构化输出的顺序工作流

工作流的输出结果,也可以变成结构化输出,先定义1个Agent

/**
 * 根据个人资料和岗位要求,生成优化后的简历
 * @author junmingyang
 */
public interface SequenceCvGenerator {
    @Agent("根据用户提供的信息和特定要求生成简历,内容简洁,避免空行")
    ResultWithAgenticScope<Map<String, String>> generateTailoredCv(@V("lifeStory") String lifeStory, @V("instructions") String instructions);
}

这个接口接收个人资料和岗位要求,返回结构化简历。下面改用全栈工程师岗位演示。

package com.cnblogs.yjmyzz.langchain4j.study.agentic._2_sequential_workflow;

import com.cnblogs.yjmyzz.langchain4j.study.AgentDesignPatternApplication;
import com.cnblogs.yjmyzz.langchain4j.study.agentic._1_basic_agent.CvGenerator;
import com.cnblogs.yjmyzz.langchain4j.study.util.AgenticScopePrinter;
import com.cnblogs.yjmyzz.langchain4j.study.util.StringLoader;
import dev.langchain4j.agentic.AgenticServices;
import dev.langchain4j.agentic.UntypedAgent;
import dev.langchain4j.agentic.scope.AgenticScope;
import dev.langchain4j.agentic.scope.ResultWithAgenticScope;
import dev.langchain4j.model.chat.ChatModel;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.io.IOException;
import java.util.Map;

/**
 * 【顺序工作流示例】(改编自<a href="https://github.com/langchain4j/langchain4j-examples">langchain4j官网示例</a>)
 * 该示例演示了如何实现两个Agent:
 * - CvGenerator(接收个人简介并生成一份完整的主简历)
 * - CvTailor(接收原始简历并根据特定指令(职位描述、反馈等)进行定制)
 * 然后使用 sequenceBuilder 按顺序工作流依次调用它们,
 * 并演示如何在它们之间传递参数。
 * 当组合多个Agent时,所有输入、中间和输出参数以及调用链都存储在
 * AgenticScope 中,可供高级用例访问。
 */
public class _2b_Sequential_Agent_Example_Typed {

    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext context = SpringApplication.run(AgentDesignPatternApplication.class, args);
        ChatModel model = context.getBean("ollamaChatModel", ChatModel.class);


        CvGenerator cvGenerator = AgenticServices
                .agentBuilder(CvGenerator.class)
                .chatModel(model)
                .outputKey("masterCv")
                // 如果要将此变量从agent-1传递到agent-2,
                // 请确保此处的outputKey与第二个agent接口中指定的输入变量名匹配
                // 对应 CvTailor.java 文件中的变量名
                .build();


        CvTailor cvTailor = AgenticServices
                .agentBuilder(CvTailor.class)
                // 注意:可以为不同agent使用不同的模型
                .chatModel(model)
                // 定义输出对象的键
                // 如果在这里使用 "masterCv",原始的主简历会被第二个agent覆盖
                .outputKey("tailoredCv")
                .build();

        // 从 resources/documents/ 目录下的文本文件加载参数
        // - user_life_story.txt
        // - job_description_backend.txt
        String lifeStory = StringLoader.loadFromResource("/documents/user_life_story.txt");
        String instructions = "根据以下职位描述优化简历。" + StringLoader.loadFromResource("/documents/job_description_fullstack.txt");

        SequenceCvGenerator sequenceCvGenerator = AgenticServices
                //这里指定类型化接口
                .sequenceBuilder(SequenceCvGenerator.class)
                .subAgents(cvGenerator, cvTailor)
                .outputKey("bothCvsAndLifeStory")
                .output(agenticScope -> {
                    // 可以使用任何方法,本示例中用Map收集一些内部变量
                    return Map.of(
                            "lifeStory", agenticScope.readState("lifeStory", ""),
                            "masterCv", agenticScope.readState("masterCv", ""),
                            "tailoredCv", agenticScope.readState("tailoredCv", "")
                    );
                })
                .build();

        // 调用类型化的组合 agent
        ResultWithAgenticScope<Map<String, String>> bothCvsAndScope = sequenceCvGenerator.generateTailoredCv(lifeStory, instructions);

        // 提取结果和 agenticScope
        AgenticScope agenticScope = bothCvsAndScope.agenticScope();
        Map<String, String> bothCvsAndLifeStory = bothCvsAndScope.result();

        System.out.println("=== 用户信息(输入) ===");
        String userStory = bothCvsAndLifeStory.get("lifeStory");
        System.out.println(lifeStory);
        System.out.println("=== 原始简历(结构化)(中间变量) ===");
        String masterCv = bothCvsAndLifeStory.get("masterCv");
        System.out.println(masterCv);
        System.out.println("=== 定制简历(结构化)(输出) ===");
        String tailoredCv = bothCvsAndLifeStory.get("tailoredCv");
        System.out.println(tailoredCv);

        // 非结构化和结构化的 agent 会给出相同的定制简历结果
        // (如果有差异,也是源于 LLM 自身的非幂等性)
        // 但结构的 agent 使用起来更优雅,并且因为编译时类型检查而更安全

        System.out.println("=== AGENTIC 作用域 ===");
        System.out.println(AgenticScopePrinter.printPretty(agenticScope, 300));
        // 返回结果示例:
        // AgenticScope {
        //     memoryId = "e705028d-e90e-47df-9709-95953e84878c",
        //             state = {
        //                     bothCvsAndLifeStory = { // output
        //                             masterCv = "...",
        //                            lifeStory = "...",
        //                            tailoredCv = "..."
        //                     },
        //                     instructions = "...", // inputs and intermediary variables
        //                     tailoredCv = "...",
        //                     masterCv = "...",
        //                     lifeStory = "..."
        //             }
        // }
        System.out.println("=== 上下文作为对话(对话中的所有消息) ===");
        System.out.println(AgenticScopePrinter.printConversation(agenticScope.contextAsConversation(), 300));
    }
}

主要变化点在于60-76行,运行结果如下:

展开原文日志或请求/响应(未复测)
2026-01-11T20:41:57.780+08:00  INFO 21072 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: http://localhost:11434/api/chat
- headers: [Content-Type: application/json]
- body: {
  "model" : "deepseek-v3.1:671b-cloud",
  "messages" : [ {
    "role" : "user",
    "content" : "以下是我的个人生活和职业经历信息,\n请将其整理成一份清晰、完整的简历。\n\n注意事项:\n1. 不要编造任何事实\n2. 不要遗漏任何技能或经历\n3. 这份简历后续会进一步优化,请确保内容完整\n\n我的个人经历:John Doe 现居比利时安特卫普(Rue des Carmes 12, 2000 Antwerp),联系方式为 john.doe.dev@protonmail.com 或 +32 495 67 89 23。他在 LinkedIn 和 GitHub 上保持活跃。\r\n\r\n- 2020 年完成夜间 Java 集训营(2019–2020)后从机械工程领域转型至软件开发。\r\n- 拥有 4 年软件开发经验,其中最近 2 年专注于 Java 后端开发(Spring Boot、PostgreSQL、Kafka 基础)。\r\n- 开发了一款内部报价工具,将报价周转时间缩短约 35%。\r\n- 领导 3 人专项小组,将遗留 SOAP 服务迁移至 REST 架构。\r\n- 熟悉 Docker 与 CI 流水线(GitHub Actions)。\r\n- 具备 React 使用经验,曾开发内部管理面板(非核心优势)。\r\n- 重视代码整洁与可维护性,乐于指导实习生。\r\n- 偏好产品开发而非外包项目;不喜冗长会议,注重交付实际价值。\r\n- 语言:荷兰语(母语)、英语(C1)、法语(B1)。\r\n- 教育背景:机械工程学士(2016 年),Java 集训营(2019–2020)。\r\n- 个人项目包括一款小型预算管理应用(Spring + Vue)和一套家庭物联网系统(ESP32 + MQTT)。\n"
  } ],
  "options" : {
    "stop" : [ ]
  },
  "stream" : false,
  "tools" : [ ]
}

2026-01-11T20:42:06.893+08:00  INFO 21072 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP response:
- status code: 200
- headers: [content-type: application/json; charset=utf-8], [date: Sun, 11 Jan 2026 12:42:06 GMT], [transfer-encoding: chunked]
- body: {"model":"deepseek-v3.1:671b-cloud","remote_model":"deepseek-v3.1:671b","remote_host":"https://ollama.com:443","created_at":"2026-01-11T12:42:06.611323753Z","message":{"role":"assistant","content":"根据您提供的信息,已整理成一份清晰、完整的初步简历。内容严格依据您的要求,未做任何编造或遗漏。\n\n---\n\n**John Doe**  \n地址:Rue des Carmes 12, 2000 Antwerp, Belgium  \n邮箱:john.doe.dev@protonmail.com  \n电话:+32 495 67 89 23  \nLinkedIn: [您的个人主页链接]  \nGitHub: [您的个人主页链接]  \n\n---\n\n### 专业摘要  \n- 拥有4年软件开发经验,其中最近2年专注于Java后端开发(Spring Boot, PostgreSQL, Kafka基础)。  \n- 2020年通过夜间Java集训营(2019–2020)成功从机械工程领域转型至软件开发。  \n- 具备全栈开发经验,熟悉React、Docker及CI流水线(GitHub Actions)。  \n- 领导过3人专项小组,完成遗留系统迁移,并开发内部工具提升工作效率。  \n- 重视代码整洁与可维护性,乐于指导团队成员,注重交付实际价值。  \n- 语言:荷兰语(母语)、英语(C1)、法语(B1)。  \n\n---\n\n### 工作经验  \n\n**后端开发经验(2020年至今)**  \n- 开发内部报价工具,将报价周转时间缩短约35%。  \n- 领导3人专项小组,将遗留SOAP服务迁移至REST架构。  \n- 使用Spring Boot、PostgreSQL和Kafka进行后端开发。  \n- 熟悉Docker容器化及CI/CD流水线(GitHub Actions)。  \n- 具备React使用经验,曾开发内部管理面板(非核心优势)。  \n\n---\n\n### 技能  \n- **后端开发**:Java, Spring Boot, PostgreSQL, Kafka基础, REST API  \n- **前端开发**:React, Vue  \n- **工具与技术**:Docker, GitHub Actions, MQTT, ESP32  \n- **软技能**:团队领导、代码指导、注重交付价值、产品导向开发  \n\n---\n\n### 教育背景  \n- **机械工程学士**(2016年)  \n- **Java夜间集训营**(2019–2020)  \n\n---\n\n### 个人项目  \n- **小型预算管理应用**:使用Spring Boot与Vue开发的全栈应用。  \n- **家庭物联网系统**:基于ESP32与MQTT的智能家居解决方案。  \n\n---\n\n### 附加信息  \n- 偏好产品开发而非外包项目;不喜冗长会议,注重实效。  \n- 乐于指导实习生,重视团队合作与知识分享。  \n\n---\n\n如需进一步优化(如增强成果量化、调整表述方式或适配特定岗位),请随时告知。"},"done":true,"done_reason":"stop","total_duration":7657802130,"prompt_eval_count":387,"eval_count":561}


2026-01-11T20:42:06.923+08:00  INFO 21072 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: http://localhost:11434/api/chat
- headers: [Content-Type: application/json]
- body: {
  "model" : "deepseek-v3.1:671b-cloud",
  "messages" : [ {
    "role" : "system",
    "content" : "这里有一份需要根据特定职位描述、反馈或其他指示进行优化的简历。\n你可以让简历看起来更符合要求,但不能编造事实。\n如果去掉不相关的内容能让简历更符合要求,你可以进行删减。\n目标是让申请人获得面试机会,并能在面试中证明简历内容。不要让简历过于冗长。\n\n原始简历:根据您提供的信息,已整理成一份清晰、完整的初步简历。内容严格依据您的要求,未做任何编造或遗漏。\n\n---\n\n**John Doe**  \n地址:Rue des Carmes 12, 2000 Antwerp, Belgium  \n邮箱:john.doe.dev@protonmail.com  \n电话:+32 495 67 89 23  \nLinkedIn: [您的个人主页链接]  \nGitHub: [您的个人主页链接]  \n\n---\n\n### 专业摘要  \n- 拥有4年软件开发经验,其中最近2年专注于Java后端开发(Spring Boot, PostgreSQL, Kafka基础)。  \n- 2020年通过夜间Java集训营(2019–2020)成功从机械工程领域转型至软件开发。  \n- 具备全栈开发经验,熟悉React、Docker及CI流水线(GitHub Actions)。  \n- 领导过3人专项小组,完成遗留系统迁移,并开发内部工具提升工作效率。  \n- 重视代码整洁与可维护性,乐于指导团队成员,注重交付实际价值。  \n- 语言:荷兰语(母语)、英语(C1)、法语(B1)。  \n\n---\n\n### 工作经验  \n\n**后端开发经验(2020年至今)**  \n- 开发内部报价工具,将报价周转时间缩短约35%。  \n- 领导3人专项小组,将遗留SOAP服务迁移至REST架构。  \n- 使用Spring Boot、PostgreSQL和Kafka进行后端开发。  \n- 熟悉Docker容器化及CI/CD流水线(GitHub Actions)。  \n- 具备React使用经验,曾开发内部管理面板(非核心优势)。  \n\n---\n\n### 技能  \n- **后端开发**:Java, Spring Boot, PostgreSQL, Kafka基础, REST API  \n- **前端开发**:React, Vue  \n- **工具与技术**:Docker, GitHub Actions, MQTT, ESP32  \n- **软技能**:团队领导、代码指导、注重交付价值、产品导向开发  \n\n---\n\n### 教育背景  \n- **机械工程学士**(2016年)  \n- **Java夜间集训营**(2019–2020)  \n\n---\n\n### 个人项目  \n- **小型预算管理应用**:使用Spring Boot与Vue开发的全栈应用。  \n- **家庭物联网系统**:基于ESP32与MQTT的智能家居解决方案。  \n\n---\n\n### 附加信息  \n- 偏好产品开发而非外包项目;不喜冗长会议,注重实效。  \n- 乐于指导实习生,重视团队合作与知识分享。  \n\n---\n\n如需进一步优化(如增强成果量化、调整表述方式或适配特定岗位),请随时告知。\n"
  }, {
    "role" : "user",
    "content" : "以下是优化简历的具体要求:根据以下职位描述优化简历。职位描述 ID: 123B\r\n全栈开发工程师(SaaS 数据分析平台,欧盟远程)\r\n------------------------------------------------\r\n我们正在寻找一位**全栈开发工程师**加入我们的 SaaS 数据分析平台团队。该岗位将涉及后端和前端的工作,核心是为数据密集型产品提供高质量的用户体验。\r\n\r\n**职责:**\r\n*   使用 **Java** 或 **Node.js** 开发和维护后端服务,数据存储在 **PostgreSQL** 和 **Redis** 中。\r\n*   使用 **React** 构建并完善仪表板和管理工具。\r\n*   与产品经理和设计师合作,完成功能的端到端上线。\r\n*   参与扩展用于数据处理的异步任务系统。\r\n\r\n**要求:**\r\n*   扎实的后端开发经验(Java 或 Node.js)。\r\n*   具备现代 JavaScript 框架(最好是 React)的实际项目经验。\r\n*   深入了解数据库和缓存解决方案。\r\n*   能够在远程团队中独立工作,将功能从概念推进到生产。\r\n*   有 SaaS 产品交付经验者优先。\r\n*   要求英语熟练。\n"
  } ],
  "options" : {
    "stop" : [ ]
  },
  "stream" : false,
  "tools" : [ ]
}

2026-01-11T20:42:36.407+08:00  INFO 21072 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP response:
- status code: 200
- headers: [content-type: application/json; charset=utf-8], [date: Sun, 11 Jan 2026 12:42:36 GMT], [transfer-encoding: chunked]
- body: {"model":"deepseek-v3.1:671b-cloud","remote_model":"deepseek-v3.1:671b","remote_host":"https://ollama.com:443","created_at":"2026-01-11T12:42:35.893436143Z","message":{"role":"assistant","content":"**John Doe**  \n地址:Rue des Carmes 12, 2000 Antwerp, Belgium  \n邮箱:john.doe.dev@protonmail.com  \n电话:+32 495 67 89 23  \nLinkedIn: [您的个人主页链接]  \nGitHub: [您的个人主页链接]  \n\n---\n\n### 专业摘要  \n- 拥有4年软件开发经验,其中2年专注于**Java和Spring Boot后端开发**与**React前端开发**,具备**全栈能力**。\n- 熟练掌握 **PostgreSQL** 数据库应用,并有Redis基础知识;具备数据密集型产品开发经验。\n- 领导过3人小组完成遗留系统迁移,善于与团队协作,**将功能从概念推进到生产**。\n- 熟悉**异步任务处理**与系统扩展,具备Docker与GitHub Actions CI/CD实践经验。\n- 具备远程工作能力,英语熟练(C1),荷兰语母语,法语B1。\n\n---\n\n### 工作经验  \n\n**全栈开发工程师 | 当前公司 (2020年至今)**\n- 使用**Java(Spring Boot)与PostgreSQL**开发内部报价工具,**缩短报价周转时间35%**。\n- 领导3人专项小组,将遗留SOAP服务迁移至**REST架构**,提升系统可维护性。\n- **使用React开发内部管理面板**,优化用户体验,支持数据可视化与管理需求。\n- 参与异步任务处理系统优化,提升数据处理效率;熟悉**消息队列(Kafka)与缓存机制**。\n- 使用**Docker容器化部署**,并通过**GitHub Actions CI/CD流水线**实现自动化测试与发布。\n\n---\n\n### 技能  \n- **后端开发**:Java, Spring Boot, PostgreSQL, REST API, Redis基础  \n- **前端开发**:React, Vue  \n- **工具与技术**:Docker, GitHub Actions, Kafka, MQTT  \n- **软技能**:团队领导、产品导向开发、端到端功能交付、远程协作  \n\n---\n\n### 教育背景  \n- **机械工程学士**(2016年)  \n- **Java夜间集训营**(2019–2020)  \n\n---\n\n### 个人项目  \n- **小型预算管理应用**:使用Spring Boot与Vue开发的全栈应用,集成数据管理与可视化。  \n- **家庭物联网系统**:基于ESP32与MQTT的智能家居解决方案,涉及异步数据处理。\n\n---\n\n### 附加信息  \n- 偏好产品导向的全栈开发,注重交付可扩展、高质量的数据密集型应用。  \n- 具备远程团队协作经验,能够独立推动功能从设计到上线。  \n- 英语流利,能够无缝参与国际化团队沟通。  \n\n---"},"done":true,"done_reason":"stop","total_duration":28877931995,"prompt_eval_count":893,"eval_count":569}


=== 用户信息(输入) ===
John Doe 现居比利时安特卫普(Rue des Carmes 12, 2000 Antwerp),联系方式为 john.doe.dev@protonmail.com 或 +32 495 67 89 23。他在 LinkedIn 和 GitHub 上保持活跃。

- 2020 年完成夜间 Java 集训营(2019–2020)后从机械工程领域转型至软件开发。
- 拥有 4 年软件开发经验,其中最近 2 年专注于 Java 后端开发(Spring Boot、PostgreSQL、Kafka 基础)。
- 开发了一款内部报价工具,将报价周转时间缩短约 35%。
- 领导 3 人专项小组,将遗留 SOAP 服务迁移至 REST 架构。
- 熟悉 Docker 与 CI 流水线(GitHub Actions)。
- 具备 React 使用经验,曾开发内部管理面板(非核心优势)。
- 重视代码整洁与可维护性,乐于指导实习生。
- 偏好产品开发而非外包项目;不喜冗长会议,注重交付实际价值。
- 语言:荷兰语(母语)、英语(C1)、法语(B1)。
- 教育背景:机械工程学士(2016 年),Java 集训营(2019–2020)。
- 个人项目包括一款小型预算管理应用(Spring + Vue)和一套家庭物联网系统(ESP32 + MQTT)。
=== 原始简历(结构化)(中间变量) ===
根据您提供的信息,已整理成一份清晰、完整的初步简历。内容严格依据您的要求,未做任何编造或遗漏。

---

**John Doe**  
地址:Rue des Carmes 12, 2000 Antwerp, Belgium  
邮箱:john.doe.dev@protonmail.com  
电话:+32 495 67 89 23  
LinkedIn: [您的个人主页链接]  
GitHub: [您的个人主页链接]  

---

### 专业摘要  
- 拥有4年软件开发经验,其中最近2年专注于Java后端开发(Spring Boot, PostgreSQL, Kafka基础)。  
- 2020年通过夜间Java集训营(2019–2020)成功从机械工程领域转型至软件开发。  
- 具备全栈开发经验,熟悉React、Docker及CI流水线(GitHub Actions)。  
- 领导过3人专项小组,完成遗留系统迁移,并开发内部工具提升工作效率。  
- 重视代码整洁与可维护性,乐于指导团队成员,注重交付实际价值。  
- 语言:荷兰语(母语)、英语(C1)、法语(B1)。  

---

### 工作经验  

**后端开发经验(2020年至今)**  
- 开发内部报价工具,将报价周转时间缩短约35%。  
- 领导3人专项小组,将遗留SOAP服务迁移至REST架构。  
- 使用Spring Boot、PostgreSQL和Kafka进行后端开发。  
- 熟悉Docker容器化及CI/CD流水线(GitHub Actions)。  
- 具备React使用经验,曾开发内部管理面板(非核心优势)。  

---

### 技能  
- **后端开发**:Java, Spring Boot, PostgreSQL, Kafka基础, REST API  
- **前端开发**:React, Vue  
- **工具与技术**:Docker, GitHub Actions, MQTT, ESP32  
- **软技能**:团队领导、代码指导、注重交付价值、产品导向开发  

---

### 教育背景  
- **机械工程学士**(2016年)  
- **Java夜间集训营**(2019–2020)  

---

### 个人项目  
- **小型预算管理应用**:使用Spring Boot与Vue开发的全栈应用。  
- **家庭物联网系统**:基于ESP32与MQTT的智能家居解决方案。  

---

### 附加信息  
- 偏好产品开发而非外包项目;不喜冗长会议,注重实效。  
- 乐于指导实习生,重视团队合作与知识分享。  

---

如需进一步优化(如增强成果量化、调整表述方式或适配特定岗位),请随时告知。
=== 定制简历(结构化)(输出) ===
**John Doe**  
地址:Rue des Carmes 12, 2000 Antwerp, Belgium  
邮箱:john.doe.dev@protonmail.com  
电话:+32 495 67 89 23  
LinkedIn: [您的个人主页链接]  
GitHub: [您的个人主页链接]  

---

### 专业摘要  
- 拥有4年软件开发经验,其中2年专注于**Java和Spring Boot后端开发**与**React前端开发**,具备**全栈能力**。
- 熟练掌握 **PostgreSQL** 数据库应用,并有Redis基础知识;具备数据密集型产品开发经验。
- 领导过3人小组完成遗留系统迁移,善于与团队协作,**将功能从概念推进到生产**。
- 熟悉**异步任务处理**与系统扩展,具备Docker与GitHub Actions CI/CD实践经验。
- 具备远程工作能力,英语熟练(C1),荷兰语母语,法语B1。

---

### 工作经验  

**全栈开发工程师 | 当前公司 (2020年至今)**
- 使用**Java(Spring Boot)与PostgreSQL**开发内部报价工具,**缩短报价周转时间35%**。
- 领导3人专项小组,将遗留SOAP服务迁移至**REST架构**,提升系统可维护性。
- **使用React开发内部管理面板**,优化用户体验,支持数据可视化与管理需求。
- 参与异步任务处理系统优化,提升数据处理效率;熟悉**消息队列(Kafka)与缓存机制**。
- 使用**Docker容器化部署**,并通过**GitHub Actions CI/CD流水线**实现自动化测试与发布。

---

### 技能  
- **后端开发**:Java, Spring Boot, PostgreSQL, REST API, Redis基础  
- **前端开发**:React, Vue  
- **工具与技术**:Docker, GitHub Actions, Kafka, MQTT  
- **软技能**:团队领导、产品导向开发、端到端功能交付、远程协作  

---

### 教育背景  
- **机械工程学士**(2016年)  
- **Java夜间集训营**(2019–2020)  

---

### 个人项目  
- **小型预算管理应用**:使用Spring Boot与Vue开发的全栈应用,集成数据管理与可视化。  
- **家庭物联网系统**:基于ESP32与MQTT的智能家居解决方案,涉及异步数据处理。

---

### 附加信息  
- 偏好产品导向的全栈开发,注重交付可扩展、高质量的数据密集型应用。  
- 具备远程团队协作经验,能够独立推动功能从设计到上线。  
- 英语流利,能够无缝参与国际化团队沟通。  

---
=== AGENTIC 作用域 ===
{
  "memoryId": "9bb14821-f563-48ee-9539-75b3952e4755",
  "state": {
    "instructions": "根据以下职位描述优化简历。职位描述 ID: 123B\r\n全栈开发工程师(SaaS 数据分析平台,欧盟远程)\r\n------------------------------------------------\r\n我们正在寻找一位**全栈开发工程师**加入我们的 SaaS 数据分析平台团队。该岗位将涉及后端和前端的工作,核心是为数据密集型产品提供高质量的用户体验。\r\n\r\n**职责:**\r\n*   使用 **Java** 或 **Node.js** 开发和维护后端服务,数据存储在 **PostgreSQL** 和 **Redis** 中。\r\n*   使用 **React** 构建并完善仪表板和管理工 [truncated...]",
    "bothCvsAndLifeStory": "{tailoredCv=**John Doe**  \n地址:Rue des Carmes 12, 2000 Antwerp, Belgium  \n邮箱:john.doe.dev@protonmail.com  \n电话:+32 495 67 89 23  \nLinkedIn: [您的个人主页链接]  \nGitHub: [您的个人主页链接]  \n\n---\n\n### 专业摘要  \n- 拥有4年软件开发经验,其中2年专注于**Java和Spring Boot后端开发**与**React前端开发**,具备**全栈能力**。\n- 熟练掌握 **PostgreSQL** 数据库应用,并有Redis基础知识; [truncated...]",
    "tailoredCv": "**John Doe**  \n地址:Rue des Carmes 12, 2000 Antwerp, Belgium  \n邮箱:john.doe.dev@protonmail.com  \n电话:+32 495 67 89 23  \nLinkedIn: [您的个人主页链接]  \nGitHub: [您的个人主页链接]  \n\n---\n\n### 专业摘要  \n- 拥有4年软件开发经验,其中2年专注于**Java和Spring Boot后端开发**与**React前端开发**,具备**全栈能力**。\n- 熟练掌握 **PostgreSQL** 数据库应用,并有Redis基础知识;具备数据密集型产品开发经 [truncated...]",
    "masterCv": "根据您提供的信息,已整理成一份清晰、完整的初步简历。内容严格依据您的要求,未做任何编造或遗漏。\n\n---\n\n**John Doe**  \n地址:Rue des Carmes 12, 2000 Antwerp, Belgium  \n邮箱:john.doe.dev@protonmail.com  \n电话:+32 495 67 89 23  \nLinkedIn: [您的个人主页链接]  \nGitHub: [您的个人主页链接]  \n\n---\n\n### 专业摘要  \n- 拥有4年软件开发经验,其中最近2年专注于Java后端开发(Spring Boot, PostgreSQL, Kafka基础)。  \n- [truncated...]",
    "lifeStory": "John Doe 现居比利时安特卫普(Rue des Carmes 12, 2000 Antwerp),联系方式为 john.doe.dev@protonmail.com 或 +32 495 67 89 23。他在 LinkedIn 和 GitHub 上保持活跃。\r\n\r\n- 2020 年完成夜间 Java 集训营(2019–2020)后从机械工程领域转型至软件开发。\r\n- 拥有 4 年软件开发经验,其中最近 2 年专注于 Java 后端开发(Spring Boot、PostgreSQL、Kafka 基础)。\r\n- 开发了一款内部报价工具,将报价周转时间缩短约 35%。\r\n- 领导 3 人专项小 [truncated...]"
  }
}
=== 上下文作为对话(对话中的所有消息) ===
User: "以下是我的个人生活和职业经历信息,
请将其整理成一份清晰、完整的简历。

注意事项:
1. 不要编造任何事实
2. 不要遗漏任何技能或经历
3. 这份简历后续会进一步优化,请确保内容完整

我的个人经历:John Doe 现居比利时安特卫普(Rue des Carmes 12, 2000 Antwerp),联系方式为 john.doe.dev@protonmail.com 或 +32 495 67 89 23。他在 LinkedIn 和 GitHub 上保持活跃。

- 2020 年完成夜间 Java 集训营(2019–2020)后从机械工程领域转型至软件开发。
- 拥有 4 年软件开 [truncated...]

generateCv agent: "根据您提供的信息,已整理成一份清晰、完整的初步简历。内容严格依据您的要求,未做任何编造或遗漏。

---

**John Doe**  
地址:Rue des Carmes 12, 2000 Antwerp, Belgium  
邮箱:john.doe.dev@protonmail.com  
电话:+32 495 67 89 23  
LinkedIn: [您的个人主页链接]  
GitHub: [您的个人主页链接]  

---

### 专业摘要  
- 拥有4年软件开发经验,其中最近2年专注于Java后端开发(Spring Boot, PostgreSQL, Kafka基础)。  
 [truncated...]

User: "以下是优化简历的具体要求:根据以下职位描述优化简历。职位描述 ID: 123B
全栈开发工程师(SaaS 数据分析平台,欧盟远程)
------------------------------------------------
我们正在寻找一位**全栈开发工程师**加入我们的 SaaS 数据分析平台团队。该岗位将涉及后端和前端的工作,核心是为数据密集型产品提供高质量的用户体验。

**职责:**
*   使用 **Java** 或 **Node.js** 开发和维护后端服务,数据存储在 **PostgreSQL** 和 **Redis** 中。
*   使用 **React* [truncated...]

tailorCv agent: "**John Doe**  
地址:Rue des Carmes 12, 2000 Antwerp, Belgium  
邮箱:john.doe.dev@protonmail.com  
电话:+32 495 67 89 23  
LinkedIn: [您的个人主页链接]  
GitHub: [您的个人主页链接]  

---

### 专业摘要  
- 拥有4年软件开发经验,其中2年专注于**Java和Spring Boot后端开发**与**React前端开发**,具备**全栈能力**。
- 熟练掌握 **PostgreSQL** 数据库应用,并有Redis基础知识;具备数据密集型产品开发 [truncated...]

64-121行:优化前的原始简历

127-179行:优化后的简历,强化了“全栈”能力,重点突出了Vue相关的介绍。

小结

顺序工作流把简历生成与岗位定制依次连接起来,前一步的输出供后一步使用。