适合人群了解 j-langchain 基础的 Java 开发者前置阅读文章15分钟构建第一个AI应用什么是链式编排在 AI 应用开发中单纯调用一次 LLM 往往不够用。实际场景需要先分类问题再路由到专业处理链先生成内容再对内容做质量检查多个子任务并行执行最后汇总结果结合对话历史动态改写问题j-langchain 提供了 6 种开箱即用的链式编排模式覆盖 90% 的 AI 应用场景。模式总览顺序链A → B → C → D 条件链A → [条件1→B | 条件2→C | 默认→D] 组合链[A→B→C] → [上一链的输出→D→E] 并行链[A→B] 和 [A→C] 并行 → 合并结果 路由链先用 LLM 分类 → 路由到对应专业链 动态链并行执行多个分支 → 汇总上下文 → 最终答复模式1顺序链Simple Chain最基础的线性流水线节点按顺序依次执行。TestpublicvoidsimpleChain(){BaseRunnableStringPromptValue,?promptPromptTemplate.fromTemplate(讲一个关于 ${topic} 的笑话);ChatOllamallmChatOllama.builder().model(qwen2.5:0.5b).build();FlowInstancechainchainActor.builder().next(prompt).next(llm).next(newStrOutputParser()).build();ChatGenerationresultchainActor.invoke(chain,Map.of(topic,程序员));System.out.println(result.getText());}适用场景问答、翻译、摘要等单轮任务。模式2条件链Switch Chain根据输入参数中的条件动态选择不同的处理分支。TestpublicvoidswitchChain(){ChatOllamaollamaModelChatOllama.builder().model(qwen2.5:0.5b).build();FlowInstancechainchainActor.builder().next(prompt).next(Info.c(vendor ollama,ollamaModel),// 条件表达式 分支节点Info.c(input-暂不支持该模型供应商)// 默认分支).next(newStrOutputParser()).build();// 传入 vendor 参数控制走哪个分支chainActor.invoke(chain,Map.of(topic,Java,vendor,ollama));}关键 APIInfo.c(condition, node)— 条件表达式支持 SpEL也支持 Lambda。适用场景多模型切换、A/B 测试、权限分发。模式3组合链Compose Chain将一个链的输出作为另一个链的输入实现多步推理。TestpublicvoidcomposeChain(){// 第一个链生成笑话FlowInstancejokeChainchainActor.builder().next(jokePrompt).next(llm).next(parser).build();// 第二个链分析笑话FlowInstanceanalysisChainchainActor.builder().next(newInvokeChain(jokeChain))// 内嵌第一个链.next(input-Map.of(joke,((Generation)input).getText()))// 转换格式.next(analysisPrompt).next(llm).next(parser).build();chainActor.invoke(analysisChain,Map.of(topic,程序员));}关键 APInew InvokeChain(subChain)— 将子链作为一个节点嵌入。适用场景先生成再审核、多步骤推理、链式思考CoT。模式4并行链Parallel Chain多个子链同时执行执行完毕后合并结果。相比顺序执行大幅降低延迟。TestpublicvoidparallelChain(){FlowInstancejokeChainchainActor.builder().next(jokePrompt).next(llm).build();FlowInstancepoemChainchainActor.builder().next(poemPrompt).next(llm).build();FlowInstanceparallelChainchainActor.builder().concurrent(jokeChain,poemChain)// 并行执行两个链.next(input-{MapString,Objectmap(MapString,Object)input;// 用 flowId 获取对应子链的结果兼容 AIMessage 和其他类型ObjectjokeResultmap.get(jokeChain.getFlowId());ObjectpoemResultmap.get(poemChain.getFlowId());StringjokejokeResultinstanceofAIMessage?((AIMessage)jokeResult).getContent():String.valueOf(jokeResult);StringpoempoemResultinstanceofAIMessage?((AIMessage)poemResult).getContent():String.valueOf(poemResult);returnMap.of(joke,joke,poem,poem);}).build();MapString,StringresultchainActor.invoke(parallelChain,Map.of(topic,猫));System.out.println(笑话result.get(joke));System.out.println(诗歌result.get(poem));}关键 APIchainActor.builder().concurrent(chain1, chain2, ...)— 并行执行用子链 flowId 取结果。适用场景同时生成多种内容、并发搜索多个数据源、多模型投票。模式5路由链Route Chain先用 LLM 对输入内容自动分类再根据分类结果路由到对应的专业链。TestpublicvoidrouteChain(){// 分类链判断问题类型FlowInstanceclassifyChainchainActor.builder().next(classifyPrompt).next(llm).next(newStrOutputParser()).build();FlowInstancefullChainchainActor.builder().next(newInvokeChain(classifyChain)).next(input-Map.of(category,input.toString(),question,((Map?,?)ContextBus.get().getFlowParam()).get(question))).next(Info.c(category 技术,techChain),// 路由到技术专家Info.c(category 业务,bizChain),// 路由到业务专家Info.c(generalChain)// 默认通用回答).build();chainActor.invoke(fullChain,Map.of(question,如何优化 Java 内存));}关键点ContextBus.get().getFlowParam()可以在任意节点获取链的原始输入。适用场景智能客服、多领域问答、专家路由系统。模式6动态上下文链Dynamic Chain结合对话历史将接上文的问题改写为独立问题再进行检索和回答。这是多轮对话 RAG 的核心模式。TestpublicvoiddynamicChain(){// 上下文改写有历史时改写问题无历史直接透传FlowInstancecontextualizeIfNeededchainActor.builder().next(Info.c(chatHistory ! null,newInvokeChain(contextualizeChain)),Info.c(input-Map.of(question,((MapString,String)input).get(question)))).build();FlowInstancefullChainchainActor.builder().all(Info.c(contextualizeIfNeeded),// 并行改写问题Info.c(input-印度尼西亚2024年人口约2.78亿).cAlias(retriever)// 并行检索上下文).next(input-Map.of(question,ContextBus.get().getResult(contextualizeIfNeeded.getFlowId()).toString(),context,ContextBus.get().getResult(retriever))).next(qaPrompt).next(llm).next(newStrOutputParser()).build();// 第二轮对话问题依赖第一轮上下文chainActor.invoke(fullChain,Map.of(question,那印度呢,chatHistory,List.of(Pair.of(human,印度尼西亚有多少人口),Pair.of(ai,约2.78亿))));}关键 APIchainActor.builder().all(...)— 所有分支并行执行用cAlias给分支命名ContextBus.get().getResult(id)— 按节点 ID 或别名获取中间结果适用场景多轮对话、带记忆的 AI 助手、上下文感知问答。模式对比模式关键 API核心特点典型场景顺序链.next()线性流水线问答、翻译条件链Info.c(condition, node)运行时分支选择模型切换、权限控制组合链new InvokeChain(chain)链嵌套多步推理生成审核并行链.concurrent(chain1, chain2)多链同时执行并发生成、多源检索路由链LLM分类 Info.c(条件, chain)智能路由智能客服、专家系统动态链.all()ContextBus并行上下文汇聚多轮对话RAG完整代码见src/test/java/org/salt/jlangchain/demo/article/Article02ChainPatterns.java