news 2026/10/23 6:04:00

快速上手 LangChain4j 智能体工作流编排:4 种模式串起一条简历筛选流水线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
快速上手 LangChain4j 智能体工作流编排:4 种模式串起一条简历筛选流水线

快速上手 LangChain4j 智能体工作流编排:4 种模式串起一条简历筛选流水线

【免费下载链接】langchain4j-examples项目地址: https://gitcode.com/GitHub_Trending/la/langchain4j-examples

LangChain4j-examples 是 LangChain4j 框架的 Java 示例项目,其中 agentic-tutorial 模块用一条"简历筛选"业务,完整演示了顺序、并行、循环、条件四种智能体工作流编排模式。对没做过智能体编排的 Java 开发者来说,这是比较贴近真实业务的入门路径:每种模式都对应筛选流程里的一个具体痛点,示例的 main 方法都很短,变量命名清楚,照着改就能跑起来。

四种模式各管流水线的哪一段

整条业务线是:拿到候选人背景 → 生成并定制简历 → 多方评审打分 → 不达标就改 → 按分数决定去留。四种编排模式正好一一对应:

  • 顺序:一个智能体产出交给下一个,负责"生成 master 简历 → 按目标岗位改写";
  • 并行:HR、用人经理、团队成员三路评审同时跑,省掉排队等待;
  • 循环:评审分数不达标时自动"修改—再评审",直到过关;
  • 条件:根据评审结果动态路由——进下一轮、发拒绝邮件还是补材料。

数据传递依赖两个结构化领域类:Cv.java 承载简历本体,CvReview.java 承载评审结果,只有score(0 到 1)和feedback两个字段,却是四种模式之间流通的"货币"。所有中间结果都存放在 AgenticScope(框架提供的执行状态容器,可以理解为一次运行中的共享变量表)里,随时可用readState()按 key 取回,这也是观察、调试一次编排运行的主要入口。

🧵 顺序模式:把两个智能体接成流水线

第一棒解决"多步任务怎么串"。CvGenerator从个人经历生成 master 简历,CvTailor再按岗位描述改写,两者用一行链式调用接起来:

UntypedAgent agent = AgenticServices .sequenceBuilder() .subAgents(cvGenerator, cvTailor) // 顺序即执行顺序 .outputKey("tailoredCv") // 组合体最终输出 .build();

数据交接的关键在outputKey:第一个智能体的结果以 "masterCv" 为 key 写入共享状态,第二个智能体接口里只要声明同名的入参,框架就会自动取来喂给它。有个容易踩的坑:如果第二个智能体也声明outputKey("masterCv"),原始 master 简历会被直接覆盖。_2a_Sequential_Agent_Example.java 的注释里专门提醒了这一点,命名前想清楚"这个 key 该不该被复用"。

⚡ 并行模式:三路评审同时跑,结果聚合成一个总分

评审如果串行,等于等三次模型调用。并行模式下,HrCvReviewer、ManagerCvReviewer、TeamMemberCvReviewer三个智能体用parallelBuilder()同时启动,各有两个要点:

  • 线程池:示例用Executors.newFixedThreadPool(3)建池,通过.executor(...)显式传入。注意 main 方法最后有executor.shutdown()这一步——自己建的池要自己关,否则示例进程会挂住不退出(不传 executor 时框架用内置缓存线程池,跑完自动关闭);
  • 结果聚合:.output(scope -> {...})里按 key 读回三份评审,拼接 feedback、把三个分数求平均,打包成一个新CvReview作为最终输出。

完整的并发加聚合写法见 _4_Parallel_Workflow_Example.java。

🔁 循环模式:分数不达标就自动改,但必须带保险丝

评审之后分数低怎么办?不人工介入,让智能体自己"修改—再评审"地迭代。循环体还是两个智能体:CvReviewer打分,ScoredCvTailor依据 feedback 修改简历,控制逻辑只有两行:

.exitCondition(scope -> { CvReview review = (CvReview) scope.readState("cvReview"); return review.score > 0.8; }) .maxIterations(3)

细节一:退出条件在每个智能体调用之后都会检查,不是等整圈跑完才判断,所以条件函数里少做点重活,有利于尽早收敛。细节二:maxIterations属于必选项,源码注释直接称之为防止无限循环的保险丝——大模型的打分并不稳定,阈值永远达不到时你必须有明确的下限。_3a_Loop_Agent_Example.java 之外,同目录的 3b 还演示了如何取出每一轮的中间状态用于监控。

⚖️ 条件模式:按分数路由,还可以异步

最后一棒是路由:根据 HR 评审结果决定候选人的走向。conditionalBuilder()注册多组"条件 + 智能体",条件就是一个返回 boolean 的 lambda:

  • score >= 0.8→ 交给ManagerCvReviewer做经理评审;
  • score < 0.8→EmailAssistant发出拒绝邮件;
  • feedback含 "missing information:" →InfoRequester发邮件向候选人补材料。

注意这几组条件并不互斥:示例里 HR 给了 0.85 分,feedback 里同时写着信息缺失,于是经理评审和补材料邮件会同时发生。这正是示例给每个智能体都加.async(true)的原因——独立分支互不阻塞,墙钟耗时接近最长分支而非各分支之和。最后的.output按 key 取各分支结果(未写入的 key 用带默认值的重载兜底),拼成最终输出。完整实现见 _5b_Conditional_Workflow_Example_Async.java。

读完这四篇之后

  • 建议从 _2a 的 main 方法按编号顺序读起,每个模式一个入口,四篇代码加起来不到 400 行;模块根目录的 README.md 列了全部示例的索引,包括组合工作流、监督者调度和人工介入(human-in-the-loop)等进阶内容;
  • 落地到自己的业务时,顺序 + 条件组合风险最低,可以先上;并行评审记得管好线程池,循环优化务必带上maxIterations,这两处是示例里反复强调的防线。

【免费下载链接】langchain4j-examples项目地址: https://gitcode.com/GitHub_Trending/la/langchain4j-examples

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 5:57:46

Flask+Django+Vue健康监控系统架构解析

1. 项目概述&#xff1a;健康监控系统的技术选型与定位这个健康监控系统采用前后端分离架构&#xff0c;后端使用FlaskDjango双框架组合&#xff0c;前端基于Vue.js构建&#xff0c;开发环境选用PyCharm作为主力IDE。这种技术栈选择在个人健康类应用中颇具代表性——Flask负责轻…

作者头像 李华
网站建设 2026/10/23 5:56:15

用 C 语言从零构建终端复用器:伪终端、进程隔离与分屏架构

我最早接触cmux这个名字的时候&#xff0c;第一反应是“又一个模仿 tmux 的轮子”&#xff0c;但真把这套用 C 语言从零搭出来的终端复用器原型跑起来之后&#xff0c;我才意识到&#xff0c;最难的部分根本不在“分屏”这个动作上&#xff0c;而在于怎么让一个普通终端程序&am…

作者头像 李华