打造一个能写能画的AI学习助手:从零到可用的完整教程
手把手教你用国产大模型+知识库搭建个性化AI学习助手,覆盖需求拆解、RAG构建、Prompt设计、前端对接全流程,附完整可运行代码。
为什么要自己做学习助手
市面上的 AI 助手很多,但都有共同问题:不知道你的知识背景、不了解你的学习目标、记不住你学到哪了。结果就是每次都像从零开始对话,效率很低。
自己做一个学习助手,能解决这些痛点:接入你的教材和笔记、跟踪你的学习进度、针对你的薄弱环节出题。这篇教程带你从零搭一个可用的版本。
第一步:拆解需求
先想清楚你到底需要什么。一个实用的学习助手至少要有四个能力:
- 答疑:基于你的教材回答概念问题,并给出来源
- 出题:根据知识点生成练习题和答案
- 追踪:记录你学过什么、哪些薄弱
- 计划:根据剩余时间安排学习进度
先做 1 和 2,跑通后再加 3 和 4。别一上来就贪大。
第二步:技术选型
对个人项目,建议这样选:
| 组件 | 选择 | 理由 |
|---|---|---|
| 大模型 | 国产模型 API(通义/DeepSeek) | 便宜、中文好、无需科学上网 |
| 向量库 | Chroma(本地) | 零依赖,一个文件即可 |
| 框架 | 直接调 API,不上重型框架 | 简单可控,出问题好调试 |
| 前端 | Streamlit 或纯 HTML | 快速出界面 |
新手建议不要一上来用 LangChain,它抽象层多,出问题难定位。先用原生 API 把逻辑跑通,需要时再引入框架。
第三步:构建知识库
把你的教材/笔记切成片段,向量化后存入 Chroma。
import chromadb
from openai import OpenAI
client = OpenAI(api_key="YOUR_KEY", base_url="https://api.deepseek.com")
chroma = chromadb.PersistentClient(path="./study_db")
collection = chroma.get_or_create_collection("notes")
def add_document(text, source):
# 按段落切分,每段 500 字,重叠 50 字
chunks = split_text(text, size=500, overlap=50)
for i, chunk in enumerate(chunks):
emb = embed(chunk)
collection.add(
ids=[f"{source}_{i}"],
embeddings=[emb],
documents=[chunk],
metadatas=[{"source": source, "chunk": i}],
)
切分是关键:太大检索不准,太小丢上下文。500 字、重叠 50–100 字是个不错的起点。按语义段落切比按固定字数切好得多。
第四步:设计核心 Prompt
答疑和出题需要不同的 prompt。
答疑 Prompt:
你是一位耐心的学习助教。请基于提供的【参考资料】回答用户问题。
规则:
1. 只使用参考资料中的内容回答,不要编造
2. 如果资料中没有相关内容,明确说"你的资料里没有提到这个"
3. 回答后标注来源(资料名)
4. 用通俗语言解释,适当举例
参考资料:
{context}
用户问题:{question}
出题 Prompt:
基于以下知识点,生成 5 道练习题。
要求:
- 2 道选择题(每题4个选项)
- 2 道简答题
- 1 道应用题
- 难度递进
- 在最后附上详细答案和解析
知识点内容:
{context}
第五步:组装主流程
def study_assistant(user_input, mode="qa"):
# 1. 检索相关知识
results = collection.query(
query_embeddings=[embed(user_input)],
n_results=5,
)
context = "\n\n".join(results["documents"][0])
# 2. 选择 prompt 模板
template = QA_PROMPT if mode == "qa" else QUIZ_PROMPT
prompt = template.format(context=context, question=user_input)
# 3. 调用大模型
resp = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": prompt}],
temperature=0.3, # 答疑要稳
)
return resp.choices[0].message.content
注意答疑场景 temperature 要低(0.2–0.3),保证稳定准确;出题可以稍高(0.7),增加多样性。
第六步:加学习追踪
用一个简单的 SQLite 记录学习历史:
import sqlite3
conn = sqlite3.connect("progress.db")
conn.execute("""
CREATE TABLE IF NOT EXISTS history (
id INTEGER PRIMARY KEY,
date TEXT,
topic TEXT,
question TEXT,
mastered INTEGER DEFAULT 0
)
""")
每次提问记录主题;用户标记”已掌握”时更新状态。下次可以针对”未掌握”的主题优先出题。
第七步:做一个界面
用 Streamlit 几行代码就能放出界面:
import streamlit as st
st.title("我的 AI 学习助手")
mode = st.radio("模式", ["答疑", "出题", "复习"])
if mode == "答疑":
q = st.text_input("你的问题")
if q:
st.write(study_assistant(q, "qa"))
elif mode == "出题":
topic = st.text_input("出题主题")
if topic:
st.write(study_assistant(topic, "quiz"))
运行 streamlit run app.py,浏览器就能用了。
进阶方向
基础版跑通后,可以逐步加:
- 错题本:记录答错的问题,定期重做
- 间隔重复:用 SM-2 算法安排复习时间
- 多轮追问:把历史对话带上,支持连续提问
- 语音输入:接语音识别,方便口头提问
- 进度看板:可视化学习进度和薄弱点
五个实践建议
- 资料质量决定上限:垃圾资料进去,垃圾回答出来。先清理你的知识库。
- 强制引用来源:让模型标注来源,方便你核对,也减少幻觉。
- 控制上下文长度:检索 3–5 条足够,塞太多反而干扰。
- 定期更新知识库:新学的内容及时加进去。
- 别完全信任:AI 出的题和答案,自己要核对一遍。
结语
一个自己的学习助手,最大的价值不是”更聪明”,而是真正懂你的学习情况。这套方案不到 200 行代码,一两天就能搭起来。先做最简单的答疑版,跑起来,再一点点加功能——这比自己纠结用哪个框架高效得多。