读者最常问的问题其实不是某个具体技术点,而是:「你写过关于 XX 的内容吗?」——搜索引擎很难回答这种问题,因为它要的不是关键词匹配,而是语义召回。

整体流程

  • build 时为每篇文章生成 embedding,连同摘要一起缓存进 JSON
  • 读者提问 → 问题的 embedding → 余弦相似度取 top-5
  • 把命中的片段拼进 prompt,要求模型带引用编号回答
  • 回答里的引用渲染成卡片,点击直达原文

为什么不用向量数据库

几百篇文章的量级,一个 JSON 文件加上几十行 JS 的余弦计算就够了,省掉一个常驻服务。等文章过千、或需要按段落细粒度检索时,再考虑专业向量库也不迟。

function cosine(a: number[], b: number[]) {
  let dot = 0, na = 0, nb = 0;
  for (let i = 0; i < a.length; i++) {
    dot += a[i] * b[i];
    na += a[i] ** 2;
    nb += b[i] ** 2;
  }
  return dot / (Math.sqrt(na) * Math.sqrt(nb));
}

检索质量的上限,取决于你切分文章的方式,而不是模型本身。

整套管线的成本控制思路,写在摘要管线里:AI 只在 build 时干活,读者请求的路径上没有任何模型调用。