UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

425 lines (328 loc) 10.2 kB
# Context Engine 架构设计 ## 概述 Context Engine 是一个灵活的消息处理管道系统,用于在 AI 对话中动态管理和处理上下文信息。它提供了一种可扩展的方式来注入、转换和验证消息流。 ## 核心概念 ### 1. 处理器(Processor) 处理器是 Context Engine 的基本单元,负责对消息进行特定的处理操作。 #### 处理器分类 根据功能职责,处理器分为以下几类: 1. **注入器(Injector)** - 职责:向消息流中添加新的上下文信息 - 示例:SystemRoleInjector、HistoryInjector、RAGContextInjector 2. **转换器(Transformer)** - 职责:修改现有消息的内容或结构 - 示例:MessageRoleTransformer、ImageContentProcessor 3. **截断器(Truncator)** - 职责:根据特定规则裁剪消息内容 - 示例:HistoryTruncator、TokenBasedTruncator 4. **验证器(Validator)** - 职责:验证消息是否符合特定要求 - 示例:ModelCapabilityValidator 5. **重排器(Reorderer)** - 职责:调整消息的顺序 - 示例:ToolMessageReorder ### 2. 管道(Pipeline) 管道是一系列处理器的有序组合,消息流经管道时会被逐个处理器处理。 ```typescript interface Pipeline { // 添加处理器到管道 add(processor: BaseProcessor): Pipeline; // 执行管道处理 execute(context: ProcessorContext): Promise<ProcessorContext>; // 获取管道中的所有处理器 getProcessors(): BaseProcessor[]; } ``` ### 3. 上下文(Context) 上下文包含了处理器需要的所有信息: ```typescript interface ProcessorContext { messages: Message[]; // 消息列表 metadata?: ProcessorMetadata; // 元数据 variables?: Record<string, any>; // 变量 abortSignal?: AbortSignal; // 中止信号 } ``` ## 架构设计 ### 类层次结构 ``` BaseProcessor (抽象基类) ├── BaseInjector (注入器基类) │ ├── SystemRoleInjector │ ├── HistoryInjector │ ├── RAGContextInjector │ └── ... ├── BaseTransformer (转换器基类) │ ├── MessageRoleTransformer │ └── ImageContentProcessor ├── BaseTruncator (截断器基类) │ ├── HistoryTruncator │ └── TokenBasedTruncator ├── BaseValidator (验证器基类) │ └── ModelCapabilityValidator └── BaseReorderer (重排器基类) └── ToolMessageReorder ``` ### 核心接口设计 #### BaseProcessor ```typescript abstract class BaseProcessor { // 处理器类型 abstract readonly type: ProcessorType; // 处理器名称 abstract readonly name: string; // 主处理方法 async process(context: ProcessorContext): Promise<ProcessorContext> { // 1. 前置验证 this.validateInput(context); // 2. 执行处理 const result = await this.doProcess(context); // 3. 后置验证 this.validateOutput(result); return result; } // 子类实现的核心处理逻辑 protected abstract doProcess(context: ProcessorContext): Promise<ProcessorContext>; // 输入验证(可选覆盖) protected validateInput(context: ProcessorContext): void {} // 输出验证(可选覆盖) protected validateOutput(context: ProcessorContext): void {} } ``` #### BaseInjector ```typescript abstract class BaseInjector extends BaseProcessor { readonly type = ProcessorType.Injector; protected async doProcess(context: ProcessorContext): Promise<ProcessorContext> { // 1. 判断是否需要注入 if (!this.shouldInject(context)) { return context; } // 2. 构建注入内容 const content = await this.buildContent(context); // 3. 创建消息 const message = this.createMessage(content, context); // 4. 确定注入位置 const position = this.getInjectionPosition(context); // 5. 执行注入 return this.inject(context, message, position); } // 子类需要实现的方法 protected abstract shouldInject(context: ProcessorContext): boolean; protected abstract buildContent(context: ProcessorContext): Promise<string>; // 可选覆盖的方法 protected getInjectionPosition(context: ProcessorContext): number { return 0; // 默认注入到开头 } protected createMessage(content: string, context: ProcessorContext): Message { return { role: 'system', content, metadata: { injectedBy: this.name } }; } } ``` ## 使用方式 ### 1. 创建自定义处理器 ```typescript // 创建一个自定义注入器 class CustomContextInjector extends BaseInjector { readonly name = 'custom-context-injector'; protected shouldInject(context: ProcessorContext): boolean { // 判断逻辑 return !context.messages.some(msg => msg.metadata?.injectedBy === this.name ); } protected async buildContent(context: ProcessorContext): Promise<string> { // 构建内容逻辑 return `Custom context: ${context.variables?.customValue}`; } } ``` ### 2. 构建处理管道 ```typescript // 使用工厂模式创建管道 const pipeline = createPipeline() .add(new SystemRoleInjector()) .add(new HistoryInjector({ maxMessages: 10 })) .add(new CustomContextInjector()) .add(new MessageRoleTransformer()) .add(new TokenBasedTruncator({ maxTokens: 4000 })) .add(new ModelCapabilityValidator()); // 执行管道 const result = await pipeline.execute({ messages: initialMessages, variables: { customValue: 'test' }, metadata: { model: 'gpt-4' } }); ``` ### 3. 条件处理 ```typescript // 基于条件的管道构建 const pipeline = createPipeline(); if (config.enableRAG) { pipeline.add(new RAGContextInjector()); } if (config.enableSearch) { pipeline.add(new SearchContextInjector()); } // 始终添加的处理器 pipeline .add(new HistoryTruncator()) .add(new ModelCapabilityValidator()); ``` ### 4. 错误处理 ```typescript try { const result = await pipeline.execute(context); } catch (error) { if (error instanceof ProcessorError) { console.error(`Processor ${error.processorName} failed:`, error.message); } else if (error instanceof PipelineError) { console.error('Pipeline execution failed:', error.message); } } ``` ## 配置管理 ### 处理器配置 每个处理器可以接受特定的配置选项: ```typescript interface ProcessorConfig { // 通用配置 enabled?: boolean; priority?: number; // 处理器特定配置 [key: string]: any; } // 示例:历史注入器配置 interface HistoryInjectorConfig extends ProcessorConfig { maxMessages?: number; includeSystemMessages?: boolean; preserveTools?: boolean; } ``` ### 管道配置 ```typescript interface PipelineConfig { processors: Array<{ type: string; config?: ProcessorConfig; }>; // 全局配置 abortOnError?: boolean; timeout?: number; } // 从配置创建管道 const pipeline = createPipelineFromConfig({ processors: [ { type: 'system-role', config: { enabled: true } }, { type: 'history', config: { maxMessages: 20 } }, { type: 'rag', config: { threshold: 0.7 } } ], abortOnError: false, timeout: 30000 }); ``` ## 最佳实践 ### 1. 单一职责原则 每个处理器应该只负责一种特定的处理任务。 ### 2. 可配置性 处理器应该通过配置参数来控制行为,而不是硬编码。 ### 3. 错误处理 - 使用具体的错误类型 - 提供有意义的错误信息 - 考虑错误恢复策略 ### 4. 性能优化 - 避免不必要的消息复制 - 使用流式处理处理大量数据 - 实现适当的缓存机制 ### 5. 测试 - 为每个处理器编写单元测试 - 测试处理器组合的集成测试 - 边界条件和错误场景测试 ## 扩展机制 ### 1. 自定义处理器类型 ```typescript // 定义新的处理器类型 enum CustomProcessorType { Analyzer = 'analyzer', Enhancer = 'enhancer' } // 创建对应的基类 abstract class BaseAnalyzer extends BaseProcessor { readonly type = CustomProcessorType.Analyzer; // 分析器特定的方法 protected abstract analyze(messages: Message[]): AnalysisResult; } ``` ### 2. 处理器组合 ```typescript // 创建复合处理器 class CompositeProcessor extends BaseProcessor { constructor(private processors: BaseProcessor[]) { super(); } protected async doProcess(context: ProcessorContext): Promise<ProcessorContext> { let result = context; for (const processor of this.processors) { result = await processor.process(result); } return result; } } ``` ### 3. 插件系统 ```typescript interface ProcessorPlugin { name: string; version: string; processors: ProcessorDefinition[]; } // 注册插件 registry.registerPlugin({ name: 'custom-processors', version: '1.0.0', processors: [ { type: 'custom-injector', factory: () => new CustomInjector() }, { type: 'custom-validator', factory: () => new CustomValidator() } ] }); ``` ## 迁移指南 ### 从当前架构迁移 1. **BaseProvider 迁移到 BaseInjector** ```typescript // 旧代码 class MyProvider extends BaseProvider { doProcess(context) { // 实现 } } // 新代码 class MyInjector extends BaseInjector { shouldInject(context) { // 判断逻辑 } buildContent(context) { // 构建内容 } } ``` 2. **处理器分类** - 将现有处理器按功能分类 - 继承对应的基类 - 实现必要的抽象方法 3. **配置迁移** - 统一配置格式 - 支持向后兼容 - 提供迁移工具 ## 总结 新的 Context Engine 架构提供了: 1. **清晰的分层结构**:基于功能的处理器分类 2. **灵活的扩展机制**:易于添加新的处理器类型 3. **强大的组合能力**:通过管道组合实现复杂功能 4. **完善的错误处理**:细粒度的错误类型和恢复策略 5. **优秀的可测试性**:模块化设计便于单元测试 这种设计使得 Context Engine 更加模块化、可维护和可扩展,能够更好地满足不同场景下的上下文处理需求。