周六(Day 1:8小时)
目标:完成基础环境搭建与数据预处理
时间段 | 任务 | 具体步骤 | 交付物 | 技术提示 |
9:00-10:30 | 环境检查与依赖安装 | 1. 确认DeepSeek模型可正常加载(python -c "import transformers; print('OK')) 2. 安装必要库: pip install faiss-cpu sentence-transformers fastapi gradio PyPDF2 3. 创建项目目录结构: mkdir -p data/{raw,processed} models | 环境检查清单 依赖列表 | 使用virtualenv创建独立环境,避免包冲突 |
10:30-12:30 | 样例数据准备与清洗 | 1. 准备3-5个测试文档(PDF+Markdown)存放到data/raw 2. 编写通用解析脚本: python # file_parser.py def parse_file(path): if path.endswith('.pdf'): return extract_text_from_pdf(path) # 复用昨日代码 elif path.endswith('.md'): return open(path).read()
| 测试数据集 解析脚本 | 使用chardet检测文件编码,避免乱码 |
14:00-16:00 | 文本分块与向量化 | 1. 实现动态分块逻辑: python from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50 ) chunks = splitter.split_text(text)
2. 生成向量并保存: python import numpy as np vectors = model.encode(chunks) np.save(' data/processed/vectors.npy', vectors)
| 分块后的文本文件 向量文件 | 对中文长句优先按标点分块(句号、问号) |
16:00-17:30 | FAISS索引构建 | 1. 创建带ID映射的索引: python index = faiss.IndexIDMap(faiss.IndexFlatIP(384)) index.add_with_ids(vectors, np.arange(len(vectors)))
2. 实现增量添加接口: python def add_to_index(new_vecs): start_id = index.ntotal index.add_with_ids(new_vecs, np.arange(start_id, start_id+len(new_vecs)))
| FAISS索引文件 | 使用IndexIDMap为后续增量更新留出扩展空间 |
周日(Day 2:8小时)
目标:实现问答接口与基础UI
时间段 | 任务 | 具体步骤 | 交付物 | 技术难点预警 |
9:00-11:00 | DeepSeek问答接口开发 | 1. 封装RAG核心逻辑: python def generate_answer(question): # 检索逻辑... # 构造prompt模板 prompt = f"已知:{context}\n问题:{question}\n答案:" # 模型生成 return model.generate(prompt, max_length=1024)
2. 添加流式输出支持: python for token in model.stream_generate(prompt): print(token, end='', flush=True)
| RAG核心模块 | 注意控制max_length防止内存溢出 |
11:00-12:30 | FastAPI服务封装 | 1. 创建基础API端点: python # main.py from fastapi import FastAPI app = FastAPI() @app.post("/ask") def ask_endpoint(question: str): return {"answer": generate_answer(question)}
2. 添加跨域支持: pip install fastapi.middleware.cors | 可运行的API服务 | 使用uvicorn部署: uvicorn main:app --reload --port 8000 |
14:00-15:30 | Gradio交互界面开发 | 1. 实现基础UI: python # ui.py import gradio as gr with gr.Blocks() as demo: question = gr.Textbox(label="请输入问题") answer = gr.Textbox(label="系统回答") btn = gr.Button("提交") btn.click(fn=generate_answer, inputs=question, outputs=answer) demo.launch()
| 可交互的Web界面 | 设置queue()处理并发请求 |
15:30-17:00 | 端到端测试与优化 | 1. 验证完整流程: - 上传新文档 → 解析 → 索引更新 → 问答测试 2. 性能压测: ab -n 100 -c 10 http://localhost:8000/ask?question=test 3. 内存优化: - 添加del vectors及时释放内存 | 测试报告 优化方案 | 使用memory_profiler监控内存使用 |
17:00-17:30 | 文档整理与下周计划 | 1. 编写操作手册(README.md) 2. 记录未解决问题清单 3. 制定迭代计划 | 项目文档 | 使用typora编写Markdown文档 |
关键风险应对预案
- 内存不足导致崩溃
- 应急方案:启用交换分区 sudo fallocate -l 4G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
- 根治措施:限制分块大小(调整为300字符/块)
- FAISS索引加载失败
- 检查索引版本兼容性:faiss.__version__需与创建时一致
- 重建命令:python -c "import faiss; faiss.write_index(index, 'backup.index')"
- 中文乱码问题
- 统一编码:在解析时强制指定encoding='utf-8'
- 异常捕获:
try: text = open(file).read() except UnicodeDecodeError: text = open(file, encoding='gbk').read()
成果验收标准
模块 | 检查项 | 验证方法 |
数据预处理 | 能正确解析PDF/Markdown并输出干净文本 | 执行python test_parser.py查看日志 |
向量检索 | 输入相似问题能返回相关度TOP3的文档块 | 人工验证检索结果相关性 |
问答接口 | API响应时间<5秒(无缓存情况下) | 使用curl测试并记录响应时间 |
用户界面 | 可输入问题并显示带格式的回答 | 屏幕录制操作过程 |
按照此计划执行,周末结束时将获得一个可本地运行的知识问答原型系统。建议每完成一个阶段立即commit代码(git commit -m "feat:完成XX模块"),便于问题追溯。