# 适配器架构设计 **本文档引用的文件** - [base.py](file://backend/app/workers/platforms/base.py) - [kimi.py](file://backend/app/workers/platforms/kimi.py) - [wenxin.py](file://backend/app/workers/platforms/wenxin.py) - [citation_engine.py](file://backend/app/workers/citation_engine.py) - [scheduler.py](file://backend/app/workers/scheduler.py) - [queries.py](file://backend/app/api/queries.py) - [query.py](file://backend/app/models/query.py) - [main.py](file://backend/app/main.py) - [platforms.ts](file://frontend/lib/platforms.ts) - [platform-chart.tsx](file://frontend/components/charts/platform-chart.tsx) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 简介 本项目采用适配器模式设计了一个可扩展的AI平台查询系统。该架构通过统一的接口抽象,实现了对不同AI平台(如Kimi、文心一言等)的无缝集成和切换。适配器模式在此场景中的应用价值体现在: - **统一接口**:为不同的AI平台提供一致的查询接口 - **可扩展性**:轻松添加新的AI平台适配器 - **资源管理**:统一的资源清理和生命周期管理 - **错误处理**:标准化的异常处理和重试机制 ## 项目结构 该项目采用前后端分离的架构设计,后端使用Python FastAPI框架,前端使用Next.js React框架。适配器架构主要集中在后端的workers目录中。 ```mermaid graph TB subgraph "前端层" FE[前端应用
Next.js React] PC[平台图表组件
platform-chart.tsx] PL[平台映射
platforms.ts] end subgraph "后端层" API[FastAPI API] CE[CitationEngine
引用检测引擎] SCH[Scheduler
调度器] subgraph "适配器层" BA[BasePlatformAdapter
抽象基类] KA[KimiAdapter
Kimi适配器] WA[WenxinAdapter
文心一言适配器] end end subgraph "数据层" DB[(PostgreSQL数据库)] QM[Query模型] CRM[CitationRecord模型] end FE --> API API --> CE CE --> SCH CE --> BA BA --> KA BA --> WA CE --> DB QM --> DB CRM --> DB ``` **图表来源** - [main.py:13-22](file://backend/app/main.py#L13-L22) - [citation_engine.py:148-157](file://backend/app/workers/citation_engine.py#L148-L157) - [base.py:4-17](file://backend/app/workers/platforms/base.py#L4-L17) **章节来源** - [main.py:1-48](file://backend/app/main.py#L1-L48) - [platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18) ## 核心组件 ### BasePlatformAdapter 抽象基类 BasePlatformAdapter是整个适配器架构的核心抽象类,定义了所有AI平台适配器必须实现的标准接口。 #### 设计理念 该类采用了Python的ABC(Abstract Base Classes)机制,确保子类必须实现指定的抽象方法。设计理念包括: - **最小接口原则**:只定义必要的抽象方法,避免过度设计 - **职责单一原则**:专注于平台适配功能,不包含业务逻辑 - **扩展性优先**:为未来添加新平台预留空间 #### 核心属性 | 属性名称 | 类型 | 描述 | 示例值 | |---------|------|------|--------| | platform_name | str | 平台标识符,用于内部识别 | "kimi", "wenxin" | | platform_url | str | 平台官方网站地址 | "https://kimi.moonshot.cn" | #### 抽象方法 **query(keyword: str) -> str** - **设计目的**:在AI平台上查询关键词并返回原始响应文本 - **参数规范**: - keyword: str - 要查询的关键词 - 返回值: str - AI平台的原始响应文本 - **实现要求**:必须异步实现,支持重试机制 **close()** - **设计目的**:清理适配器使用的系统资源 - **实现要求**:异步方法,确保资源正确释放 **章节来源** - [base.py:4-17](file://backend/app/workers/platforms/base.py#L4-L17) ### 具体适配器实现 #### KimiAdapter KimiAdapter是针对Moonshot AI平台的适配器实现,具有以下特点: - **浏览器自动化**:使用Playwright进行页面交互 - **智能重试**:指数退避重试机制 - **稳定性保障**:超时处理和异常恢复 #### WenxinAdapter WenxinAdapter是针对百度文心一言平台的适配器实现: - **相似架构**:与KimiAdapter类似的实现模式 - **平台特定**:针对文心一言的界面结构优化 - **一致性保证**:保持与BasePlatformAdapter的接口兼容 **章节来源** - [kimi.py:11-206](file://backend/app/workers/platforms/kimi.py#L11-L206) - [wenxin.py:11-205](file://backend/app/workers/platforms/wenxin.py#L11-L205) ## 架构概览 整个系统采用分层架构设计,适配器模式位于中间层,向上提供统一接口,向下封装具体实现细节。 ```mermaid sequenceDiagram participant Client as 客户端 participant API as FastAPI API participant Engine as CitationEngine participant Adapter as BasePlatformAdapter participant Platform as AI平台 Client->>API : 发起查询请求 API->>Engine : execute_query() Engine->>Engine : 创建BrandMatcher Engine->>Adapter : execute_single_platform() Adapter->>Adapter : query(keyword) Adapter->>Platform : 执行平台查询 Platform-->>Adapter : 返回响应文本 Adapter-->>Engine : 返回原始响应 Engine->>Engine : 品牌匹配和竞争检测 Engine-->>API : 返回检测结果 API-->>Client : 返回查询结果 ``` **图表来源** - [citation_engine.py:159-234](file://backend/app/workers/citation_engine.py#L159-L234) - [base.py:10-17](file://backend/app/workers/platforms/base.py#L10-L17) ## 详细组件分析 ### CitationEngine 引用检测引擎 CitationEngine是系统的中央协调器,负责管理多个平台适配器并执行完整的查询流程。 #### 核心功能 1. **平台管理**:维护平台适配器字典 2. **查询执行**:协调单个平台的查询过程 3. **结果处理**:整合品牌匹配和竞争检测结果 4. **任务跟踪**:管理查询任务的状态和历史 #### 关键流程 ```mermaid flowchart TD Start([开始查询]) --> InitMatcher["初始化BrandMatcher"] InitMatcher --> GetPlatforms["获取平台列表"] GetPlatforms --> LoopPlatforms{"遍历平台"} LoopPlatforms --> CreateTask["创建或获取QueryTask"] CreateTask --> UpdateStatus["更新任务状态为running"] UpdateStatus --> ExecutePlatform["执行单个平台查询"] ExecutePlatform --> BrandMatch["品牌匹配检测"] BrandMatch --> CompetitorDetect["竞争品牌检测"] CompetitorDetect --> CreateRecord["创建CitationRecord"] CreateRecord --> UpdateTaskSuccess["更新任务状态为success"] UpdateTaskSuccess --> NextPlatform{"还有平台吗?"} NextPlatform --> |是| LoopPlatforms NextPlatform --> |否| UpdateQueryTime["更新查询时间字段"] UpdateQueryTime --> End([结束]) ExecutePlatform --> |异常| CreateFailedRecord["创建失败记录"] CreateFailedRecord --> UpdateTaskFailed["更新任务状态为failed"] UpdateTaskFailed --> NextPlatform ``` **图表来源** - [citation_engine.py:159-234](file://backend/app/workers/citation_engine.py#L159-L234) - [citation_engine.py:236-266](file://backend/app/workers/citation_engine.py#L236-L266) #### 数据模型 ```mermaid erDiagram QUERY { uuid id PK uuid user_id FK string keyword string target_brand jsonb brand_aliases jsonb platforms string frequency string status datetime last_queried_at datetime next_query_at datetime created_at datetime updated_at } CITATION_RECORD { uuid id PK uuid query_id FK string platform boolean cited integer citation_position text citation_text jsonb competitor_brands text raw_response datetime created_at datetime updated_at } QUERY_TASK { uuid id PK uuid query_id FK string platform string status datetime started_at datetime completed_at text error_message datetime created_at datetime updated_at } USER ||--o{ QUERY : creates QUERY ||--o{ CITATION_RECORD : generates QUERY ||--o{ QUERY_TASK : tracks ``` **图表来源** - [query.py:11-55](file://backend/app/models/query.py#L11-L55) - [citation_engine.py:19-120](file://backend/app/workers/citation_engine.py#L19-L120) **章节来源** - [citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309) - [query.py:11-55](file://backend/app/models/query.py#L11-L55) ### Scheduler 调度器 QueryScheduler负责定时执行查询任务,确保系统能够自动运行。 #### 核心特性 - **定时执行**:每小时检查一次到期的查询任务 - **异步处理**:使用AsyncIOScheduler支持异步操作 - **错误隔离**:单个查询失败不影响其他任务 - **优雅关闭**:提供资源清理机制 #### 生命周期管理 ```mermaid stateDiagram-v2 [*] --> 初始化 初始化 --> 启动 : start() 启动 --> 运行中 : 添加定时任务 运行中 --> 执行检查 : 每小时触发 执行检查 --> 处理查询 : 发现到期任务 处理查询 --> 运行中 : 继续监控 处理查询 --> 错误 : 异常处理 错误 --> 运行中 : 记录日志继续 运行中 --> 关闭 : shutdown() 关闭 --> [*] ``` **图表来源** - [scheduler.py:25-95](file://backend/app/workers/scheduler.py#L25-L95) **章节来源** - [scheduler.py:25-95](file://backend/app/workers/scheduler.py#L25-L95) ### 前端集成 前端系统提供了完整的用户界面,支持平台选择和结果展示。 #### 平台映射 前端使用PLATFORM_MAP和PLATFORMS常量来管理平台信息: | 平台键 | 中文名称 | 用途 | |--------|----------|------| | wenxin | 文心一言 | 百度AI平台 | | kimi | Kimi | Moonshot AI平台 | | tongyi | 通义千问 | 阿里云AI平台 | | baidu_ai | 百度AI搜索 | 百度搜索服务 | | yuanbao | 腾讯元宝 | 腾讯AI平台 | | qingyan | 智谱清言 | 智谱AI平台 | #### 图表可视化 平台图表组件使用Recharts库展示各平台的引用率统计: ```mermaid graph LR subgraph "数据处理" RAW[原始统计数据] TRANSFORM[数据转换] end subgraph "可视化组件" CHART[柱状图] XAXIS[X轴: 平台名称] YAXIS[Y轴: 引用率百分比] TOOLTIP[工具提示] end RAW --> TRANSFORM TRANSFORM --> CHART CHART --> XAXIS CHART --> YAXIS CHART --> TOOLTIP ``` **图表来源** - [platform-chart.tsx:34-68](file://frontend/components/charts/platform-chart.tsx#L34-L68) - [platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18) **章节来源** - [platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18) - [platform-chart.tsx:1-68](file://frontend/components/charts/platform-chart.tsx#L1-L68) ## 依赖关系分析 ### 组件依赖图 ```mermaid graph TB subgraph "外部依赖" PW[Playwright] APS[APScheduler] SQLA[SQLAlchemy] FAST[FastAPI] end subgraph "核心模块" BASE[BasePlatformAdapter] KIMI[KimiAdapter] WENXIN[WenxinAdapter] CE[CitationEngine] SCH[QueryScheduler] API[FastAPI API] end subgraph "数据模型" QUERY[Query模型] CITE[CitationRecord模型] TASK[QueryTask模型] end PW --> KIMI PW --> WENXIN APS --> SCH SQLA --> CE FAST --> API BASE --> KIMI BASE --> WENXIN CE --> BASE API --> CE CE --> QUERY CE --> CITE CE --> TASK ``` **图表来源** - [kimi.py:4-6](file://backend/app/workers/platforms/kimi.py#L4-L6) - [wenxin.py:4-6](file://backend/app/workers/platforms/wenxin.py#L4-L6) - [scheduler.py:13-20](file://backend/app/workers/scheduler.py#L13-L20) - [citation_engine.py:7-14](file://backend/app/workers/citation_engine.py#L7-L14) ### 耦合度分析 该系统展现了良好的内聚性和低耦合性: - **高内聚**:每个适配器专注于单一平台的实现 - **低耦合**:通过抽象基类实现松散耦合 - **清晰边界**:各层职责明确,接口清晰 - **可测试性**:依赖注入和抽象接口便于单元测试 **章节来源** - [base.py:4-17](file://backend/app/workers/platforms/base.py#L4-L17) - [citation_engine.py:148-157](file://backend/app/workers/citation_engine.py#L148-L157) ## 性能考虑 ### 异步编程模型 系统全面采用异步编程模式,提升了并发处理能力: - **异步适配器**:所有适配器方法都使用async/await - **异步数据库**:使用SQLAlchemy异步会话 - **异步调度**:APScheduler的异步版本 - **异步HTTP**:FastAPI的异步路由 ### 资源管理策略 ```mermaid flowchart TD InitBrowser["初始化浏览器"] --> UseBrowser["使用浏览器"] UseBrowser --> CloseBrowser["关闭浏览器"] CloseBrowser --> CleanupResources["清理系统资源"] CleanupResources --> End([资源释放完成]) InitBrowser --> Error["异常发生"] Error --> CleanupOnError["异常时清理资源"] CleanupOnError --> End ``` **图表来源** - [kimi.py:17-31](file://backend/app/workers/platforms/kimi.py#L17-L31) - [kimi.py:198-206](file://backend/app/workers/platforms/kimi.py#L198-L206) ### 缓存和重试机制 - **指数退避**:最多3次重试,间隔呈指数增长 - **超时控制**:页面加载和操作都有超时限制 - **资源池化**:浏览器实例复用,减少启动开销 ## 故障排除指南 ### 常见问题及解决方案 #### Playwright浏览器问题 **症状**:启动浏览器失败,提示需要安装Playwright浏览器 **解决方案**: 1. 安装Playwright浏览器:`python -m playwright install chromium` 2. 检查网络连接和代理设置 3. 确认Docker环境中的浏览器可用性 #### 页面元素定位失败 **症状**:无法找到输入框或发送按钮 **解决方案**: 1. 检查平台URL是否正确 2. 更新选择器表达式以适应页面变化 3. 实现更健壮的元素等待机制 #### 超时问题 **症状**:页面加载或响应超时 **解决方案**: 1. 增加超时时间配置 2. 检查网络连接稳定性 3. 实现重试机制 **章节来源** - [kimi.py:27-31](file://backend/app/workers/platforms/kimi.py#L27-L31) - [kimi.py:116-118](file://backend/app/workers/platforms/kimi.py#L116-L118) - [wenxin.py:27-31](file://backend/app/workers/platforms/wenxin.py#L27-L31) ### 调试技巧 1. **启用详细日志**:查看适配器的详细执行过程 2. **检查数据库状态**:验证查询任务的状态更新 3. **监控资源使用**:观察浏览器进程和内存使用情况 4. **测试独立适配器**:单独测试某个平台的适配器 ## 结论 该适配器架构设计成功地实现了以下目标: ### 架构优势 1. **高度可扩展**:新增平台只需实现BasePlatformAdapter接口 2. **统一管理**:通过CitationEngine集中管理所有平台 3. **资源优化**:统一的资源管理和清理机制 4. **错误处理**:完善的异常处理和重试机制 ### 最佳实践建议 1. **遵循接口契约**:严格实现BasePlatformAdapter的所有抽象方法 2. **资源管理**:确保close()方法能够正确清理所有资源 3. **错误处理**:实现适当的异常处理和重试逻辑 4. **配置管理**:将平台特定的配置参数化 5. **测试覆盖**:为新适配器编写充分的单元测试 ### 扩展指南 要为新平台创建适配器,需要: 1. 继承BasePlatformAdapter类 2. 设置platform_name和platform_url属性 3. 实现query()方法的平台特定逻辑 4. 实现close()方法清理资源 5. 在CitationEngine中注册新适配器 6. 编写相应的测试用例 该架构为AI平台集成提供了一个稳健、可扩展的基础,能够支持未来更多的平台集成需求。