内容提要
该文章介绍了一个基于Temporal和Lakebase的个人贷款核保代理参考实现。它利用Temporal实现持久执行,确保代理在工人故障后恢复;Lakebase存储可查询的操作状态,如运行状态、证据和指标。通过确定性ID和幂等写入处理重试,Unity Catalog同步政策,Change Data Feed导出历史数据。此架构增强了代理的韧性和可扩展性,适用于需要长期等待和状态恢复的代理场景。
延伸解读
状态分离:Temporal与Lakebase各司其职
文章强调Temporal和Lakebase存储不同类型的状态:Temporal的Event History用于驱动工作流重放,而Lakebase存储面向应用的可查询状态(如运行状态、证据、指标)。这种分离使得系统既能从故障中恢复,又能提供实时查询能力。理解这一点有助于设计类似系统时明确各组件职责,避免混淆。
幂等写入与确定性ID:重试安全的关键
由于Temporal活动可能重试,文章指出必须使用确定性ID和幂等写入(如Postgres upsert)确保重复尝试不会产生重复记录。例如,工具调用ID和约束条件保证同一逻辑写入。开发者需注意,零行更新可能表示状态已终态,应视为预期而非错误,但需确认存储状态以避免静默失败。
人工审批与长期等待:代理的持久性挑战
贷款审批可能等待数天,期间工作进程可能重启。Temporal通过工作流等待条件(如wait_condition)保持运行而不占用进程,同时通过信号接收审批决策。API层和Temporal层双重校验确保过期或重复决策被忽略。这展示了如何构建能跨越长时间等待和进程故障的代理。
策略变更与数据同步:Unity Catalog与Lakebase集成
文章展示了如何通过Unity Catalog同步表将策略变更实时传播到Lakebase,使代理无需部署即可读取最新阈值。同时,Change Data Feed可将操作数据导出至Delta历史表用于审计。但需注意,该功能为Public Preview,且需手动启用和验证,生产环境需谨慎。
Q&A
Temporal和Lakebase在构建持久化代理中分别扮演什么角色?
Temporal负责持久执行,通过Event History记录工作流状态,确保代理在工人故障后能恢复;Lakebase存储可查询的操作状态,如运行状态、证据和指标,供应用程序和UI查询。
为什么代理需要持久化执行?
因为代理可能长时间运行,期间工人可能重启、工具调用可能失败,代理必须保留已完成的工作、恢复执行,并保持证据可供审查者使用。
Temporal中的Workflow、Activity和Signal分别是什么?
Workflow是单个代理运行的持久控制流;Activity是对模型、工具或数据库的调用,其结果记录在Event History中,可重试;Signal是发送给运行中Workflow的异步命令,如承销商的决策。
Lakebase如何保证重试时写入的幂等性?
通过确定性标识符(如run_id、tool_call_id)和约束(主键、唯一约束)确保重试针对同一逻辑记录,并使用带守卫的更新(如仅允许非终止状态写回started)和Postgres upsert。
代理在等待人工审查时,Temporal和Lakebase如何协作?
当代理达到AWAITING_REVIEW状态时,Temporal通过workflow.wait_condition挂起工作流而不占用工人;Lakebase存储待审查的review记录,供UI查询。当审查者通过Signal发送决策时,API先检查Lakebase状态,Workflow再验证并处理。
Unity Catalog中的政策如何同步到Lakebase?
通过创建连续的Lakebase同步表(如agent_policy.underwriting_policy_limits),将Unity Catalog中的政策表同步到Postgres,供policy_lookup查询。政策更新后,同步管道自动传播。
Lakebase Change Data Feed的作用是什么?
Change Data Feed捕获Lakebase表的变更,并批量写入Unity Catalog管理的Delta历史表,用于审计和分析。它目前处于Public Preview,刷新间隔约15秒。
如何确保外部工具调用的幂等性?
每个有副作用的工具都需要等效的幂等性契约,例如支付API使用幂等键、邮件服务使用消息ID、数据库使用唯一约束。如果外部系统不支持去重,Activity需要自己的记录或对账流程。
代理的恢复机制如何工作?
Temporal通过Event History记录所有Activity结果和信号,当工人失败时,新工人通过重放Event History重建状态,已记录的Activity结果直接返回,未记录的则重新调度。
该参考实现适用于哪些场景?
适用于需要长期等待、状态恢复、可查询状态和受治理数据的代理场景,例如个人贷款核保,其中代理需要收集证据、应用政策、等待人工决策。