在这个插件中,“语义(semantic)”指的是超越关键词字面匹配的意义理解。它主要用于“语义搜索”和“语义推荐”,也就是插件在搜索和推荐功能中会使用“内容的含义”来进行更智能的匹配,而不仅仅是对关键词的简单比对。
具体理解方式如下:
✅ 传统搜索(非语义)
WordPress 默认搜索是基于关键词的。例如:
- 用户输入“汽车”,只会匹配标题或内容中包含“汽车”这个词的文章。
- 不会理解“轿车”或“交通工具”与“汽车”的关系。
✅ 语义搜索(semantic search)
语义搜索的目标是理解查询的含义。例如:
- 用户搜索“汽车”,系统可以通过向量匹配的方式,找到那些虽然没有出现“汽车”这个词,但其内容与“汽车”相关的文章(比如包含“轿车”、“特斯拉”、“交通工具”等词)。
它的实现方式是这样的:
- 插件将文章内容通过 AI 算法转化成一种“向量”(embedding)——这是内容的语义表达。
- 用户搜索时,也将输入转换为向量。
- 然后通过计算向量之间的相似度(例如余弦相似度),找出和搜索意图最相似的文章。
插件中“语义”的用途主要体现在:
generate_post_embedding()
:为每篇文章生成语义向量。get_semantic_matches()
:获取和用户搜索语义上最接近的文章。semantic_weight
:控制语义匹配的权重,用于和传统关键词匹配结果混合排序。
举个例子:
文章A 内容: “特斯拉是一家电动汽车制造公司。”
文章B 内容: “旅游时最好租一辆车,比如SUV。”
用户搜索: “电动车”
- 传统搜索 可能找不到文章A(因为“电动车”没出现)。
- 语义搜索 能识别“特斯拉”≈“电动车”,于是推荐文章A。
总结来说:
插件中的“语义(semantic)”指的是利用 AI 向量技术,从“意义”层面理解内容,提升搜索和推荐的相关性与智能化程度。
这个 WordPress 插件 AI-Powered Search & Recommendation
的主要功能是:
核心功能:
✅ 增强搜索功能(Enhanced Search)
- 利用语义匹配(semantic matching)提升 WordPress 的搜索质量,而不是仅基于关键词。
- 当用户搜索时,插件不仅使用传统的关键词匹配,还结合语义嵌入(embeddings)来找出含义相似的内容。
- 插件会在用户搜索时使用 AJAX 进行实时搜索建议(live search)。
✅ 内容推荐功能(Content Recommendations)
- 在文章内容下方自动插入推荐文章,基于语义相似性推荐内容,而不是简单的标签或分类匹配。
- 也提供短代码
[ai_recommendations]
用于手动插入推荐内容。
AI 嵌入与数据库支持:
- 插件在后台为每篇文章生成一个“语义嵌入(embedding)”,保存在自建的数据库表中(
wp_ai_search_embeddings
)。 - 当文章保存或更新时会重新生成嵌入。
- 提供后台按钮可以一键重新生成所有嵌入。
- 提供定期任务清理已删除文章的嵌入数据。
插件的其他功能模块包括:
- 设置页面:允许启用/禁用搜索、推荐、调整语义匹配权重等。
- Gutenberg 支持:提供两个区块(搜索输入框 + 推荐内容)可拖放到编辑器中。
- 小工具支持:将搜索框作为 widget 添加到侧边栏。
- 支持 AJAX 接口、JS 交互(
assets/js/ai-search.js
)实现实时搜索和前端交互。
总结一句话:
这个插件的主要目的是通过 AI 语义嵌入来增强 WordPress 搜索体验和提供智能的文章推荐功能,相比传统关键词搜索,它能更“理解”内容含义,提升用户的发现体验。
在这段代码里,**“语义”**相关的核心逻辑主要落在这几个方法里:
generate_embedding( $text )
- 负责把一段文本转成一个“向量”(PHP 数组形式),其中包含“关键词权重”、“语言学特征”、“格式信号”、“hash 指纹”等维度,然后归一化。
- 问题点/改进建议
- 伪 TF-IDF 计算里没有全站词频统计(IDF),只有单篇文档内频率(TF),建议接入真正的向量服务来保持全站一致性。
- 当前 stop-words 列表可以更精简或本地化,或者直接用成熟库。
- 手写的“句子长度”“词长分布”特征维度算复杂,也容易跑偏;如果接入外部模型,完全可以去掉这块自定义特征,只用模型输出的 embedding。
get_semantic_matches( $query_string, $limit )
- 先调用
generate_embedding()
把查询也向量化,再把所有文章的 embedding 从数据库拉出来,逐条计算余弦相似度,排序取 top N。 - 问题点/改进建议
- 如果文章数目非常多(上千篇),每次搜索都全表扫描、计算向量会有性能瓶颈,建议借助专门的向量数据库(如 Pinecone、Weaviate、Redis Vector)或至少用 MySQL 的向量索引(5.7+ 支持)。
- 余弦相似度里人为加倍关键词维度权重(
if $key<25 weight=2.0
)可能导致整体语义效果失衡。生产环境下建议直接用专属模型的 embedding,无需再做二次加权。
- 先调用
enhance_search()
- 把语义结果的文章 ID 注入到 WP_Query,给它们一个“semantic_weight” 的排序加成。
- 这里逻辑基本 OK,但要注意:
- 如果语义列表为空,直接 fallback 回原生搜索。
- 词语纠错(
correct_typos()
)是很基础的映射,建议用专业拼写校正服务(如 Bing Spell Check API、Hunspell)。
如果要接入真正的 AI 服务
最佳接入点
generate_embedding()
:
目前它是一个“本地模拟”方法,你只需把内部逻辑替换成调用 AI 平台的 embedding API。返回格式依然是一个向量数组即可,不需要改其他地方。correct_typos()
:
可以接入更智能的校正 API,但不是关键。
推荐的 AI 方案
- OpenAI Embeddings
- Endpoint:
/v1/embeddings
- 模型:
text-embedding-3-small
(小成本)或text-embedding-3-large
(更精确) - 优势:成熟稳定,社区支持广,PHP 可用 cURL 或官方 SDK 调用。
- Endpoint:
- Azure OpenAI
- 与 OpenAI 通几乎同样的接口,但如果你已经在 Azure 上有订阅,可以考虑。
- 自己部署的小模型
- 像 sentence-transformers(
all-MiniLM-L6-v2
)在本地或者自托管服务器上跑,节省 API 调用费,适合对隐私敏感的场景。但运维成本稍高。
- 像 sentence-transformers(
private function generate_embedding($text) {
// 1. 调用 OpenAI API
$response = wp_remote_post('https://api.openai.com/v1/embeddings', [
'headers' => [
'Authorization' => 'Bearer ' . OPENAI_API_KEY,
'Content-Type' => 'application/json',
],
'body' => json_encode([
'model' => 'text-embedding-3-small',
'input' => $text,
]),
]);
$body = json_decode(wp_remote_retrieve_body($response), true);
if (isset($body['data'][0]['embedding'])) {
return $body['data'][0]['embedding'];
}
return false;
}
把原来的“手写向量”逻辑全删掉或注释,然后替换成像上面这样一段即可。
小结
- 目前的“本地实现”能跑通,但效果和扩展性有限。
- 最佳集成点在
generate_embedding()
,把它换成调用 OpenAI Embeddings(或类似服务)就完成了最核心的“语义”升级。 - 后端性能和检索速度可再优化为向量数据库或索引方案。