我让搜索引擎理解 emoji(而且奇怪地有用)
发布: (2025年12月11日 GMT+8 08:28)
4 min read
原文: Dev.to
Source: Dev.to
演示链接
- 钥匙表情 → 获取实际钥匙:
- 自行车表情 → 获取自行车及配件:
- 打印机 + 纸张 → 获取打印机耗材:
- 可爱宠物耳环(珠宝店) → 即使商品标题是其他语言,也能找到猫和狗的耳环:
- 测量 🔥(技术文档) → 推荐用于测量温度/火焰的设备:
流程
- 爬取网站 → 使用 Trafilatura 提取文本。
- 生成嵌入:通过 BGE‑M3(BAAI)得到 1024 维向量。
- 存储 在 Solr 中,既保存原始文本也保存向量。
- 查询时:执行词汇检索 + KNN 向量检索并合并得分(混合方式)。
为什么 Emoji 有效
- BGE‑M3 在多语言 + 多模态数据上进行训练,学习到表情符号(例如 🔑)在语义上与多种语言的对应词(“key”、 “Schlüssel”、 “cheie”等)非常接近。
- 因此,使用 🚲 进行搜索时会返回 “bicycle”、 “bike”、 “Fahrrad”、 “bicicletă”等结果,无需任何显式的翻译层。
嵌入与基础设施
| 组件 | 细节 |
|---|---|
| 嵌入模型 | BGE‑M3(BAAI),1024 维 |
| 推理硬件 | RTX 4000 Ada,约 2–5 ms/查询 |
| 搜索引擎 | Solr 9.6,支持稠密向量 |
| 爬取技术栈 | 自定义 PHP + Python(Playwright 处理 JS 重度站点,Trafilatura 进行抽取) |
| 额外功能 | VADER(情感分析),langid(语言检测),自定义价格抽取 |
| 查询延迟 | ~40–50 ms 总计(包括嵌入生成) |
混合搜索 vs. 纯向量搜索
- 纯向量搜索 能够找出语义相似的条目,但可能把完全匹配的结果排在后面,处理商品代码/SKU 时表现不佳,并且与用户期望冲突(例如 “nike shoes” 应该优先返回 Nike 品牌的商品)。
- 混合方式:词汇组件保证精确匹配;向量组件处理 “我不知道确切词汇,但我知道想要的东西” 类的查询。
Solr 查询示例
# Vector part
vectorQuery = {!knn f=embeddings topK=250}[-0.032, 0.009, -0.049, ...]
# Lexical part
lexicalQuery = {!edismax qf="title^550 description^450 uri^1 text^0.1"
pf="title^1100 description^900" ...}
# Combined score
q = {!func}sum(
product(1, query($vectorQuery)),
product(1, div(query($lexicalQuery), sum(query($lexicalQuery), 6)))
)
Solr 调试视图(右下角按钮)会显示实际的向量查询函数。
实验性功能:结果解释
本地 LLM(运行在同一块 GPU 上)可以为检索结果生成解释。例如,在技术文档站点搜索 “measure 🔥” 时,会返回具体的设备推荐,并从已索引的 PDF 中提取上下文。
结束语
Emoji 能力是自然地源自多语言嵌入的使用,并在跨语言和概念搜索中表现出意想不到的实用价值。欢迎就设置或混合搜索的任何问题进行交流。