这是一个基于 transformers.js 的前端语义搜索和文档聊天的应用。
基于 transformers.js 的前端实时语义搜索和文档聊天
尝试 web 应用、安装 Chrome 扩展或阅读介绍博文。
在浏览器中进行语义搜索! 使用 transformers.js 和来自 Hugging Face 的最新 SOTA 嵌入模型,在客户端计算嵌入和余弦相似度,无需服务器端推理。
模型
支持所有与 transformers.js 兼容的特征提取模型。这里有一个可排序的列表供您浏览:每日更新列表。在此处下载兼容模型表格:xlsx、csv、json、parquet 或 html 格式: https://github.com/do-me/trending-huggingface-models/。
目录
您可以使用超快的预索引示例,对像《圣经》或《悲惨世界》这样的大型书籍(数百页)进行搜索,在不到2秒的时间内搜索完整内容 🚀。尝试其中一个,自行体验:
导入和导出
您可以自己创建索引,保存下来。如果是私密内容,请自行保留;如果是经典著作或您认为其他人可能感兴趣的内容,可以考虑在Hugging Face 仓库上提交 PR,或联系我们。如果您提供了可复制的良好来源链接,我们很乐意满足图书请求。任何涉及歧视性内容的行为都是不被容忍的。
安装
克隆仓库,并用以下命令安装依赖项:
npm install
然后运行:
npm run start
如果要进行构建,运行:
npm run build
构建完成后,您将在 dist
目录中找到 index.html
、main.css
和 bundle.js
。
浏览器扩展
从 Chrome 网上应用店下载 Chrome 扩展,并将其固定。右击扩展图标的 options
:
- 对于多语言使用,选择
distiluse-base-multilingual-cased-v2
(默认是仅英语) - 对于较大的文本,设置一个更高的最小字符数来进行分割
本地构建
如果您想在本地构建浏览器扩展,请克隆仓库,进入 extension
目录,然后运行:
npm install
npm run build
进行静态构建,或npm run dev
进行自动刷新的开发版本- 转到 Chrome 扩展设置
chrome://extensions
- 选择
Load Unpacked
并选择build
文件夹 - 在 Chrome 中固定扩展,以便于访问。如果对您不起作用,请随时提出问题。
性能
在整本《白鲸》(Moby Dick)中进行测试,共 660,000 个字符,约 13,000 行或 111,000 个单词。 在我的老式 i7-8550U CPU 上,使用 1000 个字符作为分段大小,初始嵌入生成需要 1-2 分钟。后续查询只需要约 2 秒! 如果您想查询更大的文本,或保留一整个书籍库的索引,请使用合适的矢量数据库。
功能
您可以自定义所有内容!
- 输入文本和搜索词
- 混合搜索(语义搜索和全文搜索)
- 分段长度(越大越快,越小越慢)
- 高亮颜色(目前已硬编码)
- 高亮数量基于阈值值。值越低,结果越多。
- 实时更新
- 感谢 transformers.js,可轻松集成其他 ML 模型
- 注重数据隐私 - 您的输入文本数据不会发送到服务器,而是保留在您的浏览器中!
使用场景
- 对任何内容进行基本搜索,如您的个人笔记(这也是我的初衷,无法再处理一个巨大的 notes.txt 文件)
- 还记得在学校时对诗歌进行分析吗?经常需要寻找可能的主导动机或如《汉赛尔和格莱特》中的重复类别,如食物
未来想法
这是一个英语到中文的翻译,请提供源文本的中文翻译。 注意:翻译需要符合中文语序、流程、通顺。
- 可以很好地打包所有内容,并使用它,例如代替 JavaScript 搜索引擎,如 Lunr.js(也被用在 mkdocs-material)。
- 集成到 mkdocs (mkdocs-material) 实验性:
- 在构建文档时,将所有
.md
文件分块(长度在mkdocs.yaml
中定义)。应该相当大(>800 个字符),以降低响应时间。也可以构建 n 个索引,首先是粗略索引(每个文档/.md
文件,如果所使用的模型支持该长度),然后是细化索引(针对文档块)。 - 通过计算所有文档/块的嵌入来构建索引。
- 当用户查询文档时,可以切换(快速)全文标准搜索(目前使用 lunr.js)或实验性语义搜索。
- 如果选择后者,客户端会加载模型(all-MiniLM-L6-v2 约 30MB)。
- 如同在 SemanticFinder 中,嵌入是在客户端创建的,余弦相似度也在客户端计算。
- 高分结果就像使用 lunr.js 一样返回,所以用户不应该注意到 UI 上的差异。
- 在构建文档时,将所有
- 电子应用程序或浏览器应用程序也可以增强语义搜索,例如 VS Code、Atom 或移动应用程序。
- 集成到个人维基系统,如 Obsidian、tiddlywiki 等,可以节省您繁琐的标记/关键词/分类工作,或至少进一步改善您的结构。
- 搜索您自己的浏览历史记录(感谢 @Snapdeus)。
- 集成到聊天应用程序。
- 允许 PDF 上传(从 PDF 转换为文本)。
- 与变压器.js 的语音转文本 whisper 模型集成,允许音频上传。
- 由于 CodeMirror,我们甚至可以为 Python、JavaScript 等编程语言使用语法高亮显示。
逻辑
Transformers.js 承担了对输入进行标记和运行模型的繁重工作。没有它,这个演示是不可能的。
输入
- 尽可能多的文本!演示使用了"汉塞尔和格雷特"的一部分,但它可以处理数百页 PDF。
- 一个搜索词或短语。
- 文本应该分段的字符数。
- 相似度阈值。得分低于该阈值的结果将不会显示。
输出
- 三个高亮显示的字符串片段,越深色相似度越高。
流水线
- 加载所有脚本。模型从 HuggingFace 加载一次,然后缓存在浏览器中。
- 用户输入一些文本和搜索词或短语。
- 根据考虑的近似长度(单位为字符),文本被分割成分段。单词本身从不分割,这就是为什么是近似的原因。
- 创建搜索词嵌入。
- 对于文本的每个分段,创建嵌入。
- 与此同时,计算每个分段嵌入与搜索词嵌入之间的余弦相似度。将其写入一个以分段为键、得分为值的字典。
- 在每次迭代中,根据字典中的最高得分实时更新进度条和高亮显示的部分。
- 将嵌入缓存在字典中,后续查询速度会快得多。计算余弦相似度的速度比生成嵌入快得多。
- 只有在用户改变分段长度时,才需要重新计算嵌入。
协作
欢迎提交 PR!
待办事项(没有优先级)
- 相似度分数阈值/截止值
- 添加选项以高亮显示更多(例如所有高于某个分数的部分)
- 添加停止按钮
- 使用 MaterialUI 进行输入字段或适当的标签
- 创建一个不使用 CDN 的演示
- 将 HTML 适当分离为 HTML、JS、CSS
- 添加 npm 安装
- 从文件加载嵌入的选项,或者以某种方式允许共享嵌入
- 简化分块函数,以便可以不受问题地加载原始文本
- 改善颜色范围
- 用 Rust 重写余弦相似度函数,移植到 WASM 并作为模块加载,以获得可能的加速(实验性)
- 重新设计 UI
- 改善代码
- - 混合使用 jQuery/纯 JS
- - 清理函数
- - 添加更多注释
- 添加可能的使用案例
- 打包为独立应用程序(可能有自定义模型选择;从 HF hub 下载一次,然后本地保存)
- 可能在 transformers.js 主页中作为示例集成
星星历史
Gource 地图
使用以下命令创建 Gource 图像:
gource -1280x720 --title "SemanticFinder" --seconds-per-day 0.03 --auto-skip-seconds 0.03 --bloom-intensity 0.5 --max-user-speed 500 --highlight-dirs --multi-sampling --highlight-colour 00FF00