内容
# 基于 RAG 的自适应出题系统
基于 **LangChain + bge-large-zh + Milvus + DeepSeek** 的全流程中文 RAG 自适应出题系统。
从教材/题库文档出发,自动入库、语义检索、LLM 动态出题,并根据学生答题表现实时调整题目难度。
---
## 项目结构
config.py---全局配置(模型路径、数据库、API Key)
ingest.py---知识库构建:加载文档 → 切分 → Embedding → 入库(含难度标注)
retriever.py---语义检索:向量化查询 → Milvus 相似度搜索 → 返回结果
chain.py---LLM链:出题链 + 判题链
main.py---主入口:自适应出题循环
.env---API Key 配置
requirements.txt---Python 依赖
Dockerfile---Docker 容器化
## 工作流程
通过 ingest.py 加载 docx 文档进行中文切分,经 bge-large-zh 向量化后存入 Milvus 向量数据库并自动标注难度级别;运行时 main.py 根据当前学生水平从对应难度范围检索知识点,由 DeepSeek 动态生成选择题/填空题,用户作答后 LLM 判题并显示正确答案,系统根据连续答题表现自动升降难度,形成自适应闭环。
### ① **本地终端模式:**
文档入库 → 中文切分向量化 → Milvus 存储(标注难度)→ main.py 自适应出题循环 → 根据难度检索 → LLM 出题 → 用户作答 → 判题 →动态调整难度
### **② MCP 模式(挂载到 Dify / Coze 等平台):**
mcp_server.py(SSE 协议)
retrieve_knowledge(query, difficulty) → 检索知识点
generate_quiz(query, difficulty) → 出题
## 技术栈
| 组件 | 说明 |
| ---------------------------------- | ------------------------------------------- |
| **LangChain** | 文档加载、切分、LLM 链编排(LCEL 管道语法) |
| **bge-large-zh** | 中文语义向量模型(1024 维) |
| **Milvus Lite** | 本地向量数据库(余弦相似度检索) |
| **DeepSeek API** | 大模型出题与判题(deepseek-v4-flash) |
| **Docx2txtLoader** | Microsoft Word 文档加载 |
| **RecursiveCharacterTextSplitter** | 中文智能文本切分 |
| MCP 协议 | 将 RAG 能力封装为标准工具,可挂载 Dify/Coze |
| **Docker** | 容器化部署 |
| **Dify** | 开源智能体平台,MCP 工具集成 |
## 快速开始
### 1. 安装依赖
```bash
pip install -r requirements.txt
```
### 2. 配置
编辑 .env 文件:
DEEPSEEK_API_KEY=sk-your-key
DEEPSEEK_BASE_URL=https://api.deepseek.com
编辑 config.py 修改文档路径和模型路径
### 3. 构建知识库
```bash
python ingest.py
```
这会加载文档 → 中文切分 → 向量化 → 入库(含难度标注)。
### 4. 启动自适应出题
```bash
python main.py
```
# 本地启动 MCP Server:
```bash
python mcp_server.py
```
启动后监听 http://0.0.0.0:8000,SSE 端点 /sse。
# 挂载到 Dify:
1. 部署 Dify(Docker Compose):
```bash
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
# 如需改端口,编辑 .env 中的 EXPOSE_NGINX_PORT=80
docker compose up -d
```
2. 浏览器访问 http://localhost(),注册管理员账号
3. 创建 **Agent** 应用 → 工具 → **+ 添加工具** → MCP → SSE
服务端点 URL: http://host.docker.internal:8000/sse或URL: http://你的服务器IP:8000/sse
4. 如果你的 MCP Server 和 Dify 在同一台服务器,也可以用 localhost 或 host.docker.internal。
如果不在同一台,确保防火墙放行 8000 端口。
5. Agent 系统提示词建议:
你必须使用 retrieve_knowledge 和 generate_quiz 工具来回答问题。
所有回答必须基于工具返回的内容。
挂载到 Coze:
============
Coze Bot → 工具 → 自定义 → MCP → Stdio
命令:
```bash
python D:
ag_textmcp_server.py
```
(需将 transport 改为 stdio 或部署到服务器后用 SSE)
Docker 容器化:
==============
### 构建镜像:
```bash
ash
docker build -t rag-quiz .
```
### 运行:
```bash
docker run -p 8000:8000 rag-quiz
```
### 难度自适应策略难度自适应策略:
- **3 级难度**:简单 → 中等 → 困难
- **升级条件**:连续答对 2 题
- **降级条件**:连续答错 2 题
- 入库时通过关键词匹配自动标注每个 chunk 的难度级别
### 自定义:
- **难度关键词**:修改 ingest.py 中的 DIFFICULTY_KEYWORDS
- **出题 prompt**:修改 chain.py 中的 get_quiz_chain()
- **调整策略**:修改 main.py 中的 _adjust_difficulty()
- **检索数量**:修改 config.py 中的 TOP_K
交互示例:
==========
自适应出题系统 v1.0
输入 exit 退出 | 输入 skip 跳过本题
--- 当前难度:简单 ---
----------------------
【题目】
...(隐藏正确答案的题目)
你的答案:A
[正确!]
正确答案:A
...
--- 统计:正确 1/1(100%)---
`
## 难度自适应策略
- **3 级难度**:简单 → 中等 → 困难
- **升级条件**:连续答对 2 题
- **降级条件**:连续答错 2 题
- 入库时通过关键词匹配自动标注每个 chunk 的难度级别