教育RAG系统完整实施方案


教育RAG系统完整实施方案

🎯 最终目标

学生打开一个链接 → 看到聊天界面 → 输入课本问题 → 获得准确答案

示例:https://your-study-assistant.comhttp://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 课本准备清单

需要准备的内容:

科目 年级 文件格式 文件名规范
生物 九年级上 PDF biology_grade9_part1.pdf
生物 九年级下 PDF biology_grade9_part2.pdf
物理 九年级 PDF physics_grade9.pdf
化学 九年级 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. 推广使用(第1周)

    • 先让10-20个学生试用
    • 收集反馈和问题
    • 快速迭代优化
  2. 扩大规模(第2-4周)

    • 逐步开放给更多学生
    • 添加其他科目课本
    • 优化性能和稳定性
  3. 功能扩展(第2-3月)

    • 添加习题解答功能
    • 支持图片上传提问
    • 集成语音输入
    • 生成学习报告
  4. 持续优化(长期)

    • 根据使用数据优化
    • 定期更新课本内容
    • 收集优秀问答案例
    • 建立知识库质量体系

posted @ 2026-01-16 16:35  XiaoZhengTou  阅读(0)  评论(0)    收藏  举报