SeqChain 串行思维链¶
SeqChain(SeqChains 类)用于把多个 Chain 或嵌套的 Chains 串联起来执行,前一个链的输出会成为后一个链的输入补充信息,最终以最后一个链的结果作为整体输出。与基础 Chain 相比,它更关注流程编排:将多个具备明确职责的链按照顺序组合,避免在单个链内部写过长的提示词或工具逻辑。
类概览¶
- 定义位置:
tfrobot.brain.chain.chain_structures.sequence_chains.SeqChains - 继承关系:继承自
Chains,沿用run/async_run接口 - 核心能力:顺序调用子链,决定是否共享中间消息
- 输出规范:
output_json_schema始终对齐最后一个子链的output_json_schema
配置参数¶
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
name |
ClassVar[str] |
类名常量,用于注册链类型 | "SeqChain" |
description |
ClassVar[str] |
类描述常量,说明串行链的能力 | SeqChain allow multichain work together... |
abilities_purpose |
Optional[str] |
描述链的职责与目标,展示给 LLM 作为上下文补充 | “当前的思维链是串行链...” |
chains |
list[Chain \| Chains] |
串行执行的链条列表,支持继续嵌套 Chains |
[] |
pass_intermediate_msgs |
bool |
是否在子链之间共享 intermediate_msgs(即中间系统消息、工具返回等) |
True |
参数细化说明¶
chains列表:- 会按照列表顺序依次执行。
- 每个子链调用的入参与单独运行时一致:
current_input、conversation、elements、knowledge、tools、intermediate_msgs。 -
子链既可以是基础
Chain,也可以是其它结构化链(例如再次嵌套SeqChains)。 -
pass_intermediate_msgs: - 为
True时,前一个链生成的intermediate_msgs会传递给下一个链,帮助共享工具输出或系统提示。 -
为
False时,每次子链执行完都会把intermediate_msgs恢复为初始快照,只让子链影响自身输出,适合希望隔离链间上下文的场景。 -
abilities_purpose: - 默认描述会列出串行链的基本行为,可在实例化时覆写成更贴近业务的说明,帮助 LLM 理解链路意图。
运行流程¶
- 初始化上下文:
SeqChains._run会先把会话、元素、知识、工具、中间消息等统一打包成ChainContext。-
同时创建
ChainResult,用于收集整个串行流程的输出与 Token 统计。 -
顺序执行子链:
- 依次调用
chain.run(...)或chain.async_run(...),将每次结果累加到同一个ChainResult对象中。 -
如果开启
pass_intermediate_msgs,后续链可以基于前序链生成的工具输出继续推理。 -
中间消息回滚:
-
当
pass_intermediate_msgs=False时,系统会在每个子链执行后把intermediate_msgs清空并恢复为初始备份,确保后续链从相同的上下文开始执行。 -
结果归并:
- 每个子链的
ChainResult会通过+=累积到父级结果中。 - 最终返回值的结构与最后一个子链保持一致,包括
content、usage、intermediate_msgs等字段。
Chain 运行结果的缓存与传递¶
- ChainResult 累积策略:
chain_res += chain.run(...)会调用ChainResult.__iadd__,合并子链的主体输出(content/origin)、Token 使用量以及中间状态。-
累积后的
chain_res.origin会记录最新一次子链原始输出;content则保留最后一个链的标准化结果,便于 SeqChain 直接作为最终返回。 -
Token 与中间消息:
ChainResult.usage中的 Token 统计会通过merge_usages合并,便于调用方了解整个串行流程的资源开销。-
当
pass_intermediate_msgs=True时,子链在执行过程中向intermediate_msgs追加的工具返回、系统提示会留在列表中,后续子链也能访问;否则会在每次子链结束后恢复为初始快照,避免干扰下一链。 -
跨链缓存:
- 若子链是
Chain实例且启用了catch_intermediate_chain_result,当其condition_succeed通过校验后,会把结构化输出写入current_input.additional_kwargs[_CHAINS_INTERMEDIATE_RESULTS]。这些缓存随着同一个current_input在 SeqChain 中流转,使后续子链无需重复调用工具即可读取前序链结果。 -
对于字符串输出的子链,可配合
result_cache_key把文本封装成键值对,同样写入_CHAINS_INTERMEDIATE_RESULTS,在 SeqChain 内实现显式的数据传递。 -
失败场景记录:
- 如果某个子链触发
TFChainError或TFProtocolError,异常会被立即抛出并终止 SeqChain;当前chain_res会保留已完成子链的运行记录,方便上线后排查问题。
使用建议¶
- 拆分长流程:当单个
Chain的提示词或工具分支过多时,将流程拆成多个职责清晰的子链有助于调试与复用。 - 控制上下文污染:若子链之间不需要共享工具输出,可将
pass_intermediate_msgs置为False,避免中间消息导致后续链误判上下文状态。 - 保持输出一致性:最后一个子链应与整体流程的期望输出保持一致;如需统一结构,可在末尾添加一个专门的汇总链负责格式化。
- 错误处理策略:当前设计不会因为某个子链失败自动回滚已完成的链,建议在关键链条中使用
validate_result或在Chain内部自行捕获并修正异常。 - 监控 Token:
ChainResult会合并各子链的 Token 使用量,建议结合Chain与LLM的max_tokens设置,避免串行链超出整体预算。
异步支持¶
SeqChains._async_run 与同步版本逻辑一致,唯一差异是调用 async_run 并在异步环境中执行。若子链内部也采用异步 LLM 或工具调用,优先使用该接口以提升吞吐与响应速度。
与基础 Chain 的关系¶
- 上下文复用:
SeqChains与基础Chain共用ChainContext与ChainResult机制,因而可以方便地在串行链内重用已有的 Chain 实例。 - 组合互补:一个典型模式是先使用基础
Chain获取结构化信息,再用第二个Chain基于该结构化数据生成最终文本。 - DSL 集成:若结合
TFChainInterpreter等 DSL 运行器,可以把SeqChains注册为脚本中的函数,进一步拓展自动化编排能力。