打造一个能写能画的AI学习助手:从零到可用的完整教程

📅 2026/9/26 ✍️ 小文 📖 约 1 分钟

手把手教你用国产大模型+知识库搭建个性化AI学习助手,覆盖需求拆解、RAG构建、Prompt设计、前端对接全流程,附完整可运行代码。

为什么要自己做学习助手

市面上的 AI 助手很多,但都有共同问题:不知道你的知识背景、不了解你的学习目标、记不住你学到哪了。结果就是每次都像从零开始对话,效率很低。

自己做一个学习助手,能解决这些痛点:接入你的教材和笔记、跟踪你的学习进度、针对你的薄弱环节出题。这篇教程带你从零搭一个可用的版本。

第一步:拆解需求

先想清楚你到底需要什么。一个实用的学习助手至少要有四个能力:

  1. 答疑:基于你的教材回答概念问题,并给出来源
  2. 出题:根据知识点生成练习题和答案
  3. 追踪:记录你学过什么、哪些薄弱
  4. 计划:根据剩余时间安排学习进度

先做 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 算法安排复习时间
  • 多轮追问:把历史对话带上,支持连续提问
  • 语音输入:接语音识别,方便口头提问
  • 进度看板:可视化学习进度和薄弱点

五个实践建议

  1. 资料质量决定上限:垃圾资料进去,垃圾回答出来。先清理你的知识库。
  2. 强制引用来源:让模型标注来源,方便你核对,也减少幻觉。
  3. 控制上下文长度:检索 3–5 条足够,塞太多反而干扰。
  4. 定期更新知识库:新学的内容及时加进去。
  5. 别完全信任:AI 出的题和答案,自己要核对一遍。

结语

一个自己的学习助手,最大的价值不是”更聪明”,而是真正懂你的学习情况。这套方案不到 200 行代码,一两天就能搭起来。先做最简单的答疑版,跑起来,再一点点加功能——这比自己纠结用哪个框架高效得多。

📤 分享到