Website Bot
Website Bot
Website Bot
这个仓库现在包含一个嵌入在 Knockoff Pipeline 网站里的悬浮 bot。
它本质上是一个轻量级 RAG 问答功能,而不是完整的 agent 系统。
目标
- 基于站点中已经发布的 knockoff 文档进行问答
- 保持原有 Hugo 网站结构不变,只增加一个功能
- 同时支持本地开发和远端部署
- 当大模型不可用时,仍然能退回到检索式回答
技术栈
- 前端:Hugo + Hextra + 原生 JavaScript + CSS
- 后端:FastAPI + Uvicorn
- 检索:本地文本解析、切块、关键词匹配、类 TF-IDF 打分
- 大模型接口:OpenAI-compatible
/chat/completions - 支持的 provider:Gemini、OpenAI、Groq、OpenRouter、Ollama
- 部署:
- 前端使用 GitHub Pages
- 后端使用 Hugging Face Spaces(Docker)
主要文件
layouts/_partials/scripts.html- 把悬浮 bot 根节点注入到站点布局中
static/bot-launcher.js- 处理拖拽、展开/收起、发送请求、渲染消息
assets/css/custom.css- 定义悬浮图标和聊天面板样式
backend/app.py- 提供
/api/health、/api/chat、/api/reindex
- 提供
backend/rag.py- 负责文档解析、切块、检索和 fallback 摘句回答
backend/llm.py- 把检索到的证据发送给配置好的大模型
backend/settings.py- 读取 provider 配置和知识源路径
运行链路
flowchart TD
A["用户提问"] --> B["站点中的悬浮 bot UI"]
B --> C["POST /api/chat"]
C --> D["从 content/ 检索相关片段"]
D --> E{"是否配置了 LLM?"}
E -->|是| F["带证据调用大模型"]
E -->|否| G["返回检索式 fallback 回答"]
F --> H["输出答案和引用"]
G --> H
检索策略
当前检索层是有意保持轻量的:
- 默认知识源是
content/ - Markdown 会先被清洗成纯文本
- 文档会被切成带重叠的多个 chunk
- 问题会被 tokenize,再与 chunk 的词频做匹配
- 使用类 TF-IDF 分数排序
- Top chunks 作为 fallback 回答或 LLM 总结回答的证据
另外,bot 现在已经加入了语言优先规则:
- 英文问题优先检索
content/en/ - 中文问题优先检索
content/zh/
这样可以减少中英文材料同时命中时出现的混合回答。
部署路线
生产部署被拆成两部分:
- GitHub Pages 负责构建和托管静态 Hugo 网站。
- GitHub Actions 把 API-only bundle 同步到 Hugging Face Docker Space。
- 公网网站直接请求远端 Space API。
- 本地开发时,bot 会自动切回
http://127.0.0.1:8000/api。
相关部署文件:
.github/workflows/pages.yaml.github/workflows/hf-space.yamlDockerfilerequirements.txtspace/README.md
本地清理后的可用性
这个 bot 不依赖你本地生成出来的缓存长期存在。
runtime/bot/index.json只是可重建的缓存- 即使删除
runtime/,后端启动时也会基于content/重新建立索引 - 公网 Hugging Face Space 也有自己打包进去的一份
content/
所以,清理本地生成数据之后,bot 依然可以运行。
真正不能随便删的是仓库里的 content/,因为它本身就是 bot 的知识源。
当前限制
- 检索还是关键词型,不是 embedding 检索
- 还没有持久化的多轮会话记忆
/api/reindex目前还是开放接口,公开使用前应加保护- 索引还没有根据源文件变化自动失效刷新
后续改进方向
- 基于 fingerprint 的自动重建索引
- 引入 embedding 或 rerank 提升检索质量
- 收紧 API 安全策略
- 前端改成流式回答
- 在面板里展示当前 provider 和 model 状态