核心基础信息
- 适配专业:计算机 / 软件工程 / 人工智能 / 数据科学
- 核心技术:Prompt 工程(Few-shot / 指令模板)、ChatGLM-6B(INT4 量化版)、中文文本预处理、轻量知识库构建
- 硬件要求:普通游戏本(16G 内存 + GTX1660 及以上)即可运行,无需高端 GPU
- 毕设亮点:场景贴合校园(教务 / 图书馆 / 生活 / 社团)、有可视化交互系统、可落地演示、创新点易设计
一、详细技术路线图(按毕设流程分 8 步,可直接写进开题报告)
步骤 1:需求分析与系统定位
- 功能需求:校园常见问题智能答疑、问题联想推荐、答案精准匹配、历史对话记录
- 非功能需求:响应速度<3s、问答准确率≥85%、界面简洁易操作、支持文本输入 / 关键词检索
- 适用场景:在校学生查询教务通知、图书馆借阅、校园卡充值、社团报名、宿舍管理等问题
步骤 2:数据准备(公开数据集 + 自建校园数据集,易采集、易标注)
- 数据类型:校园领域问答对(Q&A)、通用日常问答对(补充)
- 标注要求:按场景分类(教务类 / 图书馆类 / 生活类 / 社团类 / 其他类),无需复杂标注
- 数据量:总数据 1000-1500 条即可(毕设足够,无需海量数据)
- 采集与清洗:去重、去无意义问题、统一答案表述格式、标注错误修正
步骤 3:核心技术选型与环境搭建
- 开发语言:Python 3.9/3.10(兼容性最好)
- 核心框架 / 库:Hugging Face Transformers、PyTorch、LangChain(轻量知识库)、Jieba(中文分词)、Streamlit/PyQt(前端界面)
- 模型:ChatGLM-6B INT4 量化版(显存占用<10G,普通电脑可运行)
- 运行环境:Anaconda(虚拟环境)、Windows/Linux(推荐 Linux,稳定性更高)
步骤 4:校园轻量知识库构建
- 知识库结构:分类式结构化存储(以 JSON/Excel 为载体,字段:问题 ID、问题文本、标准答案、场景分类、关键词)
- 知识库优化:添加问题同义词 / 相似表述(如 “图书馆几点关门”/“图书馆闭馆时间”),提升匹配效率
- 检索方式:关键词匹配 + 语义相似度匹配(轻量版,无需复杂向量数据库)
步骤 5:Prompt 工程设计与调试(系统核心,毕设创新点核心载体)
- 基础 Prompt 框架设计:指令 + 场景限定 + 示例 + 用户问题(Few-shot 范式,适配小样本校园数据)
- 分场景 Prompt 模板定制:为教务 / 图书馆等 5 大场景分别设计专属 Prompt,提升领域适配性
- Prompt 调优:调整示例数量(1-3 个最佳)、指令描述方式、关键词权重,提升问答准确率
步骤 6:系统架构设计与功能模块实现
- 整体架构:前端交互层→文本预处理层→知识库检索层→Prompt 生成层→ChatGLM-6B 推理层→结果返回层
- 核心功能模块实现:
- 文本预处理模块:去空格 / 特殊符号、分词、关键词提取
- 知识库检索模块:根据用户问题匹配相似问题,调取标准答案
- Prompt 生成模块:根据场景和检索结果,自动生成适配的 Prompt
- 模型推理模块:将 Prompt 输入 ChatGLM-6B,得到推理结果
- 前端交互模块:实现问题输入、答案展示、历史对话、场景选择
步骤 7:模型与系统调优 + 性能评估
- 调优方向:Prompt 模板优化、知识库相似问题补充、模型推理参数调整(温度系数 / 最大生成长度)
- 评估指标:准确率(核心)、响应速度、鲁棒性(测试无意义问题 / 模糊问题的处理能力)
- 测试集划分:将自建数据集按 7:2:1 划分为训练集(Prompt 调试)、验证集(调优)、测试集(最终评估)
- 评估结果:生成量化评估报告(如整体准确率 88%,图书馆类问题准确率 92%)+ 典型案例分析
步骤 8:系统部署与演示 + 论文撰写
- 轻量部署:本地部署(毕设演示足够),生成可执行文件,实现 “双击运行”
- 演示准备:设计典型测试用例(覆盖 5 大场景),展示系统功能和问答效果
- 论文撰写:按 “绪论→需求分析→技术基础→系统设计→实现→测试→总结与展望” 结构,重点突出 Prompt 工程设计和校园知识库构建
二、数据集推荐(公开 + 自建,毕设专属,易采集、易标注)
1. 公开通用问答数据集(补充数据,无需标注,直接用)
| 中文通用问答数据集 QASys | 5000 + 条 | 日常通用问题 | Kaggle、百度飞桨数据集库 |
| 高校校园通用问答数据集 | 800 + 条 | 校园基础问题 | Hugging Face、知网数据集平台 |
2. 自建校园专属数据集(核心数据,1000-1500 条,毕设重点)
(1)采集渠道(零成本,学生易操作)
(2)数据分类与数量分配(合理分配,贴合校园实际)
| 教务类 | 300-350 | 补考时间怎么查?、选修课怎么选?、绩点怎么计算? |
| 图书馆类 | 250-300 | 图书能借多久?、逾期罚款多少?、电子资源怎么用? |
| 校园生活类 | 300-350 | 校园卡怎么充值?、宿舍断电时间?、食堂开放时间? |
| 社团 / 活动类 | 100-150 | 社团怎么报名?、校园十佳歌手赛怎么参加? |
| 其他类 | 50-100 | 学校快递站在哪?、校园网怎么办理? |
三、模型训练 / 调试详细步骤(实操性强,可直接跟着做,无复杂操作)
阶段 1:环境搭建(Anaconda 虚拟环境,一步一步来)
- pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2
- pip install transformers==4.30.2 langchain==0.0.194 jieba streamlit
- pip install sentence-transformers==2.2.2(语义相似度匹配)
阶段 2:ChatGLM-6B 模型加载(直接调用,无需从头训练)
python
运行
from transformers import AutoTokenizer, AutoModel
# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained("模型文件路径", trust_remote_code=True)
model = AutoModel.from_pretrained("模型文件路径", trust_remote_code=True).half().cuda()
# 模型推理函数
def glm_infer(prompt):
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=512, temperature=0.7, do_sample=False)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
return response
阶段 3:校园知识库构建(JSON 格式,示例可直接复用)
json
{
"data": [
{
"id": 1,
"question": "图书馆几点开门?",
"answer": "学校图书馆开馆时间为周一至周五8:00-22:00,周六至周日9:00-20:00,法定节假日闭馆。",
"category": "图书馆类",
"keywords": ["图书馆", "开馆时间", "开门"]
},
{
"id": 2,
"question": "校园卡怎么充值?",
"answer": "校园卡可通过学校微信公众号、校园自助充值机、食堂充值窗口进行充值,充值后实时到账。",
"category": "校园生活类",
"keywords": ["校园卡", "充值", "缴费"]
}
]
}
阶段 4:Prompt 工程设计与调试(核心实操,附模板示例)
(1)基础 Few-shot Prompt 模板(通用框架,可直接复用)
plaintext
指令:你是XX大学校园智能答疑助手,仅回答与本校校园相关的问题,问题需贴合教务、图书馆、校园生活、社团四大场景,非校园问题请回复“该问题非校园相关,无法为你解答”。
场景:{scene}
示例1:
问题:{example_q1}
答案:{example_a1}
示例2:
问题:{example_q2}
答案:{example_a2}
用户问题:{user_q}
答案:
(2)分场景调试:将 {scene} 替换为 “图书馆类” 等具体场景,{example_q/a} 替换为对应场景的示例问答,测试不同模板的效果
(3)调优技巧:示例数量控制在 1-3 个(数量过多会降低小样本效果)、温度系数设为 0.5-0.7(保证答案准确性,避免过度生成)、最大生成长度设为 200-300 字(贴合校园问答短答案特点)
阶段 5:系统整合与前端实现(Streamlit,最快上手,毕设演示首选)
python
运行
import streamlit as st
# 设置页面标题
st.title("XX大学校园智能问答系统")
# 场景选择
scene = st.sidebar.selectbox("选择问题场景", ["全部", "教务类", "图书馆类", "校园生活类", "社团类"])
# 历史对话初始化
if "history" not in st.session_state:
st.session_state.history = []
# 问题输入
user_q = st.text_input("请输入你的校园问题:", placeholder="例如:图书馆几点关门?")
# 提交按钮
if st.button("提交提问") and user_q:
# 调用核心推理函数(自行实现)
response = core_infer(user_q, scene)
# 保存历史对话
st.session_state.history.append(("你", user_q))
st.session_state.history.append(("答疑助手", response))
# 展示答案
st.success(f"答疑助手:{response}")
# 展示历史对话
st.subheader("历史对话")
for role, content in st.session_state.history:
st.write(f"**{role}**:{content}")





