ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

LangChain设计模式02:责任链模式

LangChain设计模式02:责任链模式 LangChain设计模式之责任链模式LangChain 里随手写出的prompt | llm | parser底层并不是三个对象简单相加而是一条责任链。本文从设计模式定义、源码实现和实战场景三个层面把它拆清楚。一、先记住一句话在 LangChain 中责任链模式解决的核心问题是如何把多个可执行步骤串联起来让请求按顺序正向传递。它是最基础、最常用的执行骨架。你看到的 Prompt 构建、模型调用、输出解析、工具调用、格式化最终都会被组织成一条链。二、责任链模式是什么责任链模式是行为型设计模式。经典定义是将多个处理者组成一条链请求沿着链依次传递直到某个处理者能够处理并返回结果。它通常包含四个角色角色含义LangChain 对应抽象处理者定义统一处理接口Runnable具体处理者处理具体请求Prompt、LLM、Parser链将处理者串联起来RunnableSequence请求在链上传递的数据invoke(input, config)需要特别说明的是LangChain 中的责任链不是“谁先处理完谁返回”的短链逻辑而是更偏向固定管线每个步骤都会执行上一步的输出作为下一步的输入。它继承的是责任链“解耦步骤、串联执行”的思想同时吸收管道模式对数据流的约束。三、LangChain 里的实现RunnableSequence在 LangChain 中|运算符会把左右两个 Runnable 组合起来。多个组件连续使用|时最终会被封装成RunnableSequence。prompt | llm | parser ↓ 底层等价于 RunnableSequence([prompt, llm, parser])3.1 统一接口先行责任链能成立前提是链上的每个步骤都实现同一个接口。LangChain 用Runnable完成这件事fromabcimportABC,abstractmethodfromtypingimportGeneric,TypeVar,Optional,List InputTypeVar(Input)OutputTypeVar(Output)classRunnable(Generic[Input,Output],ABC):input_type:typeoutput_type:typeabstractmethoddefinvoke(self,input:Input,config:Optional[dict]None)-Output:raiseNotImplementedError()所有 Prompt、LLM、Parser、Chain、Tool以及后续包装出来的中间件对象都满足这个契约。3.2 链的组装与执行下面是贴合 LangChain 实际逻辑的简化版RunnableSequenceclassRunnableSequence(Runnable[Input,Output]):def__init__(self,steps:List[Runnable]):self.stepssteps self._validate_steps()def_validate_steps(self)-None:foriinrange(len(self.steps)-1):current_outputself.steps[i].output_type next_inputself.steps[i1].input_typeifnotissubclass(current_output,next_input):raiseValueError(f步骤{i}的输出类型{current_output}f不匹配步骤{i1}的输入类型{next_input})definvoke(self,input:Input,config:Optional[dict]None)-Output:valueinputfori,stepinenumerate(self.steps):step_configself._patch_config(config,step_idxi)valuestep.invoke(value,step_config)returnvaluedef_patch_config(self,config:Optional[dict],step_idx:int)-dict:configconfigor{}return{**config,step_idx:step_idx,step_tag:fstep{step_idx},sequence_id:id(self),}3.3 这四点决定了它像责任链线性串联请求从第一个步骤进入依次传到最后一个步骤。步骤解耦每个 Runnable 只关心自己的输入和输出不感知前后步骤。可扩展通过|可以随时增删步骤或调整顺序。上下文传递config沿链传递为日志、会话、状态回溯提供基础。四、实战从基础链到嵌套链4.1 基础 Prompt-LLM-Parser 链这是 LangChain 最常见的一条责任链fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_openaiimportChatOpenAIfromlangchain_core.output_parsersimportStrOutputParser promptChatPromptTemplate.from_messages([(system,你是一个专业的文本总结助手总结内容需简洁明了不超过50字。),(user,{input})])llmChatOpenAI(modelgpt-3.5-turbo)parserStrOutputParser()chainprompt|llm|parser input_text(LangChain 是一个用于构建大语言模型应用的框架它提供了丰富的组件和工具支持快速开发复杂的 LLM 应用。)resultchain.invoke({input:input_text})print(result)执行顺序{input: input_text} ↓ prompt ↓ llm ↓ parser ↓ result4.2 嵌套责任链责任链里的责任链责任链的一个步骤本身也可以是一条责任链于是形成树形结构fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnableSequence summary_chainprompt|llm|parser translate_promptChatPromptTemplate.from_messages([(system,将以下文本翻译成英文保持原意简洁准确。),(user,{input})])translate_chaintranslate_prompt|llm|parser# 先总结再翻译总结结果main_chainRunnableSequence([summary_chain,translate_chain])resultmain_chain.invoke({input:input_text})print(result)这种能力让复杂任务可以被拆成多级子链而不是写一个巨大的处理函数。五、它在四大模式中的位置责任链模式不是孤立存在的。它在 LangChain 内核中负责“正向执行流的骨架”模式作用关系命令模式统一Runnable接口责任链的前提责任链模式串联步骤、正向传递核心骨架装饰器模式包装链或组件增强功能对责任链做非侵入扩展管道模式约束输入输出类型让责任链的数据流更规范一句话总结命令模式定接口责任链模式搭骨架装饰器模式做增强管道模式规数据流。六、总结LangChain 的责任链模式是怎么实现的LangChain 通过Runnable接口统一所有可执行组件。|运算符把组件组合成RunnableSequence。RunnableSequence.invoke把输入依次传给每个步骤前一步输出作为后一步输入。每个步骤只关注自身职责通过config传递上下文。责任链既可以扁平串联也可以嵌套成树形链支撑复杂任务拆分。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表