geo/.qoder/repowiki/zh/content/AI平台集成/文心平台集成.md

476 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 文心平台集成
<cite>
**本文档引用的文件**
- [wenxin.py](file://backend/app/workers/platforms/wenxin.py)
- [base.py](file://backend/app/workers/platforms/base.py)
- [search_engine.py](file://backend/app/workers/platforms/search_engine.py)
- [citation_engine.py](file://backend/app/workers/citation_engine.py)
- [config.py](file://backend/app/config.py)
- [query.py](file://backend/app/models/query.py)
- [queries.py](file://backend/app/api/queries.py)
- [Dockerfile](file://backend/Dockerfile)
- [kimi.py](file://backend/app/workers/platforms/kimi.py)
- [tongyi.py](file://backend/app/workers/platforms/tongyi.py)
- [test_citations.py](file://tests/test_citations.py)
</cite>
## 更新摘要
**变更内容**
- 文心平台适配器已简化为搜索引擎模式移除Playwright浏览器自动化实现
- 采用统一的搜索引擎查询机制,通过`fetch_search_content`函数获取内容
- 所有平台适配器wenxin、kimi、tongyi等均采用相同的简化模式
- 移除复杂的页面交互策略和稳定性检测逻辑
- 保留重试机制和错误处理策略
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向"文心平台集成"的技术与非技术读者,系统性说明文心一言平台适配器的实现方式,涵盖以下方面:
- 文心适配器的职责与实现模式(基于搜索引擎查询)
- 请求参数构建(关键词处理、搜索引擎查询策略)
- HTTP请求与搜索引擎交互流程DuckDuckGo、Wikipedia API
- 响应解析与内容提取HTML解析、文本清理
- 配置管理(环境变量、超时与重试策略)
- 错误处理与异常恢复
- 安全注意事项与最佳实践
## 项目结构
文心平台集成位于后端工作流模块中,采用"适配器 + 引擎"的分层设计:
- 适配器层:负责具体平台的搜索引擎查询交互
- 引擎层:编排多平台查询、品牌匹配与统计
- 搜索引擎层:提供统一的搜索内容获取能力
- 配置层集中管理运行时参数如API密钥占位、超时设置
```mermaid
graph TB
subgraph "适配器层"
Base["BasePlatformAdapter<br/>抽象接口"]
Wenxin["WenxinAdapter<br/>文心一言适配器"]
Kimi["KimiAdapter<br/>Kimi适配器"]
Tongyi["TongyiAdapter<br/>通义千问适配器"]
End
subgraph "搜索引擎层"
Search["SearchEngine<br/>搜索引擎模块"]
DDG["DuckDuckGo<br/>HTML搜索"]
Wiki["Wikipedia API<br/>百科查询"]
End
subgraph "引擎层"
Engine["CitationEngine<br/>引用检测引擎"]
End
subgraph "配置层"
Cfg["Settings<br/>环境配置"]
Docker["Dockerfile<br/>容器化配置"]
End
subgraph "数据模型"
QModel["Query<br/>查询模型"]
End
Base --> Wenxin
Base --> Kimi
Base --> Tongyi
Wenxin --> Search
Kimi --> Search
Tongyi --> Search
Search --> DDG
Search --> Wiki
Engine --> Wenxin
Engine --> QModel
Wenxin --> Cfg
Docker --> Wenxin
```
**图表来源**
- [base.py:1-18](file://backend/app/workers/platforms/base.py#L1-L18)
- [wenxin.py:10-38](file://backend/app/workers/platforms/wenxin.py#L10-L38)
- [kimi.py:10-38](file://backend/app/workers/platforms/kimi.py#L10-L38)
- [tongyi.py:10-38](file://backend/app/workers/platforms/tongyi.py#L10-L38)
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
- [citation_engine.py:161-176](file://backend/app/workers/citation_engine.py#L161-L176)
- [config.py:9-23](file://backend/app/config.py#L9-L23)
- [Dockerfile:1-41](file://backend/Dockerfile#L1-L41)
- [query.py:11-55](file://backend/app/models/query.py#L11-L55)
**章节来源**
- [base.py:1-18](file://backend/app/workers/platforms/base.py#L1-L18)
- [wenxin.py:10-38](file://backend/app/workers/platforms/wenxin.py#L10-L38)
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
- [citation_engine.py:161-176](file://backend/app/workers/citation_engine.py#L161-L176)
- [config.py:9-23](file://backend/app/config.py#L9-L23)
- [Dockerfile:1-41](file://backend/Dockerfile#L1-L41)
- [query.py:11-55](file://backend/app/models/query.py#L11-L55)
## 核心组件
- 文心适配器WenxinAdapter实现文心一言平台的搜索引擎查询能力负责关键词拼接与搜索内容获取
- 搜索引擎模块SearchEngine提供统一的搜索内容获取能力支持DuckDuckGo和Wikipedia API
- 引擎CitationEngine编排查询任务调用适配器获取原始响应进行品牌匹配与竞争品牌检测并持久化结果
- 基类BasePlatformAdapter定义统一的平台适配器接口约束平台名称、URL与查询方法
- 配置Settings集中管理数据库、Redis、JWT、Playwright浏览器路径以及API密钥占位等配置项
- 数据模型Query承载查询任务的元数据包括关键词、目标品牌、平台集合、频率与状态等
**章节来源**
- [wenxin.py:10-38](file://backend/app/workers/platforms/wenxin.py#L10-L38)
- [search_engine.py:16-77](file://backend/app/workers/platforms/search_engine.py#L16-L77)
- [citation_engine.py:161-176](file://backend/app/workers/citation_engine.py#L161-L176)
- [base.py:4-18](file://backend/app/workers/platforms/base.py#L4-L18)
- [config.py:9-23](file://backend/app/config.py#L9-L23)
- [query.py:11-55](file://backend/app/models/query.py#L11-L55)
## 架构总览
文心平台集成采用"搜索引擎查询 + 引擎编排"的架构:
- 引擎接收查询请求,按平台顺序调用适配器
- 适配器通过搜索引擎模块获取与关键词相关的内容
- 适配器进行重试与错误处理,返回原始文本
- 引擎进行品牌匹配与统计,写入数据库
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Engine as "CitationEngine"
participant Adapter as "WenxinAdapter"
participant Search as "SearchEngine"
participant DDG as "DuckDuckGo"
participant Wiki as "Wikipedia API"
Client->>Engine : "发起查询请求"
Engine->>Adapter : "query(keyword)"
Adapter->>Search : "fetch_search_content(keyword)"
Search->>DDG : "搜索关键词"
DDG-->>Search : "返回HTML结果"
Search->>Wiki : "回退到百科查询"
Wiki-->>Search : "返回百科内容"
Search-->>Adapter : "返回搜索内容"
Adapter-->>Engine : "返回原始响应文本"
Engine-->>Client : "返回引用检测结果"
```
**图表来源**
- [citation_engine.py:256-287](file://backend/app/workers/citation_engine.py#L256-L287)
- [wenxin.py:16-33](file://backend/app/workers/platforms/wenxin.py#L16-L33)
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
**章节来源**
- [citation_engine.py:161-176](file://backend/app/workers/citation_engine.py#L161-L176)
- [wenxin.py:10-38](file://backend/app/workers/platforms/wenxin.py#L10-L38)
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
## 详细组件分析
### 文心适配器WenxinAdapter
- **角色与职责**
- 实现BasePlatformAdapter接口提供文心一言平台的搜索引擎查询能力
- 使用统一的搜索引擎模块获取与关键词相关的内容
- 提供重试与指数退避策略,提升查询稳定性
- 直接返回搜索引擎返回的原始文本内容
- **关键实现要点**
- 简化的查询流程:直接调用搜索引擎模块,无需复杂的页面交互
- 重试机制最多3次尝试指数退避2^attempt秒
- 错误处理:捕获异常并记录日志,最终抛出异常
- 资源管理:搜索引擎模式无需额外资源清理
- **请求参数构建**
- 关键词处理:直接传递给搜索引擎模块,无需特殊处理
- 搜索策略:搜索引擎模块会自动处理关键词拼接和查询优化
- 超时设置搜索引擎查询超时30秒确保不会长时间阻塞
- 重试配置最多3次尝试指数退避策略
- **响应解析逻辑**
- 内容获取:直接返回搜索引擎返回的文本内容
- 文本清理由搜索引擎模块负责HTML解析和文本清理
- 错误处理:搜索引擎模块会处理各种异常情况并提供回退机制
- **安全与合规**
- 该实现为搜索引擎查询不涉及明文API密钥传递
- 使用公开的搜索引擎API无需认证
- 遵循搜索引擎的使用条款和限制
```mermaid
classDiagram
class BasePlatformAdapter {
+string platform_name
+string platform_url
+query(keyword) str
+close() void
}
class WenxinAdapter {
+query(keyword) str
+_do_query(keyword) str
+close() void
}
class SearchEngine {
+fetch_search_content(platform_name, keyword) str
+search_duckduckgo(query) str
+search_wikipedia(keyword) str
}
BasePlatformAdapter <|-- WenxinAdapter
WenxinAdapter --> SearchEngine
```
**图表来源**
- [base.py:4-18](file://backend/app/workers/platforms/base.py#L4-L18)
- [wenxin.py:10-38](file://backend/app/workers/platforms/wenxin.py#L10-L38)
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
**章节来源**
- [wenxin.py:10-38](file://backend/app/workers/platforms/wenxin.py#L10-L38)
### 搜索引擎模块SearchEngine
- **角色与职责**
- 提供统一的搜索内容获取能力
- 支持DuckDuckGo HTML搜索和Wikipedia API查询
- 实现智能回退机制,确保查询成功率
- **关键实现要点**
- DuckDuckGo搜索使用HTML解析获取搜索结果摘要
- Wikipedia回退当DuckDuckGo受限时自动切换到Wikipedia API
- HTML解析提取标题和摘要信息去除HTML标签
- 文本清理:移除引用标记和多余空白字符
- **搜索策略**
- 主要策略DuckDuckGo HTML搜索无需API密钥
- 回退策略Wikipedia API查询公开API无需认证
- 结果合并:将多个搜索结果合并为统一格式
- **错误处理**
- 搜索失败:记录警告并尝试回退策略
- 解析失败:检查返回内容的有效性
- 所有策略失败:抛出运行时错误
**章节来源**
- [search_engine.py:16-77](file://backend/app/workers/platforms/search_engine.py#L16-L77)
- [search_engine.py:79-145](file://backend/app/workers/platforms/search_engine.py#L79-L145)
- [search_engine.py:147-174](file://backend/app/workers/platforms/search_engine.py#L147-L174)
### 引擎CitationEngine
- **角色与职责**
- 编排查询任务,按平台顺序执行
- 调用适配器获取原始响应,进行品牌匹配与竞争品牌检测
- 将结果持久化为引用记录,并更新任务状态与查询时间
- **关键实现要点**
- 平台注册内置文心、Kimi、通义等适配器均可扩展更多平台
- 任务状态管理:运行中、成功、失败三种状态,失败时记录错误信息
- 结果聚合:返回引用状态、置信度、匹配类型、位置、上下文、竞争品牌与原始响应
- 关键词增强:为搜索引擎查询自动添加目标品牌关键词
- **错误处理**
- 适配器异常会被捕获并记录同时生成一条cited=False的占位记录
- 任务状态与完成时间被正确更新,保证数据一致性
```mermaid
flowchart TD
Start(["开始执行查询"]) --> InitMatcher["初始化品牌匹配器"]
InitMatcher --> IteratePlatforms["遍历平台列表"]
IteratePlatforms --> CreateTask["获取或创建任务记录"]
CreateTask --> UpdateTaskRunning["更新任务状态为 running"]
UpdateTaskRunning --> EnhanceKeyword["增强关键词添加目标品牌"]
EnhanceKeyword --> CallAdapter["调用适配器执行查询"]
CallAdapter --> ParseResult["品牌匹配与竞争品牌检测"]
ParseResult --> CreateRecord["创建引用记录"]
CreateRecord --> UpdateTaskSuccess["更新任务状态为 success"]
UpdateTaskSuccess --> NextPlatform{"还有平台吗?"}
NextPlatform --> |是| IteratePlatforms
NextPlatform --> |否| UpdateQueryTime["更新查询时间字段"]
UpdateQueryTime --> End(["结束"])
```
**图表来源**
- [citation_engine.py:177-254](file://backend/app/workers/citation_engine.py#L177-L254)
**章节来源**
- [citation_engine.py:161-176](file://backend/app/workers/citation_engine.py#L161-L176)
- [citation_engine.py:177-254](file://backend/app/workers/citation_engine.py#L177-L254)
### 配置管理Settings
- **配置项说明**
- 数据库连接DATABASE_URL
- Redis连接REDIS_URL
- JWT密钥与过期JWT_SECRET、JWT_EXPIRE_HOURS
- Playwright浏览器路径PLAYWRIGHT_BROWSERS_PATH仍保留用于其他适配器
- API密钥占位ZHIPU_API_KEY、TONGYI_API_KEY当前未用于搜索引擎适配器
- **环境变量加载**
- 通过Pydantic Settings自动从.env文件加载忽略未知字段
- **容器化与依赖**
- Dockerfile中安装系统依赖但Playwright浏览器仅用于其他适配器
- 确保搜索引擎查询功能正常运行
**章节来源**
- [config.py:9-23](file://backend/app/config.py#L9-L23)
- [Dockerfile:1-41](file://backend/Dockerfile#L1-L41)
### 数据模型Query
- **字段说明**
- 关键词、目标品牌、别名、平台集合、频率、状态、时间戳等
- 默认平台集合包含文心与Kimi便于快速启用
- **业务意义**
- 作为查询任务的载体,驱动引擎执行跨平台检索与分析
**章节来源**
- [query.py:11-55](file://backend/app/models/query.py#L11-L55)
### API入口queries.py
- **功能概述**
- 提供查询任务的增删改查接口,供前端调用
- 与服务层协作,完成权限校验与数据持久化
- **与引擎的关系**
- 引擎在后台异步执行查询API负责暴露任务管理能力
**章节来源**
- [queries.py:1-109](file://backend/app/api/queries.py#L1-L109)
## 依赖关系分析
- **组件耦合**
- CitationEngine依赖各平台适配器形成平台无关的编排层
- 所有搜索引擎适配器依赖统一的SearchEngine模块
- SearchEngine依赖外部服务DuckDuckGo、Wikipedia
- 引擎与模型解耦通过ORM进行数据持久化
- **外部依赖**
- DuckDuckGo免费HTML搜索服务
- Wikipedia API公开百科查询服务
- Docker容器化部署包含必要的系统依赖
```mermaid
graph LR
Engine["CitationEngine"] --> Wenxin["WenxinAdapter"]
Engine --> Kimi["KimiAdapter"]
Engine --> Tongyi["TongyiAdapter"]
Wenxin --> Search["SearchEngine"]
Kimi --> Search
Tongyi --> Search
Search --> DDG["DuckDuckGo"]
Search --> Wiki["Wikipedia API"]
Engine --> ORM["SQLAlchemy ORM"]
Engine --> Model["Query模型"]
```
**图表来源**
- [citation_engine.py:161-176](file://backend/app/workers/citation_engine.py#L161-L176)
- [wenxin.py:10-38](file://backend/app/workers/platforms/wenxin.py#L10-L38)
- [kimi.py:10-38](file://backend/app/workers/platforms/kimi.py#L10-L38)
- [tongyi.py:10-38](file://backend/app/workers/platforms/tongyi.py#L10-L38)
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
**章节来源**
- [citation_engine.py:161-176](file://backend/app/workers/citation_engine.py#L161-L176)
- [wenxin.py:10-38](file://backend/app/workers/platforms/wenxin.py#L10-L38)
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
## 性能考虑
- **查询效率**
- 搜索引擎查询比浏览器自动化更快,响应时间更短
- 减少内存和CPU消耗提高并发处理能力
- 无需维护浏览器实例,降低资源开销
- **稳定性优化**
- 通过搜索引擎模块的回退机制,提高查询成功率
- 统一的错误处理和重试策略
- 外部服务的超时控制,防止长时间阻塞
- **重试策略**
- 最多重试3次指数退避降低瞬时压力
- 搜索引擎查询超时30秒确保及时响应
- **缓存与优化**
- 搜索结果可利用外部服务的缓存机制
- 减少重复查询,提高整体性能
**章节来源**
- [wenxin.py:16-29](file://backend/app/workers/platforms/wenxin.py#L16-L29)
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
## 故障排查指南
- **搜索引擎查询失败**
- 现象DuckDuckGo搜索受限或返回空结果
- 处理自动回退到Wikipedia API检查网络连通性
- 参考:[search_engine.py:139-144](file://backend/app/workers/platforms/search_engine.py#L139-L144)
- **Wikipedia API查询失败**
- 现象:百科查询不可用或返回空内容
- 处理检查Wikipedia API可用性确认关键词有效性
- 参考:[search_engine.py:28-76](file://backend/app/workers/platforms/search_engine.py#L28-L76)
- **HTML解析失败**
- 现象DuckDuckGo返回的HTML结构发生变化
- 处理更新HTML解析正则表达式增加容错分支
- 参考:[search_engine.py:105-137](file://backend/app/workers/platforms/search_engine.py#L105-L137)
- **适配器查询异常**
- 现象:搜索引擎查询抛出异常
- 处理:检查重试机制;查看日志定位根因
- 参考:[wenxin.py:16-29](file://backend/app/workers/platforms/wenxin.py#L16-L29)
- **引擎执行失败**
- 现象:适配器异常导致任务失败
- 处理:记录错误信息并生成占位记录;检查日志定位根因
- 参考:[citation_engine.py:231-247](file://backend/app/workers/citation_engine.py#L231-L247)
- **单元测试验证**
- 测试覆盖平台返回值与统计数据,确保集成链路正常
- 参考:[test_citations.py:23-93](file://tests/test_citations.py#L23-L93)
**章节来源**
- [search_engine.py:139-144](file://backend/app/workers/platforms/search_engine.py#L139-L144)
- [search_engine.py:28-76](file://backend/app/workers/platforms/search_engine.py#L28-L76)
- [search_engine.py:105-137](file://backend/app/workers/platforms/search_engine.py#L105-L137)
- [wenxin.py:16-29](file://backend/app/workers/platforms/wenxin.py#L16-L29)
- [citation_engine.py:231-247](file://backend/app/workers/citation_engine.py#L231-L247)
- [test_citations.py:23-93](file://tests/test_citations.py#L23-L93)
## 结论
文心平台集成通过"搜索引擎查询 + 引擎编排"的方式,实现了对文心一言的高效查询与内容获取。其特点包括:
- 简化的适配器实现,移除复杂的浏览器自动化逻辑
- 统一的搜索引擎查询机制,提高查询成功率和稳定性
- 完善的重试与回退策略,确保在各种情况下都能获取内容
- 清晰的错误处理与任务状态管理
- 与容器化部署的无缝衔接
在实际使用中建议结合业务需求对搜索引擎查询参数进行调优并持续关注搜索引擎API的变化以保持功能的稳定性。
## 附录
### API调用示例与错误处理方案
- **示例场景**
- 前端通过查询API创建任务后台引擎按平台顺序执行
- 引擎调用文心适配器获取搜索内容,进行品牌匹配与统计
- 若搜索引擎查询异常,引擎记录失败并生成占位记录
- **错误处理方案**
- 搜索引擎查询异常自动回退到Wikipedia API记录错误并重试
- HTML解析失败更新解析规则并增加容错分支
- 外部服务不可用:使用缓存内容或回退策略
**章节来源**
- [queries.py:90-109](file://backend/app/api/queries.py#L90-L109)
- [citation_engine.py:177-254](file://backend/app/workers/citation_engine.py#L177-L254)
- [wenxin.py:16-33](file://backend/app/workers/platforms/wenxin.py#L16-L33)
### 安全注意事项与最佳实践
- **安全注意事项**
- 该实现使用公开的搜索引擎API无需API密钥
- 遵循搜索引擎的使用条款和限制
- 日志中避免输出敏感信息(如用户输入、错误堆栈)
- **最佳实践**
- 使用统一的搜索引擎模块,确保查询策略的一致性
- 设置合理的超时和重试策略,平衡稳定性与性能
- 监控搜索引擎API的可用性和性能指标
- 定期更新HTML解析规则以适应搜索引擎页面结构变化
- 使用单元测试覆盖关键流程,保障回归质量
**章节来源**
- [search_engine.py:163-174](file://backend/app/workers/platforms/search_engine.py#L163-L174)
- [test_citations.py:23-93](file://tests/test_citations.py#L23-L93)