惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security Affairs
N
News and Events Feed by Topic
T
Tenable Blog
P
Proofpoint News Feed
W
WeLiveSecurity
Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
Help Net Security
Help Net Security
I
Intezer
T
Threat Research - Cisco Blogs
S
Secure Thoughts
C
Cyber Attacks, Cyber Crime and Cyber Security
L
Lohrmann on Cybersecurity
AWS News Blog
AWS News Blog
Google Online Security Blog
Google Online Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
The Hacker News
The Hacker News
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Tor Project blog
N
News | PayPal Newsroom
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
A
Arctic Wolf
Forbes - Security
Forbes - Security
O
OpenAI News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Latest
Security Latest
P
Palo Alto Networks Blog
S
Schneier on Security
S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
H
Heimdal Security Blog
V
Vulnerabilities – Threatpost
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
T
Troy Hunt's Blog
Latest news
Latest news
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
L
LINUX DO - 热门话题
M
MIT News - Artificial intelligence
N
Netflix TechBlog - Medium
V
Visual Studio Blog
H
Hacker News: Front Page

博客园 - 菩提树下的杨过

langchain4j 学习系列(10)-Skill使用示例 利用SWIG实现JAVA调用C/C++代码 LangGraph4j 学习系列(9)-人机协同(human_in_the_loop) LangGraph4j 学习系列(8)-checkpoint检查点 LangGraph4j 学习系列(7)-流式响应 LangGraph4j 学习系列(6)-并行工作流 LangGraph4j 学习系列(5)-Hook勾子 LangGraph4j 学习系列(4)-SCHEMA和Channel LangGraph4j 学习系列(3)-循环工作流 LangGraph4j 学习系列(2)-条件工作流 LangGraph4j 学习系列(1)-顺序工作流 Agent设计模式学习(基于langchain4j实现)(11) - PlanAndExecute Agent设计模式学习(基于langchain4j实现)(10) - ReACT Agent设计模式学习(基于langchain4j实现)(9) - 人机协同 Agent设计模式学习(基于langchain4j实现)(8) - 非AI智能体 Agent设计模式学习(基于langchain4j实现)(7) - 监督者模式 Agent设计模式学习(基于langchain4j实现)(6) - 组合复杂工作流 Agent设计模式学习(基于langchain4j实现)(5) - 条件工作流 Agent设计模式学习(基于langchain4j实现)(4) - 并行工作流 Agent设计模式学习(基于langchain4j实现)(3) - 循环工作流
Agent设计模式学习(基于langchain4j实现)(2) - 顺序工作流
菩提树下的杨过 · 2026-01-12 · via 博客园 - 菩提树下的杨过

上节继续,本篇将演示 顺序工作流的实现(即:Building Effective AI Agents \ Anthropic 中的 Prompt Chain模式)

seq_workflow

上一节,我们学会了如何基于个人资料,生成一份简历。有了简历,自然要投递到某个招聘岗位,假设有个“全栈工程师”的岗位JD要求如下:

job_description_fullstack.txt

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

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

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

另外,为了方便对比,假设还有1个后端工程师的岗位JD:

job_description_backend.txt

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

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

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

接下来,我们要将生成的简历,针对这个JD要求,做些优化,以便让简历能更好的匹配这个岗位要求。

一、定义简历优化Agent

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

View Code

注:这个Agent的作用是接受“简历” +“岗位要求”,生成优化后的简历

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

 1 /**
 2  * 【顺序工作流示例】(改编自<a href="https://github.com/langchain4j/langchain4j-examples">langchain4j官网示例</a>)
 3  * 该示例演示了如何实现两个Agent:
 4  * - CvGenerator(接收个人简介并生成一份完整的主简历)
 5  * - CvTailor(接收原始简历并根据特定指令(职位描述、反馈等)进行定制)
 6  * 然后使用 sequenceBuilder 按顺序工作流依次调用它们,
 7  * 并演示如何在它们之间传递参数。
 8  */
 9 public class _2a_Sequential_Agent_Example {
10 
11     public static void main(String[] args) throws IOException {
12         ConfigurableApplicationContext context = SpringApplication.run(AgentDesignPatternApplication.class, args);
13         ChatModel model = context.getBean("ollamaChatModel", ChatModel.class);
14 
15 
16         CvGenerator cvGenerator = AgenticServices
17                 .agentBuilder(CvGenerator.class)
18                 .chatModel(model)
19                 .outputKey("masterCv")
20                 // 如果要将此变量从agent-1传递到agent-2,
21                 // 请确保此处的outputKey与第二个agent接口中指定的输入变量名匹配
22                 // 对应 CvTailor.java 文件中的变量名
23                 .build();
24 
25 
26         CvTailor cvTailor = AgenticServices
27                 .agentBuilder(CvTailor.class)
28                 // 注意:可以为不同agent使用不同的模型
29                 .chatModel(model)
30                 // 定义输出对象的键
31                 // 如果在这里使用 "masterCv",原始的主简历会被第二个agent覆盖
32                 .outputKey("tailoredCv")
33                 .build();
34 
35         UntypedAgent tailoredCvGenerator = AgenticServices
36                 .sequenceBuilder()
37                 // 可以包含任意多个代理,顺序很重要
38                 .subAgents(cvGenerator, cvTailor)
39                 // 这是合成Agent的最终输出
40                 // 注意:可以使用 AgenticScope 中的任何字段作为输出
41                 // 例如,可以输出 'masterCv' 而不是 tailoredCv(尽管在本例中没有意义)
42                 .outputKey("tailoredCv")
43                 .build();
44 
45         // 从 resources/documents/ 目录下的文本文件加载参数
46         // - user_life_story.txt
47         // - job_description_backend.txt
48         String lifeStory = StringLoader.loadFromResource("/documents/user_life_story.txt");
49         String instructions = "根据以下职位描述优化简历。" + StringLoader.loadFromResource("/documents/job_description_backend.txt");
50 
51         // 由于使用的是无类型Agent,需要传递参数映射
52         Map<String, Object> arguments = Map.of(
53                 // 匹配 CvGenerator.java 中的变量名
54                 "lifeStory", lifeStory,
55                 // 匹配 CvTailor.java 中的变量名
56                 "instructions", instructions
57         );
58 
59         // 调用合成 Agent 生成优化后的简历
60         String tailoredCv = (String) tailoredCvGenerator.invoke(arguments);
61 
62         // 打印生成的简历
63         System.out.println("=== 优化后的简历(无类型代理)===");
64         System.out.println((String) tailoredCv);
65         // 可以尝试,当使用job_description_fullstack.txt 作为输入时,
66         // 生成的简历会有很大不同
67     }
68 }

View Code

 解释一下:

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

图示如下:

image

时序图(简化版) -- 由AI生成

02_sequential_diagram_simple

时序图(详细版) -- 由AI生成

02_sequential_diagram_detail

运行结果:

  1 2026-01-11T20:26:25.538+08:00  INFO 7904 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP request:
  2 - method: POST
  3 - url: http://localhost:11434/api/chat
  4 - headers: [Content-Type: application/json]
  5 - body: {
  6   "model" : "deepseek-v3.1:671b-cloud",
  7   "messages" : [ {
  8     "role" : "user",
  9     "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"
 10   } ],
 11   "options" : {
 12     "stop" : [ ]
 13   },
 14   "stream" : false,
 15   "tools" : [ ]
 16 }
 17 
 18 2026-01-11T20:26:34.001+08:00  INFO 7904 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP response:
 19 - status code: 200
 20 - headers: [content-type: application/json; charset=utf-8], [date: Sun, 11 Jan 2026 12:26:33 GMT], [transfer-encoding: chunked]
 21 - 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}
 22 
 23 
 24 2026-01-11T20:26:34.037+08:00  INFO 7904 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP request:
 25 - method: POST
 26 - url: http://localhost:11434/api/chat
 27 - headers: [Content-Type: application/json]
 28 - body: {
 29   "model" : "deepseek-v3.1:671b-cloud",
 30   "messages" : [ {
 31     "role" : "system",
 32     "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"
 33   }, {
 34     "role" : "user",
 35     "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"
 36   } ],
 37   "options" : {
 38     "stop" : [ ]
 39   },
 40   "stream" : false,
 41   "tools" : [ ]
 42 }
 43 
 44 2026-01-11T20:26:39.942+08:00  INFO 7904 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP response:
 45 - status code: 200
 46 - headers: [content-type: application/json; charset=utf-8], [date: Sun, 11 Jan 2026 12:26:39 GMT], [transfer-encoding: chunked]
 47 - 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}
 48 
 49 
 50 === 优化后的简历(无类型代理)===
 51 **John Doe**  
 52 Rue des Carmes 12, 2000 Antwerp, Belgium  
 53 +32 495 67 89 23 | john.doe.dev@protonmail.com  
 54 LinkedIn | GitHub
 55 
 56 ---
 57 
 58 ## 个人简介
 59 
 60 拥有4年经验的Java后端工程师,专注于构建可靠、可扩展的系统。具备Spring Boot、PostgreSQL、Kafka和Docker实践经验,曾主导服务迁移与内部工具开发,提升系统效率与处理能力。熟悉金融相关系统开发,曾参与报价工具开发以优化流程。追求代码质量与团队协作,偏好产品导向的金融科技环境。荷兰语母语,英语流利(C1)。
 61 
 62 ---
 63 
 64 ## 技术能力
 65 
 66 - **后端开发**: Java, Spring Boot, REST APIs, SOAP, PostgreSQL
 67 - **工具与平台**: Docker, Kafka, GitHub Actions (CI), Kubernetes (了解中)
 68 - **架构经验**: 事件驱动系统、服务迁移、系统可维护性与可观测性
 69 - **语言**: 荷兰语 (母语), 英语 (C1), 法语 (B1)
 70 
 71 ---
 72 
 73 ## 职业经历
 74 
 75 **软件开发工程师**  
 76 *2020年 – 至今*  
 77 - 使用Spring Boot和PostgreSQL开发并维护高可用后端服务,处理业务流程与数据对账。
 78 - 主导3人专项小组,将遗留SOAP服务迁移至REST架构,提升系统可扩展性。
 79 - 设计并实现内部报价工具,将报价周转时间缩短35%,支持定价流程优化。
 80 - 使用Docker容器化应用,结合GitHub Actions搭建CI流水线,提升部署效率。
 81 - 参与构建内部管理面板,强化系统可观测性与服务可靠性。
 82 
 83 ---
 84 
 85 ## 教育背景
 86 
 87 **Java夜间集训营**  
 88 *2019年 – 2020年*  
 89 - 密集型全栈开发训练,重点为Java、Spring Boot及现代软件工程实践。
 90 
 91 **机械工程学士**  
 92 *2016年毕业*
 93 
 94 ---
 95 
 96 ## 个人项目
 97 
 98 - **预算管理应用**(Spring Boot + Vue.js):模拟交易与对账流程的个人财务管理工具。
 99 - **家庭物联网系统**(ESP32 + MQTT):基于事件驱动的设备监控与数据采集系统。
100 
101 ---
102 *简历内容已根据金融科技后端工程师职位优化,可进一步按需调整重点。*

View Code

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

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

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

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

很明显,这个Agent接受 个人资料+岗位要求,直接一步到位的输出优化后的简历,这一次我们使用全栈工程师的岗位来优化

  1 package com.cnblogs.yjmyzz.langchain4j.study.agentic._2_sequential_workflow;
  2 
  3 import com.cnblogs.yjmyzz.langchain4j.study.AgentDesignPatternApplication;
  4 import com.cnblogs.yjmyzz.langchain4j.study.agentic._1_basic_agent.CvGenerator;
  5 import com.cnblogs.yjmyzz.langchain4j.study.util.AgenticScopePrinter;
  6 import com.cnblogs.yjmyzz.langchain4j.study.util.StringLoader;
  7 import dev.langchain4j.agentic.AgenticServices;
  8 import dev.langchain4j.agentic.UntypedAgent;
  9 import dev.langchain4j.agentic.scope.AgenticScope;
 10 import dev.langchain4j.agentic.scope.ResultWithAgenticScope;
 11 import dev.langchain4j.model.chat.ChatModel;
 12 import org.springframework.boot.SpringApplication;
 13 import org.springframework.context.ConfigurableApplicationContext;
 14 
 15 import java.io.IOException;
 16 import java.util.Map;
 17 
 18 /**
 19  * 【顺序工作流示例】(改编自<a href="https://github.com/langchain4j/langchain4j-examples">langchain4j官网示例</a>)
 20  * 该示例演示了如何实现两个Agent:
 21  * - CvGenerator(接收个人简介并生成一份完整的主简历)
 22  * - CvTailor(接收原始简历并根据特定指令(职位描述、反馈等)进行定制)
 23  * 然后使用 sequenceBuilder 按顺序工作流依次调用它们,
 24  * 并演示如何在它们之间传递参数。
 25  * 当组合多个Agent时,所有输入、中间和输出参数以及调用链都存储在
 26  * AgenticScope 中,可供高级用例访问。
 27  */
 28 public class _2b_Sequential_Agent_Example_Typed {
 29 
 30     public static void main(String[] args) throws IOException {
 31         ConfigurableApplicationContext context = SpringApplication.run(AgentDesignPatternApplication.class, args);
 32         ChatModel model = context.getBean("ollamaChatModel", ChatModel.class);
 33 
 34 
 35         CvGenerator cvGenerator = AgenticServices
 36                 .agentBuilder(CvGenerator.class)
 37                 .chatModel(model)
 38                 .outputKey("masterCv")
 39                 // 如果要将此变量从agent-1传递到agent-2,
 40                 // 请确保此处的outputKey与第二个agent接口中指定的输入变量名匹配
 41                 // 对应 CvTailor.java 文件中的变量名
 42                 .build();
 43 
 44 
 45         CvTailor cvTailor = AgenticServices
 46                 .agentBuilder(CvTailor.class)
 47                 // 注意:可以为不同agent使用不同的模型
 48                 .chatModel(model)
 49                 // 定义输出对象的键
 50                 // 如果在这里使用 "masterCv",原始的主简历会被第二个agent覆盖
 51                 .outputKey("tailoredCv")
 52                 .build();
 53 
 54         // 从 resources/documents/ 目录下的文本文件加载参数
 55         // - user_life_story.txt
 56         // - job_description_backend.txt
 57         String lifeStory = StringLoader.loadFromResource("/documents/user_life_story.txt");
 58         String instructions = "根据以下职位描述优化简历。" + StringLoader.loadFromResource("/documents/job_description_fullstack.txt");
 59 
 60         SequenceCvGenerator sequenceCvGenerator = AgenticServices
 61                 //这里指定类型化接口
 62                 .sequenceBuilder(SequenceCvGenerator.class)
 63                 .subAgents(cvGenerator, cvTailor)
 64                 .outputKey("bothCvsAndLifeStory")
 65                 .output(agenticScope -> {
 66                     // 可以使用任何方法,本示例中用Map收集一些内部变量
 67                     return Map.of(
 68                             "lifeStory", agenticScope.readState("lifeStory", ""),
 69                             "masterCv", agenticScope.readState("masterCv", ""),
 70                             "tailoredCv", agenticScope.readState("tailoredCv", "")
 71                     );
 72                 })
 73                 .build();
 74 
 75         // 调用类型化的组合 agent
 76         ResultWithAgenticScope<Map<String, String>> bothCvsAndScope = sequenceCvGenerator.generateTailoredCv(lifeStory, instructions);
 77 
 78         // 提取结果和 agenticScope
 79         AgenticScope agenticScope = bothCvsAndScope.agenticScope();
 80         Map<String, String> bothCvsAndLifeStory = bothCvsAndScope.result();
 81 
 82         System.out.println("=== 用户信息(输入) ===");
 83         String userStory = bothCvsAndLifeStory.get("lifeStory");
 84         System.out.println(lifeStory);
 85         System.out.println("=== 原始简历(结构化)(中间变量) ===");
 86         String masterCv = bothCvsAndLifeStory.get("masterCv");
 87         System.out.println(masterCv);
 88         System.out.println("=== 定制简历(结构化)(输出) ===");
 89         String tailoredCv = bothCvsAndLifeStory.get("tailoredCv");
 90         System.out.println(tailoredCv);
 91 
 92         // 非结构化和结构化的 agent 会给出相同的定制简历结果
 93         // (如果有差异,也是源于 LLM 自身的非幂等性)
 94         // 但结构的 agent 使用起来更优雅,并且因为编译时类型检查而更安全
 95 
 96         System.out.println("=== AGENTIC 作用域 ===");
 97         System.out.println(AgenticScopePrinter.printPretty(agenticScope, 300));
 98         // 返回结果示例:
 99         // AgenticScope {
100         //     memoryId = "e705028d-e90e-47df-9709-95953e84878c",
101         //             state = {
102         //                     bothCvsAndLifeStory = { // output
103         //                             masterCv = "...",
104         //                            lifeStory = "...",
105         //                            tailoredCv = "..."
106         //                     },
107         //                     instructions = "...", // inputs and intermediary variables
108         //                     tailoredCv = "...",
109         //                     masterCv = "...",
110         //                     lifeStory = "..."
111         //             }
112         // }
113         System.out.println("=== 上下文作为对话(对话中的所有消息) ===");
114         System.out.println(AgenticScopePrinter.printConversation(agenticScope.contextAsConversation(), 300));
115     }
116 }

View Code

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

  1 2026-01-11T20:41:57.780+08:00  INFO 21072 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP request:
  2 - method: POST
  3 - url: http://localhost:11434/api/chat
  4 - headers: [Content-Type: application/json]
  5 - body: {
  6   "model" : "deepseek-v3.1:671b-cloud",
  7   "messages" : [ {
  8     "role" : "user",
  9     "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"
 10   } ],
 11   "options" : {
 12     "stop" : [ ]
 13   },
 14   "stream" : false,
 15   "tools" : [ ]
 16 }
 17 
 18 2026-01-11T20:42:06.893+08:00  INFO 21072 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP response:
 19 - status code: 200
 20 - headers: [content-type: application/json; charset=utf-8], [date: Sun, 11 Jan 2026 12:42:06 GMT], [transfer-encoding: chunked]
 21 - 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}
 22 
 23 
 24 2026-01-11T20:42:06.923+08:00  INFO 21072 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP request:
 25 - method: POST
 26 - url: http://localhost:11434/api/chat
 27 - headers: [Content-Type: application/json]
 28 - body: {
 29   "model" : "deepseek-v3.1:671b-cloud",
 30   "messages" : [ {
 31     "role" : "system",
 32     "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"
 33   }, {
 34     "role" : "user",
 35     "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"
 36   } ],
 37   "options" : {
 38     "stop" : [ ]
 39   },
 40   "stream" : false,
 41   "tools" : [ ]
 42 }
 43 
 44 2026-01-11T20:42:36.407+08:00  INFO 21072 --- [langchain4j-study] [           main] d.l.http.client.log.LoggingHttpClient    : HTTP response:
 45 - status code: 200
 46 - headers: [content-type: application/json; charset=utf-8], [date: Sun, 11 Jan 2026 12:42:36 GMT], [transfer-encoding: chunked]
 47 - 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}
 48 
 49 
 50 === 用户信息(输入) ===
 51 John Doe 现居比利时安特卫普(Rue des Carmes 12, 2000 Antwerp),联系方式为 john.doe.dev@protonmail.com 或 +32 495 67 89 23。他在 LinkedIn 和 GitHub 上保持活跃。
 52 
 53 - 2020 年完成夜间 Java 集训营(20192020)后从机械工程领域转型至软件开发。
 54 - 拥有 4 年软件开发经验,其中最近 2 年专注于 Java 后端开发(Spring Boot、PostgreSQL、Kafka 基础)。
 55 - 开发了一款内部报价工具,将报价周转时间缩短约 35% 56 - 领导 3 人专项小组,将遗留 SOAP 服务迁移至 REST 架构。
 57 - 熟悉 Docker 与 CI 流水线(GitHub Actions)。
 58 - 具备 React 使用经验,曾开发内部管理面板(非核心优势)。
 59 - 重视代码整洁与可维护性,乐于指导实习生。
 60 - 偏好产品开发而非外包项目;不喜冗长会议,注重交付实际价值。
 61 - 语言:荷兰语(母语)、英语(C1)、法语(B1)。
 62 - 教育背景:机械工程学士(2016 年),Java 集训营(20192020)。
 63 - 个人项目包括一款小型预算管理应用(Spring + Vue)和一套家庭物联网系统(ESP32 + MQTT)。
 64 === 原始简历(结构化)(中间变量) ===
 65 根据您提供的信息,已整理成一份清晰、完整的初步简历。内容严格依据您的要求,未做任何编造或遗漏。
 66 
 67 ---
 68 
 69 **John Doe**  
 70 地址:Rue des Carmes 12, 2000 Antwerp, Belgium  
 71 邮箱:john.doe.dev@protonmail.com  
 72 电话:+32 495 67 89 23  
 73 LinkedIn: [您的个人主页链接]  
 74 GitHub: [您的个人主页链接]  
 75 
 76 ---
 77 
 78 ### 专业摘要  
 79 - 拥有4年软件开发经验,其中最近2年专注于Java后端开发(Spring Boot, PostgreSQL, Kafka基础)。  
 80 - 2020年通过夜间Java集训营(20192020)成功从机械工程领域转型至软件开发。  
 81 - 具备全栈开发经验,熟悉React、Docker及CI流水线(GitHub Actions)。  
 82 - 领导过3人专项小组,完成遗留系统迁移,并开发内部工具提升工作效率。  
 83 - 重视代码整洁与可维护性,乐于指导团队成员,注重交付实际价值。  
 84 - 语言:荷兰语(母语)、英语(C1)、法语(B1)。  
 85 
 86 ---
 87 
 88 ### 工作经验  
 89 
 90 **后端开发经验(2020年至今)**  
 91 - 开发内部报价工具,将报价周转时间缩短约35% 92 - 领导3人专项小组,将遗留SOAP服务迁移至REST架构。  
 93 - 使用Spring Boot、PostgreSQL和Kafka进行后端开发。  
 94 - 熟悉Docker容器化及CI/CD流水线(GitHub Actions)。  
 95 - 具备React使用经验,曾开发内部管理面板(非核心优势)。  
 96 
 97 ---
 98 
 99 ### 技能  
100 - **后端开发**:Java, Spring Boot, PostgreSQL, Kafka基础, REST API  
101 - **前端开发**:React, Vue  
102 - **工具与技术**:Docker, GitHub Actions, MQTT, ESP32  
103 - **软技能**:团队领导、代码指导、注重交付价值、产品导向开发  
104 
105 ---
106 
107 ### 教育背景  
108 - **机械工程学士**(2016年)  
109 - **Java夜间集训营**(20192020110 
111 ---
112 
113 ### 个人项目  
114 - **小型预算管理应用**:使用Spring Boot与Vue开发的全栈应用。  
115 - **家庭物联网系统**:基于ESP32与MQTT的智能家居解决方案。  
116 
117 ---
118 
119 ### 附加信息  
120 - 偏好产品开发而非外包项目;不喜冗长会议,注重实效。  
121 - 乐于指导实习生,重视团队合作与知识分享。  
122 
123 ---
124 
125 如需进一步优化(如增强成果量化、调整表述方式或适配特定岗位),请随时告知。
126 === 定制简历(结构化)(输出) ===
127 **John Doe**  
128 地址:Rue des Carmes 12, 2000 Antwerp, Belgium  
129 邮箱:john.doe.dev@protonmail.com  
130 电话:+32 495 67 89 23  
131 LinkedIn: [您的个人主页链接]  
132 GitHub: [您的个人主页链接]  
133 
134 ---
135 
136 ### 专业摘要  
137 - 拥有4年软件开发经验,其中2年专注于**Java和Spring Boot后端开发**与**React前端开发**,具备**全栈能力**138 - 熟练掌握 **PostgreSQL** 数据库应用,并有Redis基础知识;具备数据密集型产品开发经验。
139 - 领导过3人小组完成遗留系统迁移,善于与团队协作,**将功能从概念推进到生产**140 - 熟悉**异步任务处理**与系统扩展,具备Docker与GitHub Actions CI/CD实践经验。
141 - 具备远程工作能力,英语熟练(C1),荷兰语母语,法语B1。
142 
143 ---
144 
145 ### 工作经验  
146 
147 **全栈开发工程师 | 当前公司 (2020年至今)**
148 - 使用**Java(Spring Boot)与PostgreSQL**开发内部报价工具,**缩短报价周转时间35%**149 - 领导3人专项小组,将遗留SOAP服务迁移至**REST架构**,提升系统可维护性。
150 - **使用React开发内部管理面板**,优化用户体验,支持数据可视化与管理需求。
151 - 参与异步任务处理系统优化,提升数据处理效率;熟悉**消息队列(Kafka)与缓存机制**152 - 使用**Docker容器化部署**,并通过**GitHub Actions CI/CD流水线**实现自动化测试与发布。
153 
154 ---
155 
156 ### 技能  
157 - **后端开发**:Java, Spring Boot, PostgreSQL, REST API, Redis基础  
158 - **前端开发**:React, Vue  
159 - **工具与技术**:Docker, GitHub Actions, Kafka, MQTT  
160 - **软技能**:团队领导、产品导向开发、端到端功能交付、远程协作  
161 
162 ---
163 
164 ### 教育背景  
165 - **机械工程学士**(2016年)  
166 - **Java夜间集训营**(20192020167 
168 ---
169 
170 ### 个人项目  
171 - **小型预算管理应用**:使用Spring Boot与Vue开发的全栈应用,集成数据管理与可视化。  
172 - **家庭物联网系统**:基于ESP32与MQTT的智能家居解决方案,涉及异步数据处理。
173 
174 ---
175 
176 ### 附加信息  
177 - 偏好产品导向的全栈开发,注重交付可扩展、高质量的数据密集型应用。  
178 - 具备远程团队协作经验,能够独立推动功能从设计到上线。  
179 - 英语流利,能够无缝参与国际化团队沟通。  
180 
181 ---
182 === AGENTIC 作用域 ===
183 {
184   "memoryId": "9bb14821-f563-48ee-9539-75b3952e4755",
185   "state": {
186     "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...]",
187     "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...]",
188     "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...]",
189     "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...]",
190     "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...]"
191   }
192 }
193 === 上下文作为对话(对话中的所有消息) ===
194 User: "以下是我的个人生活和职业经历信息,
195 请将其整理成一份清晰、完整的简历。
196 
197 注意事项:
198 1. 不要编造任何事实
199 2. 不要遗漏任何技能或经历
200 3. 这份简历后续会进一步优化,请确保内容完整
201 
202 我的个人经历:John Doe 现居比利时安特卫普(Rue des Carmes 12, 2000 Antwerp),联系方式为 john.doe.dev@protonmail.com 或 +32 495 67 89 23。他在 LinkedIn 和 GitHub 上保持活跃。
203 
204 - 2020 年完成夜间 Java 集训营(20192020)后从机械工程领域转型至软件开发。
205 - 拥有 4 年软件开 [truncated...]
206 
207 generateCv agent: "根据您提供的信息,已整理成一份清晰、完整的初步简历。内容严格依据您的要求,未做任何编造或遗漏。
208 
209 ---
210 
211 **John Doe**  
212 地址:Rue des Carmes 12, 2000 Antwerp, Belgium  
213 邮箱:john.doe.dev@protonmail.com  
214 电话:+32 495 67 89 23  
215 LinkedIn: [您的个人主页链接]  
216 GitHub: [您的个人主页链接]  
217 
218 ---
219 
220 ### 专业摘要  
221 - 拥有4年软件开发经验,其中最近2年专注于Java后端开发(Spring Boot, PostgreSQL, Kafka基础)。  
222  [truncated...]
223 
224 User: "以下是优化简历的具体要求:根据以下职位描述优化简历。职位描述 ID: 123B
225 全栈开发工程师(SaaS 数据分析平台,欧盟远程)
226 ------------------------------------------------
227 我们正在寻找一位**全栈开发工程师**加入我们的 SaaS 数据分析平台团队。该岗位将涉及后端和前端的工作,核心是为数据密集型产品提供高质量的用户体验。
228 
229 **职责:**
230 *   使用 **Java** 或 **Node.js** 开发和维护后端服务,数据存储在 **PostgreSQL** 和 **Redis** 中。
231 *   使用 **React* [truncated...]
232 
233 tailorCv agent: "**John Doe**  
234 地址:Rue des Carmes 12, 2000 Antwerp, Belgium  
235 邮箱:john.doe.dev@protonmail.com  
236 电话:+32 495 67 89 23  
237 LinkedIn: [您的个人主页链接]  
238 GitHub: [您的个人主页链接]  
239 
240 ---
241 
242 ### 专业摘要  
243 - 拥有4年软件开发经验,其中2年专注于**Java和Spring Boot后端开发**与**React前端开发**,具备**全栈能力**244 - 熟练掌握 **PostgreSQL** 数据库应用,并有Redis基础知识;具备数据密集型产品开发 [truncated...]

View Code

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

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

小结

本文示例了通过针对特定岗位进行简历优化的案例,演示了如何使用langchain4j的agentic特性构建顺序工作流的Agent。

文中示例代码:

https://github.com/yjmyzz/agentic_turoial_with_langchain4j

参考:

Building Effective AI Agents \ Anthropic

[译] AI Workflow & AI Agent:架构、模式与工程建议(Anthropic,2024)

Agents and Agentic AI | LangChain4j