20 KiB
20 KiB
文心平台集成
**本文档引用的文件** - [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)更新摘要
变更内容
- 文心平台适配器已简化为搜索引擎模式,移除Playwright浏览器自动化实现
- 采用统一的搜索引擎查询机制,通过
fetch_search_content函数获取内容 - 所有平台适配器(wenxin、kimi、tongyi等)均采用相同的简化模式
- 移除复杂的页面交互策略和稳定性检测逻辑
- 保留重试机制和错误处理策略
目录
简介
本文件面向"文心平台集成"的技术与非技术读者,系统性说明文心一言平台适配器的实现方式,涵盖以下方面:
- 文心适配器的职责与实现模式(基于搜索引擎查询)
- 请求参数构建(关键词处理、搜索引擎查询策略)
- HTTP请求与搜索引擎交互流程(DuckDuckGo、Wikipedia API)
- 响应解析与内容提取(HTML解析、文本清理)
- 配置管理(环境变量、超时与重试策略)
- 错误处理与异常恢复
- 安全注意事项与最佳实践
项目结构
文心平台集成位于后端工作流模块中,采用"适配器 + 引擎"的分层设计:
- 适配器层:负责具体平台的搜索引擎查询交互
- 引擎层:编排多平台查询、品牌匹配与统计
- 搜索引擎层:提供统一的搜索内容获取能力
- 配置层:集中管理运行时参数(如API密钥占位、超时设置)
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
- wenxin.py:10-38
- kimi.py:10-38
- tongyi.py:10-38
- search_engine.py:163-174
- citation_engine.py:161-176
- config.py:9-23
- Dockerfile:1-41
- query.py:11-55
章节来源
- base.py:1-18
- wenxin.py:10-38
- search_engine.py:163-174
- citation_engine.py:161-176
- config.py:9-23
- Dockerfile:1-41
- query.py:11-55
核心组件
- 文心适配器(WenxinAdapter):实现文心一言平台的搜索引擎查询能力,负责关键词拼接与搜索内容获取
- 搜索引擎模块(SearchEngine):提供统一的搜索内容获取能力,支持DuckDuckGo和Wikipedia API
- 引擎(CitationEngine):编排查询任务,调用适配器获取原始响应,进行品牌匹配与竞争品牌检测,并持久化结果
- 基类(BasePlatformAdapter):定义统一的平台适配器接口,约束平台名称、URL与查询方法
- 配置(Settings):集中管理数据库、Redis、JWT、Playwright浏览器路径以及API密钥占位等配置项
- 数据模型(Query):承载查询任务的元数据,包括关键词、目标品牌、平台集合、频率与状态等
章节来源
- wenxin.py:10-38
- search_engine.py:16-77
- citation_engine.py:161-176
- base.py:4-18
- config.py:9-23
- query.py:11-55
架构总览
文心平台集成采用"搜索引擎查询 + 引擎编排"的架构:
- 引擎接收查询请求,按平台顺序调用适配器
- 适配器通过搜索引擎模块获取与关键词相关的内容
- 适配器进行重试与错误处理,返回原始文本
- 引擎进行品牌匹配与统计,写入数据库
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 : "返回引用检测结果"
图表来源
章节来源
详细组件分析
文心适配器(WenxinAdapter)
-
角色与职责
- 实现BasePlatformAdapter接口,提供文心一言平台的搜索引擎查询能力
- 使用统一的搜索引擎模块获取与关键词相关的内容
- 提供重试与指数退避策略,提升查询稳定性
- 直接返回搜索引擎返回的原始文本内容
-
关键实现要点
- 简化的查询流程:直接调用搜索引擎模块,无需复杂的页面交互
- 重试机制:最多3次尝试,指数退避(2^attempt秒)
- 错误处理:捕获异常并记录日志,最终抛出异常
- 资源管理:搜索引擎模式无需额外资源清理
-
请求参数构建
- 关键词处理:直接传递给搜索引擎模块,无需特殊处理
- 搜索策略:搜索引擎模块会自动处理关键词拼接和查询优化
- 超时设置:搜索引擎查询超时30秒,确保不会长时间阻塞
- 重试配置:最多3次尝试,指数退避策略
-
响应解析逻辑
- 内容获取:直接返回搜索引擎返回的文本内容
- 文本清理:由搜索引擎模块负责HTML解析和文本清理
- 错误处理:搜索引擎模块会处理各种异常情况并提供回退机制
-
安全与合规
- 该实现为搜索引擎查询,不涉及明文API密钥传递
- 使用公开的搜索引擎API,无需认证
- 遵循搜索引擎的使用条款和限制
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
图表来源
章节来源
搜索引擎模块(SearchEngine)
-
角色与职责
- 提供统一的搜索内容获取能力
- 支持DuckDuckGo HTML搜索和Wikipedia API查询
- 实现智能回退机制,确保查询成功率
-
关键实现要点
- DuckDuckGo搜索:使用HTML解析获取搜索结果摘要
- Wikipedia回退:当DuckDuckGo受限时自动切换到Wikipedia API
- HTML解析:提取标题和摘要信息,去除HTML标签
- 文本清理:移除引用标记和多余空白字符
-
搜索策略
- 主要策略:DuckDuckGo HTML搜索,无需API密钥
- 回退策略:Wikipedia API查询,公开API无需认证
- 结果合并:将多个搜索结果合并为统一格式
-
错误处理
- 搜索失败:记录警告并尝试回退策略
- 解析失败:检查返回内容的有效性
- 所有策略失败:抛出运行时错误
章节来源
引擎(CitationEngine)
-
角色与职责
- 编排查询任务,按平台顺序执行
- 调用适配器获取原始响应,进行品牌匹配与竞争品牌检测
- 将结果持久化为引用记录,并更新任务状态与查询时间
-
关键实现要点
- 平台注册:内置文心、Kimi、通义等适配器,均可扩展更多平台
- 任务状态管理:运行中、成功、失败三种状态,失败时记录错误信息
- 结果聚合:返回引用状态、置信度、匹配类型、位置、上下文、竞争品牌与原始响应
- 关键词增强:为搜索引擎查询自动添加目标品牌关键词
-
错误处理
- 适配器异常会被捕获并记录,同时生成一条cited=False的占位记录
- 任务状态与完成时间被正确更新,保证数据一致性
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(["结束"])
图表来源
章节来源
配置管理(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浏览器仅用于其他适配器
- 确保搜索引擎查询功能正常运行
章节来源
数据模型(Query)
-
字段说明
- 关键词、目标品牌、别名、平台集合、频率、状态、时间戳等
- 默认平台集合包含文心与Kimi,便于快速启用
-
业务意义
- 作为查询任务的载体,驱动引擎执行跨平台检索与分析
章节来源
API入口(queries.py)
-
功能概述
- 提供查询任务的增删改查接口,供前端调用
- 与服务层协作,完成权限校验与数据持久化
-
与引擎的关系
- 引擎在后台异步执行查询,API负责暴露任务管理能力
章节来源
依赖关系分析
-
组件耦合
- CitationEngine依赖各平台适配器,形成平台无关的编排层
- 所有搜索引擎适配器依赖统一的SearchEngine模块
- SearchEngine依赖外部服务(DuckDuckGo、Wikipedia)
- 引擎与模型解耦,通过ORM进行数据持久化
-
外部依赖
- DuckDuckGo:免费HTML搜索服务
- Wikipedia API:公开百科查询服务
- Docker:容器化部署,包含必要的系统依赖
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模型"]
图表来源
章节来源
性能考虑
-
查询效率
- 搜索引擎查询比浏览器自动化更快,响应时间更短
- 减少内存和CPU消耗,提高并发处理能力
- 无需维护浏览器实例,降低资源开销
-
稳定性优化
- 通过搜索引擎模块的回退机制,提高查询成功率
- 统一的错误处理和重试策略
- 外部服务的超时控制,防止长时间阻塞
-
重试策略
- 最多重试3次,指数退避降低瞬时压力
- 搜索引擎查询超时30秒,确保及时响应
-
缓存与优化
- 搜索结果可利用外部服务的缓存机制
- 减少重复查询,提高整体性能
章节来源
故障排查指南
-
搜索引擎查询失败
- 现象:DuckDuckGo搜索受限或返回空结果
- 处理:自动回退到Wikipedia API;检查网络连通性
- 参考:search_engine.py:139-144
-
Wikipedia API查询失败
- 现象:百科查询不可用或返回空内容
- 处理:检查Wikipedia API可用性;确认关键词有效性
- 参考:search_engine.py:28-76
-
HTML解析失败
- 现象:DuckDuckGo返回的HTML结构发生变化
- 处理:更新HTML解析正则表达式;增加容错分支
- 参考:search_engine.py:105-137
-
适配器查询异常
- 现象:搜索引擎查询抛出异常
- 处理:检查重试机制;查看日志定位根因
- 参考:wenxin.py:16-29
-
引擎执行失败
- 现象:适配器异常导致任务失败
- 处理:记录错误信息并生成占位记录;检查日志定位根因
- 参考:citation_engine.py:231-247
-
单元测试验证
- 测试覆盖平台返回值与统计数据,确保集成链路正常
- 参考:test_citations.py:23-93
章节来源
- search_engine.py:139-144
- search_engine.py:28-76
- search_engine.py:105-137
- wenxin.py:16-29
- citation_engine.py:231-247
- test_citations.py:23-93
结论
文心平台集成通过"搜索引擎查询 + 引擎编排"的方式,实现了对文心一言的高效查询与内容获取。其特点包括:
- 简化的适配器实现,移除复杂的浏览器自动化逻辑
- 统一的搜索引擎查询机制,提高查询成功率和稳定性
- 完善的重试与回退策略,确保在各种情况下都能获取内容
- 清晰的错误处理与任务状态管理
- 与容器化部署的无缝衔接
在实际使用中,建议结合业务需求对搜索引擎查询参数进行调优,并持续关注搜索引擎API的变化以保持功能的稳定性。
附录
API调用示例与错误处理方案
-
示例场景
- 前端通过查询API创建任务,后台引擎按平台顺序执行
- 引擎调用文心适配器获取搜索内容,进行品牌匹配与统计
- 若搜索引擎查询异常,引擎记录失败并生成占位记录
-
错误处理方案
- 搜索引擎查询异常:自动回退到Wikipedia API;记录错误并重试
- HTML解析失败:更新解析规则并增加容错分支
- 外部服务不可用:使用缓存内容或回退策略
章节来源
安全注意事项与最佳实践
-
安全注意事项
- 该实现使用公开的搜索引擎API,无需API密钥
- 遵循搜索引擎的使用条款和限制
- 日志中避免输出敏感信息(如用户输入、错误堆栈)
-
最佳实践
- 使用统一的搜索引擎模块,确保查询策略的一致性
- 设置合理的超时和重试策略,平衡稳定性与性能
- 监控搜索引擎API的可用性和性能指标
- 定期更新HTML解析规则以适应搜索引擎页面结构变化
- 使用单元测试覆盖关键流程,保障回归质量
章节来源