快速上手 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),仅供参考