LLMStart|持续课程 · 不追玄学

工作坊 02:RAG 课程问答小项目

工作坊 02:RAG 课程问答小项目

项目定位

这是课程的第一个实战工作坊。

目标不是做一个复杂系统,而是让学习者把 RAG 的核心链路跑通:整理资料、切分文档、检索片段、组装上下文、生成回答、标注引用、评估错误。

适合人群

  • 已学完模块 1、模块 3、模块 4.1、4.2、4.3 的学习者。
  • 想理解 AI 知识库问答系统如何落地的产品、内容、教育和开发学习者。
  • 有基础编程能力的学习者可以做代码实现;非编程学习者可以完成产品设计版。

项目目标

完成一个“基于课程资料的问答助手”原型。

它应该能:

  • 接收用户关于课程内容的问题。
  • 从课程资料中找到相关片段。
  • 基于片段生成回答。
  • 标注答案来源。
  • 在资料不足时承认不知道。
  • 记录失败案例,进入优化清单。

项目范围

第一版只处理

  • Markdown 课程讲义。
  • 单轮问答。
  • 文本输入和文本输出。
  • 课程资料内部检索。
  • 基础引用。

第一版不处理

  • 多轮复杂对话。
  • 用户权限系统。
  • PDF/OCR。
  • 图片、音频、视频。
  • 自动发布或外部动作。
  • 高并发和生产部署。

先把骨架跑通。第一版就想做成企业级平台,通常会收获企业级头痛。

输入资料

建议使用:

  • LLMCourse/01_foundations/
  • LLMCourse/02_core_principles/
  • LLMCourse/03_prompting_collaboration/
  • LLMCourse/04_rag_knowledge/

第一版不要把整个仓库都丢进去。

项目流程

Step 1:定义问题集

先准备 20 个测试问题。

建议类型:

类型 示例
概念解释 LLM 到底是什么?
对比问题 RAG 和微调有什么区别?
应用问题 什么时候需要向量检索?
边界问题 RAG 能彻底解决幻觉吗?
课程导航 我应该先学 Prompt 还是 RAG?
资料不足 课程有没有讲某个未覆盖工具?

Step 2:整理文档

确定哪些文件进入知识库。

记录:

  • 文件路径
  • 模块
  • 单元
  • 标题
  • 难度
  • 是否进入第一版

Step 3:设计 Chunk

推荐第一版按标题结构切分:

  • 保留一级标题和二级标题。
  • 每个 Chunk 尽量围绕一个小主题。
  • 不拆断列表和代码块。
  • 每个 Chunk 附带来源路径和小标题。

Step 4:建立检索

可选实现方式:

产品设计版

不写代码,手动模拟:

  1. 对每个问题人工找 3 个相关片段。
  2. 把片段交给 LLM。
  3. 要求 LLM 基于片段回答。
  4. 检查回答是否引用正确。

代码原型版

实现最小链路:

  1. 读取 Markdown。
  2. 切分 Chunk。
  3. 生成 Embedding。
  4. 做相似度检索。
  5. 返回 Top-k。
  6. 组装 Prompt。
  7. 调用模型生成回答。

Step 5:设计回答 Prompt

基础模板:

你是 LLM 与 AI 课程的学习助手。

请只根据以下课程资料回答用户问题。
如果资料不足,请明确说“课程资料中没有提供足够信息”。
回答后列出引用来源。

课程资料:
{{retrieved_chunks}}

用户问题:
{{question}}

输出格式:
1. 简明回答
2. 关键解释
3. 引用来源
4. 如果需要,给出后续学习建议

Step 6:评估回答

每个问题都按以下维度打分:

维度 说明 分数
相关性 是否回答了问题 1-5
基于资料 是否真的使用检索片段 1-5
准确性 是否有事实错误 1-5
引用质量 引用是否存在并支持结论 1-5
表达清晰 是否适合目标学习者 1-5
不确定性处理 资料不足时是否承认 1-5

Step 7:记录失败案例

每次失败都记录:

  • 用户问题
  • 检索结果
  • 模型回答
  • 错误类型
  • 可能原因
  • 修复建议

错误类型:

  • 没检索到正确资料。
  • 检索到资料但排序太低。
  • 资料正确但模型误读。
  • 回答没有引用。
  • 引用不支持结论。
  • 资料不足却强行回答。

交付物

产品设计版交付物

  • project-plan.md:项目方案。
  • test-questions.md:20 个测试问题。
  • chunk-design.md:切分策略。
  • prompt-template.md:回答 Prompt。
  • evaluation-report.md:评估报告。
  • failure-log.md:失败案例。

代码原型版交付物

  • 文档读取脚本。
  • Chunk 切分脚本。
  • 检索实现。
  • 问答入口。
  • 评估样例。
  • README 使用说明。

评分 Rubric

维度 优秀 合格 需改进
问题集 覆盖概念、对比、应用、边界和资料不足 覆盖 3 类以上问题 问题单一
Chunk 设计 尊重文档结构,来源清楚 基本可检索 切分随意
检索质量 多数问题能找回关键资料 一半以上可用 经常找错
回答质量 准确、清楚、有引用 基本回答问题 幻觉明显
错误分析 能定位失败环节 有失败记录 只看最终答案
产品意识 有边界、风险和迭代计划 有基本流程 只追求 Demo

延伸挑战

完成基础版后,可以继续做:

  • 增加关键词 + 向量混合检索。
  • 增加重排。
  • 增加多轮对话查询改写。
  • 增加课程模块过滤。
  • 增加引用点击跳转。
  • 增加失败案例可视化。

与课程模块的关系

本项目对应:

  • 4.1 为什么需要 RAG
  • 4.2 向量检索基础
  • 4.3 RAG 系统设计
  • 9.1 幻觉与可靠性
  • 5.2 Function Calling / Tool Use

Takeaway

RAG 小项目的重点不是做一个看起来很酷的聊天框,而是亲手经历“资料怎么进来、问题怎么检索、回答怎么生成、错误怎么定位”的完整链路。跑通这条链,才真正理解 RAG。