我让搜索引擎理解 emoji(而且奇怪地有用)

发布: (2025年12月11日 GMT+8 08:28)
4 min read
原文: Dev.to

Source: Dev.to

演示链接

  • 钥匙表情 → 获取实际钥匙:
  • 自行车表情 → 获取自行车及配件:
  • 打印机 + 纸张 → 获取打印机耗材:
  • 可爱宠物耳环(珠宝店) → 即使商品标题是其他语言,也能找到猫和狗的耳环:
  • 测量 🔥(技术文档) → 推荐用于测量温度/火焰的设备:

流程

  1. 爬取网站 → 使用 Trafilatura 提取文本。
  2. 生成嵌入:通过 BGE‑M3(BAAI)得到 1024 维向量。
  3. 存储Solr 中,既保存原始文本也保存向量。
  4. 查询时:执行词汇检索 + 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 能力是自然地源自多语言嵌入的使用,并在跨语言和概念搜索中表现出意想不到的实用价值。欢迎就设置或混合搜索的任何问题进行交流。

Back to Blog

相关文章

阅读更多 »