项目背景
“食堂哪个窗口好吃?""宿舍报修找谁?""创新创业基地怎么申请?“——这些问题的答案散落在官网通知、公众号推文和新生手册里,没有一个统一的入口。
ZCST Campus AI 的定位是:一个比 OA 更轻、比通用 AI 更懂校园的问答助手。 基于 OpenWebUI 改造,面向珠海科技学院的师生和访客,提供基于知识库的校园问答服务。
学校:珠海科技学院 角色:核心开发 完成时间:2026年6月
核心理念
不做 OA、不做教务、不做一卡通。做一个纯粹的”校园 AI 同学”:
- 轻量化:不接入内部系统,不需要学号密码,靠公开校园资料回答问题
- 人性化:自然语言交互,不需要知道菜单在哪、表单叫什么
- 可维护:管理员通过知识库上传文档即可更新问答内容,无需改代码
技术架构
┌───────────────────────────────────────────────┐
│ SvelteKit 前端 │
│ 普通用户界面 管理后台 (/admin) │
│ · 对话 · 知识来源 · 知识库 · 模型 · 用户 │
│ · 关于 · 管理员入口 · 系统设置 · 数据统计 │
├───────────────────────────────────────────────┤
│ FastAPI 后端 (Python) │
│ · 路由鉴权 · 聊天API · 知识库索引 · 模型调度 │
├──────────────┬────────────────┬───────────────┤
│ Ollama 本地 │ OpenAI API 兼容 │ 向量检索 (RAG) │
│ (默认模型) │ (可选配置) │ (文档问答增强) │
└──────────────┴────────────────┴───────────────┘
| 层级 | 技术 | 说明 |
|---|---|---|
| 前端框架 | SvelteKit + Svelte 5 | 编译时框架,无运行时开销 |
| 样式 | Tailwind CSS | 极简校园风格 |
| 构建 | Vite | HMR 开发体验 |
| 后端 | FastAPI | 异步 Python Web 框架 |
| ORM | SQLAlchemy + Peewee | 数据模型与数据库迁移 |
| 模型服务 | Ollama / OpenAI API | 可本地部署,也可接入云端模型 |
| 测试 | Vitest + Svelte Check + Cypress | 前端单元测试 + E2E |
| 部署 | Docker Compose | 一键启动应用 + Ollama 服务 |
核心实现
角色权限分离
这是最核心的改造——把 OpenWebUI 的开发者工具全部隐藏,为校园场景重新设计用户界面:
普通用户(访客/学生/教师)
└── 可见:对话、知识来源、关于我们、管理员登录入口
└── 不可见:聊天历史、Workspace、Models、Prompts、Tools、Functions
管理员(通过 /admin-login 登录)
└── 可见:完整后台 → /admin
└── 能力:知识库管理、模型配置、用户管理、系统设置、数据统计
前端通过 SvelteKit 的路由守卫隐藏管理员入口,后端通过 FastAPI 中间件进行二次鉴权——不能只靠 UI 显隐来保证安全。
临时会话设计
// 普通用户默认使用临时聊天模式
const isGuest = !currentUser || currentUser.role === 'guest'
if (isGuest) {
// 创建一次性会话 token,页面刷新后失效
session = await createTemporarySession()
// 不记录用户身份和对话历史到数据库
chatHistory = []
}
这个设计考虑了校园场景的特殊性:访客(家长、考生、外来人员)不应该被记录对话历史;学生的日常提问也不需要长期留存。隐私优先,而非功能优先。
知识库与 RAG
复用 OpenWebUI 的文档上传和向量索引能力,但做了校园场景的适配:
- 管理员上传校园文档(通知 PDF、公众号文章、新生手册等)
- 系统自动分块、向量化并建立索引
- 用户提问时,先从知识库检索相关段落,拼入 prompt 上下文
- LLM 结合检索结果生成回答,并标注信息来源
安全考量
| 措施 | 说明 |
|---|---|
| 管理员路由双重鉴权 | 前端隐藏 + 后端中间件校验 |
| 临时 token | 访客自动申请,限制权限仅限聊天 |
| CORS 限制 | 生产环境设置明确域名,不保留 * |
| 敏感信息排除 | .env、密钥、真实管理员密码全部忽略提交 |
| 数据统计匿名化 | 仅记录访问路径和问题摘要,不关联个人身份 |
项目思考
做校园产品的过程中有一个很深的体会:产品不是你想象中用户需要什么,而是用户实际上在问什么。
上线后统计后台显示提问最多的问题是”食堂几点开门”、“招生分数线”、“图书馆预约”——这些和我们预想的”创新创业政策咨询""学术资源检索”完全不同。接地气的需求,往往是最朴素的需求。
项目链接
- GitHub:zcst-campus-ai
- 致谢:基于 OpenWebUI 改造
