RAG-Powered Campus QA System

贵州师范大学
信息咨询智能体

基于 RAG 架构的校园政策智能问答系统,采用本地优先部署策略,实现 7×24 小时精准应答,保障校园数据安全不出域。

LangChain RAG ChromaDB BGE-M3 Ollama Streamlit
系统主界面预览
校园信息服务的四大痛点
贵州师范大学拥有 3 万余名在校生,日常面临大量重复性咨询,传统服务模式难以满足师生需求。

信息孤岛严重

政策文档分散在教务处、财务处、学生处等多个部门网站,师生查找困难,信息获取效率低。

重复咨询量大

80% 的咨询为重复性问题,占用行政人员大量时间,人力资源浪费严重。

时效性难保证

政策更新后旧版本信息仍在流传,师生难以辨别,易被过时信息误导。

服务时间受限

传统咨询窗口工作时间固定,无法满足师生在非工作时段的咨询需求。

五层系统架构
从用户交互到数据存储,分层解耦设计,每层职责清晰,支持独立迭代与灵活扩展。
1

用户层 — Streamlit

Web 界面、文件上传、对话历史管理,Session State 实现流式输出体验。

2

应用层 — chain.py

话题分类(LLM)、时效性检测(正则 + LLM)、流式回答生成,核心业务逻辑中枢。

3

检索层 — retriever.py

ChromaDB 本地向量检索 → BGE-Reranker 重排序 → Tavily 联网搜索,三级递进检索策略。

4

模型层 — embeddings.py

BGE-M3 向量化、BGE-Reranker-v2-m3 重排序、CUDA/MPS/CPU 设备动态管理与 LRU 缓存。

5

数据层 — file_data

学生手册、报账流程、教务通知等 PDF/DOCX 文档,支持实时更新与动态加载。

核心技术亮点
从本地化部署到智能检索,针对真实业务痛点精心设计,平衡数据安全与响应效率。

本地优先架构 — 数据安全不出域

默认使用 Ollama 部署 Qwen3.5 9B 模型,所有推理在本地完成。校园政策文档、学生信息等敏感数据仅在本地处理,不上传云端。

  • 本地模型优先:Ollama + Qwen3.5 9B
  • 可控联网:仅在必要时触发 Tavily 搜索
  • 会话隔离:记录仅存于浏览器 Session State

混合检索策略 — 三级递进精准定位

从本地向量库召回,经过重排序模型优化,最后以联网搜索作为补充,确保问答的准确度与深度。

  • 向量检索:ChromaDB + BGE-M3
  • 重排序优化:BGE-Reranker-v2-m3 二次打分
  • 联网补充:Tavily 实时搜索过滤

时效性双重检测 — 正则 + LLM 双保险

有效解决语义化问题的漏判。无论是显式的年份关键词还是隐式的“下学期”语义,均能触发时效性校验。

  • 正则匹配:识别显式日期与时效关键词
  • 语义分析:理解隐式时间敏感性问题

时间上下文注入 — Time-Aware RAG

在 Prompt 中动态注入当前日期,赋予模型真实的时间感知能力,让 LLM 能够准确判断政策是否过期。

  • 动态注入:本地 Python 获取实时时间
  • 过期提醒:基于当前日期自动对比政策效力

全话题分类响应

采用三分类器策略,精准区分对话意图。无论是日常寒暄还是核心业务咨询,系统都能给出得体的响应逻辑。

  • 三路分类:GREETING / RELEVANT / IRRELEVANT
  • 引导回题:将无关话题温柔引导回校园主题

空上下文保护

检索无果时,返回友好提示而非虚假的 LLM 幻觉。提前终止生成器,避免无效计算,确保回答的专业可信。

  • 幻觉拦截:无参考信息时不强制模型生成
  • 友好反馈:引导用户提供更具体的咨询信息
挑战与突破
在开发过程中,通过对细节的极致追求,将技术挑战转化为系统稳定性。
1

静态权重的局限性

模型无法感知实时时间,询问"下学期选课"时无法判断具体学期。
通过 Prompt 动态时间注入,实现了零延迟的时间感知闭环。
2

系统健壮性瓶颈

API Key 缺失或网络波动曾导致程序流程意外中断。
实现了静默失败与异步兜底机制,确保在极端环境下依然能提供基础服务。

让校园信息触手可及

不仅仅是问答,更是连接师生与知识的纽带。每一次迭代,都为更精准、更安全、更智能的校园生活。从底层架构到交互细节,每一行代码都承载着对极致体验的追求。

技术栈
LangChain
ChromaDB
BGE-M3
BGE-Reranker
Ollama
Streamlit
CUDA
Python
Tavily API
PyTorch
Qwen3.5