教育RAG系统完整实施方案
教育RAG系统完整实施方案
🎯 最终目标
学生打开一个链接 → 看到聊天界面 → 输入课本问题 → 获得准确答案
示例:https://your-study-assistant.com 或 http://192.168.1.100:8501
📅 实施时间表(周末完成)
周六上午(3小时):环境搭建
周六下午(3小时):内容准备和导入
周日上午(2小时):功能配置和测试
周日下午(2小时):部署上线和远程访问
━━━━━━━━━━━━━━━━━━━━━━
总计:10小时完成交付
阶段一:环境准备(家里电脑)
1.1 硬件检查清单
# Windows PowerShell 执行
# 检查1:内存(至少16GB)
Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum |
Foreach {"{0:N2} GB" -f ($_.sum / 1GB)}
# 检查2:磁盘空间(至少50GB可用)
Get-PSDrive C | Select-Object Used,Free
# 检查3:Docker状态
docker --version
docker-compose --version
# 检查4:Ollama状态
Get-Process ollama
预期输出:
✅ 内存:32GB
✅ 磁盘:200GB可用
✅ Docker:24.0.x
✅ Ollama:运行中
1.2 创建项目目录
# 在家里电脑上执行
mkdir D:\AIEducation
cd D:\AIEducation
# 创建子目录
mkdir textbooks # 存放课本PDF
mkdir backups # 备份
mkdir logs # 日志
1.3 下载并配置Dify
# 克隆Dify(约5分钟)
git clone https://github.com/langgenius/dify.git
cd dify\docker
# 复制配置文件
copy .env.example .env
# 编辑配置(记事本打开)
notepad .env
关键配置修改:
# .env 文件中修改这些行
# 1. 设置密钥(用于加密)
SECRET_KEY=your-random-secret-key-here-12345678
# 2. 设置日志级别
LOG_LEVEL=INFO
# 3. 设置文件上传大小限制(100MB)
MAX_FILE_SIZE=104857600
# 4. (可选)设置管理员邮箱
ADMIN_EMAIL=your-email@example.com
# 保存并关闭
1.4 启动Dify平台
# 启动所有服务(首次需要下载镜像,约10-15分钟)
docker-compose up -d
# 查看启动进度
docker-compose logs -f
# 等待看到这些日志:
# ✅ dify-web | Server running on port 3000
# ✅ dify-api | Server running on port 5001
# ✅ nginx | nginx started
# Ctrl+C 退出日志查看
# 检查服务状态
docker-compose ps
预期输出:
NAME STATUS
dify-api Up
dify-worker Up
dify-web Up
db Up
redis Up
weaviate Up
nginx Up
1.5 初始化Dify
1. 打开浏览器访问:http://localhost
2. 首次访问设置管理员账号:
邮箱:admin@yourdomain.com
密码:YourStrongPassword123!
确认密码:YourStrongPassword123!
3. 点击"开始使用"
4. 进入Dify管理后台 ✅
阶段二:配置AI模型
2.1 配置Ollama
# 确保Ollama正在运行
ollama serve
# 下载必要的模型(新终端)
ollama pull qwen2.5:7b # 主力对话模型(4GB)
ollama pull nomic-embed-text # 嵌入模型(274MB)
# 测试模型
ollama run qwen2.5:7b "你好,请简单介绍你自己"
Dify中配置Ollama:
1. Dify界面右上角 → 设置 → 模型供应商
2. 找到"Ollama"卡片,点击右侧⚙️图标
3. 填写配置:
┌─────────────────────────────────────┐
│ 启用:✅ 开启 │
│ │
│ Base URL (重要!): │
│ http://host.docker.internal:11434 │
│ │
│ 如果上面不work,试试: │
│ http://172.17.0.1:11434 (Linux) │
│ http://192.168.65.2:11434 (Mac) │
│ http://你电脑的局域网IP:11434 │
└─────────────────────────────────────┘
4. 点击"测试连接"
✅ 显示"连接成功"
5. 可用模型列表应该显示:
☑️ qwen2.5:7b
☑️ nomic-embed-text
6. 点击"保存"
2.2 (可选)配置备用商业API
如果想添加智谱AI作为备用:
1. 访问 https://open.bigmodel.cn/
2. 注册账号
3. 创建API Key
4. 在Dify中添加:
设置 → 模型供应商 → 智谱AI → 填入API Key
阶段三:准备课本内容
3.1 课本准备清单
需要准备的内容:
| 科目 | 年级 | 文件格式 | 文件名规范 |
|---|---|---|---|
| 生物 | 九年级上 | biology_grade9_part1.pdf | |
| 生物 | 九年级下 | biology_grade9_part2.pdf | |
| 物理 | 九年级 | physics_grade9.pdf | |
| 化学 | 九年级 | chemistry_grade9.pdf |
注意事项:
- ✅ 优先使用文字版PDF(非扫描版)
- ✅ 单个文件<100MB
- ✅ 文件名使用英文,便于管理
- ⚠️ 扫描版PDF需要OCR处理
3.2 课本质量检查
# 检查PDF是否可以复制文字
# 打开PDF → 尝试复制一段文字 → 能复制 = 文字版 ✅
# → 不能复制 = 扫描版 ⚠️
# 如果是扫描版,使用PaddleOCR转换
pip install paddleocr
# Python脚本转换扫描版
python
from paddleocr import PaddleOCR
from pdf2image import convert_from_path
from fpdf import FPDF
def scan_pdf_to_text_pdf(input_pdf, output_pdf):
"""扫描版PDF转文字版PDF"""
# 1. PDF转图片
print("正在转换PDF为图片...")
images = convert_from_path(input_pdf, dpi=300)
# 2. OCR识别
print("正在OCR识别...")
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
all_text = []
for i, image in enumerate(images):
print(f"处理第 {i+1}/{len(images)} 页...")
result = ocr.ocr(image, cls=True)
page_text = '\n'.join([line[1][0] for line in result[0]])
all_text.append(page_text)
# 3. 生成新PDF
print("生成新PDF...")
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
for page_num, text in enumerate(all_text):
if page_num > 0:
pdf.add_page()
pdf.multi_cell(0, 10, text)
pdf.output(output_pdf)
print(f"完成!输出文件:{output_pdf}")
# 使用示例
# scan_pdf_to_text_pdf("biology_scan.pdf", "biology_text.pdf")
阶段四:创建知识库
4.1 在Dify中创建知识库
1. 左侧菜单:📚 知识库
2. 点击右上角"创建知识库"
3. 填写信息:
┌─────────────────────────────────────┐
│ 知识库名称:初中生物九年级 │
│ │
│ 描述:人教版初中生物九年级上下册 │
│ 包含光合作用、呼吸作用等 │
│ │
│ 嵌入模型: │
│ [选择] nomic-embed-text (Ollama) │
│ │
│ 检索设置: │
│ • 检索模式:向量检索 │
│ • Top K:3 │
│ • 相似度阈值:0.7 │
│ │
│ 权限:私有 │
└─────────────────────────────────────┘
4. 点击"创建"
5. 知识库创建成功 ✅
4.2 上传课本文档
1. 进入刚创建的知识库
2. 点击"上传文档"按钮
3. 选择PDF文件:
- 可以一次选择多个文件
- 也可以拖拽上传
4. 配置文档处理:
┌─────────────────────────────────────┐
│ 分块策略:自动分块 │
│ │
│ 分块设置: │
│ • 分块长度:500 字符 │
│ • 分块重叠:50 字符 │
│ │
│ 处理模式:高质量 │
│ │
│ 索引方式:高质量索引 │
└─────────────────────────────────────┘
5. 点击"上传并处理"
6. 等待处理完成:
进度条:[████████░░] 80%
处理时间估算:
• 100页PDF ≈ 3-5分钟
• 500页PDF ≈ 15-20分钟
7. 处理完成后显示:
✅ 文档数:4
✅ 分块数:1,234
✅ 向量数:1,234
✅ 字符数:523,456
4.3 测试知识库检索
1. 在知识库页面,点击"检索测试"
2. 输入测试问题:
"光合作用是什么"
3. 查看检索结果:
应该返回3个相关文本块
每个块显示:
• 相似度分数:0.89
• 来源文档:biology_grade9_part1.pdf
• 页码:第45页
• 文本预览:光合作用是绿色植物利用光能...
4. 如果检索结果不理想:
• 调整分块长度(300-800之间)
• 调整相似度阈值(0.6-0.8之间)
• 尝试不同的关键词
阶段五:创建AI应用
5.1 创建聊天助手
1. 左侧菜单:🤖 应用
2. 点击"创建应用"
3. 选择应用类型:"聊天助手"
4. 选择模板:"知识库问答"(推荐)
5. 填写应用信息:
┌─────────────────────────────────────┐
│ 应用名称:初中生物学习助手 │
│ │
│ 图标:🧬 (选择一个生物相关图标) │
│ │
│ 描述: │
│ 专业的初中生物学习助手,基于人教版 │
│ 课本内容为学生答疑解惑 │
└─────────────────────────────────────┘
6. 点击"创建"
5.2 配置工作流(核心)
进入应用编排页面,配置以下工作流:
┌─────────────────────────────────────────────┐
│ 工作流设计 │
└─────────────────────────────────────────────┘
节点1:[开始] 用户输入
↓
节点2:[知识库] 检索相关内容
配置:
• 知识库:初中生物九年级
• 检索模式:向量检索
• Top K:3
• 相似度阈值:0.7
• 变量名:context
↓
节点3:[条件判断] 是否检索到内容?
条件:context 不为空
├─ 是 → 节点4
└─ 否 → 节点5
↓
节点4:[LLM] 基于检索内容回答
配置:
• 模型:qwen2.5:7b (Ollama)
• Temperature:0.7
• Max Tokens:2000
• Prompt:【见下方详细配置】
↓
节点5:[LLM] 提示未找到相关内容
简单Prompt:"抱歉,课本中没有找到相关内容..."
↓
节点6:[结束] 返回答案
5.3 Prompt工程(关键)
主要Prompt模板:
# 角色定义
你是一位经验丰富的初中生物老师,名叫"知识助手",正在为九年级学生答疑解惑。
# 你的教学风格
- 耐心细致,善于用简单的语言解释复杂概念
- 经常举生活中的例子帮助学生理解
- 鼓励学生思考,而不是直接给答案
# 参考资料
以下是从课本中检索到的相关内容:
{{#context}}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 来源:{{source.filename}}
📄 页码:第{{source.page}}页
📌 章节:{{source.chapter}}
{{content}}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{{/context}}
# 学生问题
{{query}}
# 回答规则(务必遵守)
✅ 必须做:
1. 严格基于上述课本内容回答
2. 使用初中生能理解的语言
3. 适当举例说明(生活中的例子)
4. 解释关键术语
5. 在答案末尾注明参考来源
❌ 禁止做:
1. 不要编造课本没有的内容
2. 不要使用过于专业的术语(除非课本有)
3. 不要直接给习题答案(要引导思考)
4. 不要偏离课本内容范围
# 特殊情况处理
- 如果问题涉及多个知识点,按逻辑顺序讲解
- 如果学生问"为什么",尝试解释原理
- 如果是计算题,先讲解公式,再引导解题步骤
# 回答格式
### 📚 答案
[在这里写详细的回答内容,分段清晰]
### 💡 举例说明
[如果适用,举一个生活中的例子]
### 🔍 知识拓展
[如果有相关的延伸知识,简单提一下]
### 📖 参考来源
- 课本:{{source.filename}}
- 章节:{{source.chapter}}
- 页码:第{{source.page}}页
---
现在开始回答学生的问题吧!记住,你的目标是帮助学生真正理解知识,而不只是背答案。
备用Prompt(未找到内容时):
抱歉,我在课本中没有找到与"{{query}}"直接相关的内容。
🤔 可能的原因:
1. 这个知识点可能在其他章节
2. 问题的表述可能需要调整
3. 这可能超出了当前课本的范围
💡 建议:
- 尝试用不同的关键词重新提问
- 明确指出是哪个章节的内容
- 或者问一个更具体的问题
我很乐意帮你解答课本中的其他问题!😊
5.4 配置其他选项
1. 对话设置:
┌─────────────────────────────────────┐
│ 对话轮数限制:20 │
│ 对话历史:保留最近10轮 │
│ 上下文窗口:4096 tokens │
└─────────────────────────────────────┘
2. 功能开关:
☑️ 启用对话历史
☑️ 显示参考来源
☑️ 允许追问
☐ 语音输入(可选)
☐ 图片上传(暂不开启)
3. 安全设置:
☑️ 内容审核(防止不当问题)
☑️ 速率限制(防止滥用)
限制:每用户每分钟最多10次请求
4. 界面定制:
• 欢迎语:
"你好!我是你的生物学习助手🧬
有什么问题尽管问我,我会根据课本内容为你解答!"
• 占位符文本:
"例如:什么是光合作用?"
• 主题颜色:选择一个适合教育的颜色
5.5 保存并发布
1. 点击右上角"保存"按钮
2. 点击"发布"按钮
3. 选择发布渠道:
☑️ Web应用
☑️ API接口
☑️ 嵌入式代码
4. 获取访问链接:
🔗 Web应用链接:
http://localhost/chat/abc123xyz456
📋 复制链接
5. 测试链接:
在浏览器新标签页打开
应该看到聊天界面 ✅
阶段六:测试验证
6.1 功能测试清单
测试用例1:基础查询
问题:"什么是光合作用?"
预期:返回课本定义 + 来源标注
测试用例2:深度理解
问题:"为什么植物叶子是绿色的?"
预期:解释叶绿素的作用 + 举例
测试用例3:对比分析
问题:"光合作用和呼吸作用有什么区别?"
预期:对比两个过程的不同点
测试用例4:公式查询
问题:"光合作用的化学方程式是什么?"
预期:返回公式 + 解释
测试用例5:未找到内容
问题:"量子力学是什么?"(超出范围)
预期:友好提示课本中没有相关内容
测试用例6:多轮对话
第1轮:"什么是光合作用?"
第2轮:"那它需要什么条件?"(指代消歧)
预期:能理解"它"指的是光合作用
6.2 执行测试
在聊天界面依次输入测试问题,记录结果:
✅ 测试1:通过 - 返回准确定义
✅ 测试2:通过 - 解释合理
✅ 测试3:通过 - 对比清晰
⚠️ 测试4:部分通过 - 公式显示有问题
✅ 测试5:通过 - 提示友好
❌ 测试6:失败 - 指代理解有误
根据测试结果调整Prompt和配置
阶段七:部署上线
7.1 内网访问配置
让同一WiFi下的设备都能访问:
# 1. 查看电脑IP地址
ipconfig
# 找到类似这样的输出:
# 无线局域网适配器 WLAN:
# IPv4 地址 . . . . . . . . . . : 192.168.1.100
# 2. 配置Dify允许外部访问
# 编辑 docker-compose.yml
# docker-compose.yml 中找到 nginx 服务
nginx:
environment:
- NGINX_SERVER_NAME=_ # 允许任意域名访问
ports:
- "80:80" # 或改为 "0.0.0.0:80:80"
# 3. 重启服务
docker-compose down
docker-compose up -d
# 4. 测试内网访问
# 在手机或其他电脑浏览器输入:
# http://192.168.1.100/chat/abc123xyz456
# ✅ 能访问 = 内网部署成功
7.2 公网访问方案(3选1)
方案A:Tailscale(推荐,最简单)
# 1. 注册Tailscale账号(免费)
# 访问 https://tailscale.com/
# 2. 下载安装Tailscale(家里电脑)
# Windows: https://tailscale.com/download/windows
# 3. 安装后登录
# 打开Tailscale图标 → 登录 → 授权
# 4. 获取Tailscale IP
tailscale ip -4
# 输出:100.x.x.x
# 5. 在其他设备也安装Tailscale(同一账号)
# 手机:App Store/Google Play搜索"Tailscale"
# 其他电脑:同样下载安装
# 6. 所有设备通过Tailscale IP访问
# http://100.x.x.x/chat/abc123xyz456
优势:
- ✅ 完全免费
- ✅ 安全加密
- ✅ 零配置
- ✅ 跨平台(Windows/Mac/Linux/iOS/Android)
方案B:Cloudflare Tunnel(免费+域名)
# 1. 注册Cloudflare账号
# 访问 https://cloudflare.com/
# 2. 下载cloudflared
# https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/
# 3. 启动隧道(临时测试)
cloudflared tunnel --url http://localhost:80
# 输出:
# https://random-word-1234.trycloudflare.com
# 这个域名就可以公网访问了!
# 4. 创建永久隧道(可选)
cloudflared tunnel login
cloudflared tunnel create my-education-rag
cloudflared tunnel route dns my-education-rag study.yourdomain.com
cloudflared tunnel run my-education-rag
优势:
- ✅ 免费
- ✅ 提供HTTPS
- ✅ 可以自定义域名
- ✅ 无需公网IP
方案C:动态DNS + 端口映射(需要公网IP)
# 仅当你有公网IP时使用
# 1. 注册动态DNS服务(如花生壳)
# https://hsk.oray.com/
# 2. 路由器配置端口映射
# 登录路由器管理页面(通常是192.168.1.1)
# 找到"端口转发"或"虚拟服务器"
# 添加规则:
# 外部端口:8080
# 内部IP:192.168.1.100
# 内部端口:80
# 协议:TCP
# 3. 通过域名访问
# http://yourname.gicp.net:8080/chat/abc123xyz456
7.3 推荐最终方案
根据不同场景选择:
场景1:家人/小范围使用(<10人)
方案:Tailscale
理由:最简单、最安全
场景2:学校内部使用(<100人)
方案:内网访问 192.168.x.x
理由:不需要公网,速度最快
场景3:对外提供服务(>100人)
方案:Cloudflare Tunnel
理由:免费、稳定、有域名
阶段八:使用指南和培训
8.1 创建学生使用手册
# 初中生物学习助手使用指南
## 如何访问
在浏览器中打开以下链接:
🔗 http://192.168.1.100/chat/abc123xyz456
(或 https://your-domain.trycloudflare.com)
## 如何提问
### ✅ 好的提问方式
1. 概念查询
"什么是光合作用?"
"光合作用的定义是什么?"
2. 过程询问
"光合作用的过程是怎样的?"
"植物如何进行光合作用?"
3. 条件查询
"光合作用需要什么条件?"
"影响光合作用的因素有哪些?"
4. 对比分析
"光合作用和呼吸作用有什么区别?"
5. 原因探究
"为什么植物叶子是绿色的?"
### ❌ 不建议的提问
- "给我写作业"(助手不会直接给答案)
- "明天考试重点是什么"(超出课本范围)
- "XXX同学的手机号"(与学习无关)
## 使用技巧
1. 分步提问
不要一次问太多问题,可以分步骤问:
问题1:"什么是光合作用?"
问题2:"光合作用需要什么条件?"
问题3:"光合作用的产物是什么?"
2. 追问深入
看到答案后可以继续追问:
"能举个例子吗?"
"这个过程中会发生什么变化?"
3. 查看来源
答案末尾会标注来源,可以对照课本学习
## 常见问题
Q:助手会不会出错?
A:助手基于课本内容回答,但AI可能理解有偏差,
建议对照课本验证重要知识点。
Q:可以上传图片提问吗?
A:目前不支持,请用文字描述问题。
Q:可以问课本之外的知识吗?
A:可以问,但助手只能基于已导入的课本回答,
课本外的内容会提示未找到。
8.2 教师管理手册
# 教师管理手册
## 后台访问
管理后台:http://localhost
账号:admin@yourdomain.com
密码:【你设置的密码】
## 日常管理
### 1. 查看使用统计
后台 → 应用 → 初中生物学习助手 → 数据分析
可以看到:
- 总提问数
- 活跃用户数
- 热门问题
- 平均响应时间
### 2. 添加新课本
后台 → 知识库 → 上传文档
支持批量上传
### 3. 优化答案质量
如果发现某些问题回答不理想:
1. 记录问题
2. 检查知识库是否有相关内容
3. 调整检索参数或Prompt
4. 重新测试
### 4. 处理学生反馈
建立反馈渠道,收集:
- 答案不准确的问题
- 学生希望添加的内容
- 使用体验问题
## 维护任务
### 每周任务
- [ ] 检查系统运行状态
- [ ] 查看使用统计
- [ ] 备份数据
### 每月任务
- [ ] 更新课本内容(如有)
- [ ] 优化Prompt
- [ ] 分析热门问题
### 学期任务
- [ ] 全面评估效果
- [ ] 添加新学期课本
- [ ] 系统升级
阶段九:监控和优化
9.1 性能监控
# 创建监控脚本 monitor.ps1
# 检查Docker容器状态
docker-compose ps | Out-File -Append logs\status.log
# 检查资源占用
docker stats --no-stream >> logs\resources.log
# 定时任务(每小时执行一次)
# Windows任务计划程序中添加
9.2 数据备份
# 创建备份脚本 backup.bat
@echo off
set BACKUP_DIR=D:\AIEducation\backups\%date:~0,4%%date:~5,2%%date:~8,2%
mkdir %BACKUP_DIR%
echo Backing up database...
docker exec dify-db pg_dump -U postgres dify > %BACKUP_DIR%\database.sql
echo Backing up vector database...
docker cp dify-weaviate:/var/lib/weaviate %BACKUP_DIR%\weaviate
echo Backing up files...
xcopy /E /I .\dify\docker\volumes %BACKUP_DIR%\volumes
echo Backup completed: %BACKUP_DIR%
9.3 优化建议
根据使用数据优化:
指标1:响应时间 > 5秒
→ 优化建议:
• 减少检索文档数量(Top K: 3 → 2)
• 使用更小的模型
• 增加服务器资源
指标2:答案准确率 < 80%
→ 优化建议:
• 优化文档分块策略
• 调整Prompt
• 增加课本内容的覆盖度
指标3:用户重复提问率高
→ 优化建议:
• 添加常见问题快捷入口
• 优化答案的清晰度
• 增加学生使用培训
🎉 最终交付清单
环境部署:
✅ Docker环境运行正常
✅ Dify平台配置完成
✅ Ollama模型下载完成
内容准备:
✅ 课本PDF已处理
✅ 知识库创建并导入
✅ 检索测试通过
应用配置:
✅ AI应用创建完成
✅ Prompt优化完成
✅ 工作流测试通过
部署上线:
✅ 内网访问正常
✅ 远程访问配置(Tailscale/Cloudflare)
✅ 访问链接生成
文档准备:
✅ 学生使用手册
✅ 教师管理手册
✅ 技术文档
测试验证:
✅ 功能测试全部通过
✅ 性能达标(<3秒响应)
✅ 10个学生试用反馈良好
━━━━━━━━━━━━━━━━━━━━━━
🎊 项目交付完成!
访问链接:http://your-access-url
━━━━━━━━━━━━━━━━━━━━━━
💡 下一步建议
-
推广使用(第1周)
- 先让10-20个学生试用
- 收集反馈和问题
- 快速迭代优化
-
扩大规模(第2-4周)
- 逐步开放给更多学生
- 添加其他科目课本
- 优化性能和稳定性
-
功能扩展(第2-3月)
- 添加习题解答功能
- 支持图片上传提问
- 集成语音输入
- 生成学习报告
-
持续优化(长期)
- 根据使用数据优化
- 定期更新课本内容
- 收集优秀问答案例
- 建立知识库质量体系

浙公网安备 33010602011771号