|
|
1 день назад | |
|---|---|---|
| applications | 1 год назад | |
| routes | 1 год назад | |
| test | 2 лет назад | |
| tools | 1 год назад | |
| .gitignore | 2 лет назад | |
| Dockerfile | 2 лет назад | |
| LICENSE | 2 лет назад | |
| README.md | 1 день назад | |
| alg.toml | 2 лет назад | |
| alg_app.py | 1 год назад | |
| docker-compose.yaml | 2 лет назад | |
| requirements.txt | 1 год назад |
面向公众号长文场景的算法服务,提供历史文章查询、候选文章过滤、账号兴趣相关性评分、文章排序、文本向量化和文章爬取入库能力。
服务基于 Quart/ASGI 构建,使用 BGE 计算标题级语义相关性,默认通过 Hypercorn 监听 6060 端口。
BAAI/bge-large-zh-v1.5 生成中文文本 embedding,并计算余弦相似度。lili666/text2vec-word2vec-tencent-chinese 提供分词和词向量测试接口。match/case)similarities / text2vec.
├── alg_app.py # 应用入口、数据库和模型初始化
├── alg.toml # Hypercorn 配置
├── routes/
│ ├── __init__.py # HTTP 路由注册
│ ├── accountArticleRank.py # 候选文章过滤与排序
│ ├── accountServer.py # 账号兴趣相关性评分
│ ├── articleDBServer.py # 公众号文章爬取和入库
│ ├── nlpServer.py # NLP 功能分发
│ └── word_2_vec.py # 分词与 Word2Vec 编码
├── applications/
│ ├── articleTools.py # 历史文章和账号统计查询
│ ├── textSimilarity.py # 相似度矩阵及聚合算法
│ ├── embedding_manager.py # embedding 内存/磁盘缓存
│ ├── pipeline.py # 重复、质量和安全过滤
│ ├── asyncMySQL.py # 异步 MySQL 连接池
│ ├── wxSpider.py # 外部公众号爬虫客户端
│ ├── aliyunLog.py # 阿里云日志客户端
│ └── functions/ # 排序调用和标题规则工具
├── test/ # 手工联调脚本
├── tools/ # 辅助脚本
├── Dockerfile
├── docker-compose.yaml
└── requirements.txt
主排序链路使用 BAAI/bge-large-zh-v1.5,而不是 Word2Vec。计算过程如下:
候选标题 ──BGE──> 1024 维语义向量 ─┐
├──> 余弦相似度矩阵 ──> 聚合 ──> 相关性分数
历史标题 ──BGE──> 1024 维语义向量 ─┘
两个文本向量的余弦相似度为:
similarity(a, b) = (a · b) / (||a||₂ × ||b||₂)
若有 n 个候选标题和 m 个历史标题,服务会生成 n × m 的相似度矩阵。每个候选标题可通过以下方式得到最终分数:
max:取该候选标题与所有历史标题相似度的最大值。mean:取该候选标题与所有历史标题相似度的算术平均值。avg:将历史文章阅读量经过 L2 归一化和 softmax 后作为权重,对相似度加权求和。embedding 由 EmbeddingManager 缓存在内存中,并定期持久化到 cache/embedding_cache.npy 和对应的 key 文件。缓存只减少重复模型推理,不改变相似度算法。
候选文章
→ 过滤历史低质量标题
→ 过滤历史已发布的相似标题
→ 调用敏感内容服务
→ 查询账号历史高表现文章
→ 计算 BGE 语义相关性
→ 按策略排序
→ 标题去重
→ 截取 publishNum 篇文章
当前策略:
ArticleRankV1:按 producePlanName 将文章分为 【1】、【2】 和其他三组;部分分组按相关性排序,【2】 分组按阅读量排序,最后合并和去重。ArticleRankV2:统一按相关性降序、crawlerViewCount 降序排序。ArticleRankV3、ArticleRankV4、ArticleRankV5:当前复用 ArticleRankV1 的实现。| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/healthCheck |
服务连通性检查 |
POST |
/embed |
jieba 分词和 Word2Vec 向量化 |
POST |
/nlp |
文本相似度及相似度矩阵聚合 |
POST |
/score_list |
计算候选标题与账号兴趣的相关性 |
POST |
/title_list |
查询公众号历史标题 |
POST |
/articleRank |
过滤并排序待发布文章 |
POST |
/article_crawler |
抓取公众号文章并写入 MySQL |
curl -X POST http://localhost:6060/nlp \
-H 'Content-Type: application/json' \
-d '{
"function": "similarities",
"data": {
"text_a": ["新能源汽车销量持续增长"],
"text_b": ["电动车市场快速扩张"]
}
}'
function 支持:
similaritiessimilarities_crosssimilarities_cross_maxsimilarities_cross_meansimilarities_cross_avg启动过程不是纯本地运行,当前实现要求:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
hypercorn alg_app:app --config alg.toml
健康检查:
curl http://localhost:6060/healthCheck
docker compose up --build
alg.toml 当前配置 3 个 worker。每个 worker 都会分别加载模型,需要根据实际内存或显存容量调整 worker 数量。
test/ 目录当前主要存放连接固定环境的手工联调脚本,不是隔离外部依赖的自动化测试套件。运行这些脚本可能访问数据库或内部 HTTP 服务,执行前应先检查目标地址和请求数据。
建议优先补充以下自动化测试:
/nlp 的相似度矩阵和聚合算法单元测试。/score_list 的数据库查询与账号兴趣计算契约测试。/articleRank 的过滤、分组、去重和排序测试。requests 调用,会阻塞 event loop。/title_list 和 /score_list,增加了延迟和故障传播范围。accountName、account_nickname_list、ghId、gh_id_list 等多套命名,调用接口前应核对契约。容器入口为:
hypercorn alg_app:app --config alg.toml
默认监听 0.0.0.0:6060。生产部署前应至少完成: