Skip to content

自定义管道

管道是驱动 Agent 的执行循环。ChatRunner 是默认实现,包含完整的 ReAct 循环和工具处理。

什么时候需要写自定义管道

  • 想要一个更简单的循环,不需要工具支持(纯对话)
  • 需要不同的错误处理或重试逻辑
  • 在做专门的 Agent(比如纯思维链,没有工具)

实现 Pipeline

rust
use ambi::agent::pipeline::Pipeline;
use ambi::agent::core::{Agent, AgentState};
use ambi::error::Result;
use ambi::ContentPart;

struct MySimplePipeline;

impl Pipeline for MySimplePipeline {
    async fn execute(
        &self,
        agent: &Agent,
        state: &Arc<RwLock<AgentState>>,
        input: Vec<ContentPart>,
    ) -> Result<String> {
        // 从当前状态构建请求
        let req = /* ... */;

        // 直接调引擎
        let response = agent.llm_engine.chat(req).await?;

        // 不处理工具——直接返回原始文本
        Ok(response)
    }

    async fn execute_stream(
        &self,
        agent: &Agent,
        state: &Arc<RwLock<AgentState>>,
        input: Vec<ContentPart>,
    ) -> Result<Pin<Box<ReceiverStream<Result<String>>>>> {
        // ... 流式实现
        unimplemented!()
    }
}

注意 llm_enginepub(crate) 的,所以你只能在 crate 内部实现自定义管道,或者在外部组合 ChatRunner 的公开 API。

组合比替换更常见

大多数情况下你不需要替换整个管道——定制各个部件就够了:

预构建管道

ambi-pipelines 扩展库提供了生产就绪的管道实现:

管道描述
StandardRagPipeline检索增强生成,带 token 感知的上下文打包
SelfConsistencyPipeline并行思维链 + 多数投票
BfsBeamSearchPipeline思维树广度优先束搜索
ReflexionPipeline执行者-评估者循环,带持久化批评记忆

如果真的需要完全自定义循环,复制 ChatRunner 的结构然后改你需要的部分。

基于 Apache-2.0 协议开源