
这两年教育信息化项目越来越多很多学校都在尝试把大模型能力引入日常教学。但真正落地时问题不少通用大模型回答生物题经常出现术语不准确、举例超纲、知识点和教材版本对不上的情况学生问一道遗传题模型只会直接给答案不会带着学生一步一步推理老师想根据班级错题自动生成个性化练习题又缺乏稳定的技术路径。单纯接一个对话机器人显然撑不起“教、学、评、练”这套完整场景。于是越来越多团队开始从“对话智能体”切入逐步构建面向特定学科的智能教学平台。本文会基于这样一个真实方向完整梳理智能体的核心概念、系统架构、关键代码实现以及工程化落地中的高频问题。无论你是刚开始接触大模型应用开发的初学者还是已经在做教育类产品的后端工程师都能从中拿到一套可以照着改的闭环方案。1. 背景与核心概念1.1 对话智能体是什么对话智能体英文常写为 Conversational Agent 或 LLM Agent。通俗地讲它不再是一个“你问我答”的聊天机器人而是一个能够理解目标、拆解任务、调用工具、检索知识、记忆上下文并最终通过自然语言给出结果的软件系统。举一个生物学科的例子传统聊天机器人学生问“光合作用的过程是什么”机器人从预设问答库里找到一句话返回给用户。对话智能体学生问“帮我整理光合作用与呼吸作用的对比表并出一道关于暗反应的单选题”智能体会先判断用户意图接着从知识库检索光合作用和呼吸作用的相关教材内容再按教学要求生成对比表和题目最后还要检查生成内容是否和知识库一致避免超纲或出错。两者最核心的差别在于传统机器人依赖“规则检索”智能体则加入了“规划工具调用自我校验”的能力本质上是一套以大语言模型LLM为大脑的自动化任务执行系统。1.2 生物学科智能教学平台需要哪些能力生物学科有其鲜明的教学特点知识点多、实验过程复杂、图文结合紧密、概念辨析要求高。一个合格的生物学科智能教学平台通常需要覆盖以下能力功能模块面向用户核心能力智能知识问答学生、老师基于本校教材和知识库的准确问答不编造概念题目生成老师、学生支持按知识点、难度、题型生成练习题错题分析学生自动识别薄弱知识点给出解析和同类题推荐实验指导学生分步骤讲解实验原理、操作流程和注意事项学情报告老师、家长统计班级或个人的知识点掌握情况备课辅助老师快速生成教案、课件提纲、课堂练习题这些能力看起来很多但核心底座只有一个一个能够调用多种工具的学科智能体。所以技术路线上不应该为每个功能单独做一个系统而是先搭一个稳定的智能体底座再把问答、出题、分析、报告都挂载为一个个“工具”。1.3 为什么选择智能体而不是普通问答模型很多团队一开始会直接调用大模型接口写一段提示词封装成一个问答 API。这种方案在演示时可以跑通一旦进入真实课堂就会暴露问题第一幻觉问题。通用大模型对特定版本教材的知识掌握不够准确回答概念题时可能张冠李戴。第二缺少依据。学生问“为什么这道题的答案是 B”模型可能只是重新生成一段文字没有给出可追溯的教材依据老师不敢采信。第三难以组合。问答、出题、分析是三个不同的任务如果全部写在一个提示词里系统会变得难以维护。智能体的思路是把“大模型生成能力”和“外部知识、工具、记忆”解耦。模型负责理解和规划知识库负责提供事实工具负责完成任务记忆负责保持长期学习档案。这样每一层都可以独立升级和测试。2. 系统整体架构设计2.1 分层架构基于上面的分析推荐采用如下图所示的五层结构。为了避免依赖具体的图表库这里用文字描述各层职责。前端/对话入口 ↓ 业务应用层课堂问答、错题本、班级报告、教师端 ↓ 智能体编排层意图识别、任务规划、工具调用、记忆管理 ↓ 模型服务层LLM接口、Embedding模型 ↓ 数据层学科知识库、题库、学生档案、向量数据库前端/对话入口学生端、教师端、管理后台负责展示对话界面和教学数据。业务应用层将智能体的能力封装成教学业务接口。例如“学生提问”“老师布置作业”“系统生成学情报告”都是独立接口。智能体编排层这是整个平台的核心。它接收请求后需要完成意图识别、任务拆解、决定调用哪个工具、维护多轮对话记忆等工作。模型服务层提供大语言模型的推理能力和文本向量化能力。这一层通常是接入第三方大模型服务也可以是私有化部署的开源模型。数据层存放结构化数据和非结构化数据。非结构化数据包括教材、课件、实验手册结构化数据包括题库、学生成绩、知识点关系表、对话记录。2.2 核心数据流向一次典型的提问流程如下学生输入“帮我解释一下有丝分裂各个时期的特点”。应用层把请求转发给智能体编排层并携带学生 ID、班级、教材版本等上下文。编排层先判断问题属于“知识问答”于是决定调用“知识库检索工具”。检索工具从向量数据库中召回与“有丝分裂”相关的知识片段。模型将知识片段、对话历史、教学规则一起组织成最终回复。回复返回前端展示同时写入学生问答历史。整个过程看起来简单但工程实现时每个环节都有大量细节。后面我们用代码一步步实现一个最小可运行的生物学科智能助教 Agent。3. 环境准备与版本说明3.1 技术选型说明本文示例以 Python 3.10 为基础使用 FastAPI 作为 Web 框架使用 OpenAI 兼容接口接入大模型服务。之所以选择“OpenAI 兼容接口”写法是因为目前主流的大模型服务商都提供了兼容格式的接口无论你接入的是国内还是国外的模型服务都可以用同一套代码逻辑只需要修改base_url、api_key和模型名称即可。需要特别说明的是不同模型服务商的具体 SDK 和版本存在差异以下代码示例重点演示设计思路实际开发时请以你当前使用的模型服务商 SDK 文档为准。3.2 环境依赖建议使用虚拟环境隔离项目依赖。创建并激活虚拟环境python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate安装依赖pip install fastapi uvicorn openai chromadb sentence-transformers pydantic各依赖的主要用途如下fastapi提供 Web API 服务。uvicorn作为 ASGI 服务器运行 FastAPI。openaiOpenAI 兼容接口的 Python SDK。chromadb轻量级向量数据库用来做知识库本地存储与检索。sentence-transformers将文本转换成向量用于知识库召回。pydantic配置模型和数据校验。如果你的网络环境无法直接下载模型文件可以使用git lfs手动下载后指定本地路径如果你所在团队已经接入了公司内部的向量化服务也可以直接用内部 API 替换sentence-transformers。3.3 项目目录结构本文按以下目录组织示例项目bio-agent/ ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI 入口 │ ├── config.py # 全局配置 │ ├── agent/ │ │ ├── __init__.py │ │ ├── agent_core.py # 智能体编排核心 │ │ └── tools.py # 工具定义与注册 │ ├── rag/ │ │ ├── __init__.py │ │ ├── store.py # 向量数据库封装 │ │ └── retriever.py # 检索器 ├── data/ │ └── knowledge/ │ └── biology.md # 示例知识文档 ├── scripts/ │ └── init_kb.py # 初始化知识库脚本 ├── requirements.txt └── README.md4. 核心设计拆解智能体如何理解生物学科问题在写代码之前先理解三个关键设计点。这些设计直接决定了后续代码的结构。4.1 提示词工程给模型设定教师角色大模型本身不知道自己是“生物助教”它只会根据提示词来调整回答方式。所以我们要在系统提示词里明确角色设定、回答约束和教学策略。一个经典的生物助教提示词模板可以包含以下内容角色你是一名经验丰富的高中生物教师助手。要求优先使用提供的教材知识库内容。原则如果知识库中没有对应内容必须如实说明不能编造。策略讲解概念时先给通俗解释再给专业定义必要时补充例子和易错点。安全边界不直接给学生答案优先引导推理思路。这段提示词是整个智能体行为的“宪法”后续所有工具调用和回答都必须受它约束。4.2 基于 RAG 的学科知识库问答RAGRetrieval-Augmented Generation检索增强生成是目前解决大模型幻觉的主流方案。它的思想是在模型生成回答之前先从外部知识库中检索出与问题相关的文档片段把这些片段拼接到提示词中作为模型回答的依据。对生物教学平台来说RAG 特别重要。因为生物教材版本多不同版本的知识点表述不同。生物学术语更新迭代模型参数中的知识可能滞后。老师需要答案有据可查便于备课和讲解。实现 RAG 的核心是把教材知识切分成片段然后用向量数据库存储。查询时将用户问题向量化与库中所有片段做相似度计算返回最相关的几个片段。4.3 工具调用把能力挂载给智能体真正的智能体必须能“动手做事”而不只是“动嘴说话”。本文示例会挂载三个工具知识库检索工具返回与问题相关的教材知识片段。例题生成工具按知识点和难度生成生物练习题。错题分析工具根据学生错题描述分析薄弱知识点并给学习建议。模型在收到用户问题后会主动决定是否调用工具、调用哪个工具、传什么参数。这个机制在 OpenAI 接口中叫 function calling在 Anthropic 接口中叫 tool use各家大模型基本都支持。4.4 多轮记忆管理学生提问通常不是孤立的一句话。比如上一轮问“什么是显性基因”下一轮问“那隐性基因呢”。智能体必须保留上下文才能正确理解这里的“那”指的是什么。记忆可以分两层短期记忆当前对话的上下文直接放在 messages 数组里传给模型。长期记忆学生的学习偏好、薄弱知识点、历次问答记录存入数据库后续调用时注入提示词。本文示例重点演示短期记忆长期记忆会在“工程化建议”部分介绍实现思路。5. 完整实战搭建一个生物学科智能助教 Agent5.1 配置文件 app/config.py配置文件统一管理模型服务接入参数# 文件路径bio-agent/app/config.py import os from pydantic import BaseModel class Settings(BaseModel): # 模型服务配置请替换为你自己可用的服务地址和密钥 model_name: str os.getenv(MODEL_NAME, qwen-plus) base_url: str os.getenv(BASE_URL, https://your-llm-service.example.com/v1) api_key: str os.getenv(API_KEY, your-api-key) temperature: float 0.3 # 向量检索配置 embedding_model: str os.getenv(EMBEDDING_MODEL, BAAI/bge-small-zh-v1.5) collection_name: str bio_knowledge top_k: int 3 settings Settings()这里需要特别注意base_url和api_key必须根据你所在团队实际接入的模型服务进行配置。密钥信息不能硬编码提提交到 Git 仓库生产环境建议使用环境变量或密钥管理系统。5.2 知识库初始化脚本 scripts/init_kb.py知识库是 RAG 的基础。我们先准备一份简单的生物知识文档例如data/knowledge/biology.md内容包含光合作用、呼吸作用、遗传等知识点。这里只展示其中一小段# 光合作用 光合作用是绿色植物利用光能将二氧化碳和水转化为有机物并释放氧气的过程。 反应阶段包括光反应阶段和暗反应阶段。光反应阶段发生在类囊体薄膜上 水的光解产生氧气和[H]同时生成ATP暗反应阶段发生在叶绿体基质中 包括二氧化碳的固定和三碳化合物的还原。初始化脚本需要完成读取文档 → 按章节或标题切块 → 向量化 → 存储到 Chroma。# 文件路径bio-agent/scripts/init_kb.py import re from pathlib import Path from sentence_transformers import SentenceTransformer import chromadb from app.config import settings def load_markdown_by_chapter(file_path: Path): raw_text file_path.read_text(encodingutf-8) blocks [] current_title 通用 for line in raw_text.splitlines(): if line.startswith(#): current_title line.lstrip(#).strip() elif line.strip(): blocks.append({title: current_title, content: line.strip()}) return blocks def init_kb(): model SentenceTransformer(settings.embedding_model) client chromadb.PersistentClient(path./chroma_db) collection client.get_or_create_collection(settings.collection_name) blocks load_markdown_by_chapter(Path(./data/knowledge/biology.md)) for idx, block in enumerate(blocks): text f【{block[title]}】{block[content]} collection.add( ids[fdoc_{idx}], documents[text], metadatas[{title: block[title]}], embeddings[model.encode(text).tolist()], ) print(f知识库初始化完成共写入 {len(blocks)} 个片段) if __name__ __main__: init_kb()这段代码的关键点在于切块逻辑。在真实项目中不能简单按行切块而应该按“知识点完整度”来切一个片段尽量是完整的定义、完整的过程或完整的例题避免把一个概念拆得七零八落。5.3 检索器封装 app/rag/retriever.py检索器负责接收问题返回最相关的知识片段。# 文件路径bio-agent/app/rag/retriever.py from sentence_transformers import SentenceTransformer import chromadb from app.config import settings class Retriever: def __init__(self): self.model SentenceTransformer(settings.embedding_model) self.client chromadb.PersistentClient(path./chroma_db) self.collection self.client.get_or_create_collection(settings.collection_name) def search(self, query: str, top_k: int None): k top_k or settings.top_k query_vector self.model.encode(query).tolist() results self.collection.query( query_embeddings[query_vector], n_resultsk, ) docs results.get(documents, [[]])[0] return docs retriever Retriever()5.4 工具定义 app/agent/tools.py工具是智能体执行具体任务的能力单元。我们先定义工具函数再给每个函数加上描述信息供模型识别。# 文件路径bio-agent/app/agent/tools.py import json import random from app.rag.retriever import retriever def search_knowledge_base(query: str) - str: 在生物学科知识库中检索与query相关的知识点片段 docs retriever.search(query, top_k3) return json.dumps({documents: docs}, ensure_asciiFalse) def generate_question(knowledge_point: str, difficulty: str 中) - str: 根据知识点和难度生成一道生物练习题 question_pool [ { point: 光合作用, question: 在光合作用暗反应阶段二氧化碳首先被固定为 , options: [A. C3化合物, B. C5化合物, C. ATP, D. 氧气], answer: A, analysis: 二氧化碳与C5结合形成C3化合物这个过程称为二氧化碳的固定。 } ] matched [q for q in question_pool if q[point] knowledge_point] if not matched: return json.dumps({message: 该知识点暂未收录题目}, ensure_asciiFalse) question random.choice(matched) return json.dumps(question, ensure_asciiFalse) TOOLS [ { type: function, function: { name: search_knowledge_base, description: 从教材知识库检索相关知识点适合概念解释、过程描述类问题, parameters: { type: object, properties: { query: {type: string, description: 用户问题中的核心关键词} }, required: [query] } } }, { type: function, function: { name: generate_question, description: 根据指定知识点生成练习题适合学生要求出题或老师要求组卷场景, parameters: { type: object, properties: { knowledge_point: {type: string, description: 知识点名称}, difficulty: {type: string, description: 难度易、中、难} }, required: [knowledge_point] } } } ] TOOL_MAP { search_knowledge_base: search_knowledge_base, generate_question: generate_question, }需要说明的是这里的generate_question使用的是固定的题目池。真实项目中这里应该调用一个独立的题目生成服务或者由智能体在后续对话中调用大模型生成题目然后用知识库校验题目正确性。5.5 智能体编排核心 app/agent/agent_core.py编排核心是本文最重要的代码。它的职责是接收用户消息和对话历史。调用大模型传入工具定义。如果模型返回工具调用请求执行工具并把结果返回给模型。如果模型返回普通回复则结束循环返回最终回答。# 文件路径bio-agent/app/agent/agent_core.py import json from openai import OpenAI from app.config import settings from app.agent.tools import TOOLS, TOOL_MAP SYSTEM_PROMPT 你是一名经验丰富的高中生物教师助手。 你的目标是为学生提供准确、有教学价值的生物学科辅导。 要求如下 1. 回答概念题时优先使用知识库检索结果并在回答中标注依据来源。 2. 如果知识库中没有相关信息如实说明不能编造知识点。 3. 讲解题目时不要直接给答案先引导学生思考再给出解析。 4. 当学生提出出题、组卷、练习请求时调用题目生成工具。 5. 回答要简洁清晰术语使用规范。 class AgentCore: def __init__(self): self.client OpenAI( base_urlsettings.base_url, api_keysettings.api_key, ) def run(self, user_message: str, history: list None): messages [{role: system, content: SYSTEM_PROMPT}] for item in history or []: messages.append(item) messages.append({role: user, content: user_message}) while True: response self.client.chat.completions.create( modelsettings.model_name, messagesmessages, toolsTOOLS, temperaturesettings.temperature, ) msg response.choices[0].message messages.append(msg) if not msg.tool_calls: return msg.content for tool_call in msg.tool_calls: tool_name tool_call.function.name tool_args json.loads(tool_call.function.arguments or {}) if tool_name in TOOL_MAP: tool_result TOOL_MAP[tool_name](**tool_args) else: tool_result json.dumps({error: 工具不存在}, ensure_asciiFalse) messages.append({ role: tool, tool_call_id: tool_call.id, content: tool_result, }) agent_core AgentCore()这段代码体现了智能体的核心循环模型决定调用什么 → 系统执行工具 → 把结果还给模型 → 模型继续生成或给出最终回答。这个循环可以执行多轮也就是说模型可以连续调用多个工具来完成复杂任务。5.6 FastAPI 接口 app/main.py接下来把智能体包装成 HTTP 接口方便前端调用。# 文件路径bio-agent/app/main.py from fastapi import FastAPI from pydantic import BaseModel from app.agent.agent_core import agent_core app FastAPI(title生物学科智能助教) class ChatRequest(BaseModel): message: str session_id: str default history: list [] app.post(/api/chat) def chat(req: ChatRequest): answer agent_core.run(req.message, req.history) return { code: 0, data: { session_id: req.session_id, reply: answer, } } app.get(/health) def health(): return {status: ok}这里为了演示清晰使用同步接口。真实生产环境建议改成 SSE 流式返回让用户看到逐字生成的效果体验会好很多。5.7 前端演示页面为了方便快速验证效果我们写一个最简单的聊天页面。创建一个static/index.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 title生物学科智能助教/title /head body h2生物学科智能助教/h2 div idchat_box styleheight:400px; overflow-y:auto; border:1px solid #ccc;/div input iduser_input stylewidth:70%; placeholder输入你的生物问题 button onclicksend()发送/button script async function send() { const input document.getElementById(user_input); const box document.getElementById(chat_box); const message input.value.trim(); if (!message) return; box.innerHTML pb学生/b message /p; input.value ; const resp await fetch(/api/chat, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify({message: message, session_id: demo}) }); const result await resp.json(); const reply result.data.reply; box.innerHTML pb助教/b reply /p; } /script /body /html在main.py中挂载静态目录from fastapi.staticfiles import StaticFiles app.mount(/static, StaticFiles(directorystatic), namestatic)访问http://127.0.0.1:8000/static/index.html即可看到对话页面。5.8 运行与验证启动服务uvicorn app.main:app --reload --port 8000用一个 curl 命令验证接口curl -X POST http://127.0.0.1:8000/api/chat \ -H Content-Type: application/json \ -d {message: 光合作用的暗反应阶段发生了什么, session_id: test001}预期返回结果中智能体会先将问题转为知识库检索然后基于检索结果回答。如果知识库中没有相关内容它会明确告诉你“该知识点暂未收录”。6. 从问答到“教、学、评、练”平台功能扩展实现一个基础的问答 Agent 只是第一步。要让平台真正进入教学场景还需要把能力扩展到“教、学、评、练”四个方向。6.1 题目生成与校验在tools.py中我们用一个固定题库演示了出题工具。真实平台中题目生成应该由大模型完成但生成后必须经过校验题目是否符合当前教材的知识点范围选项是否有歧义答案是否正确难度是否符合要求校验可以设计为另一个 Agent 工具生成题目 → 调用校验工具 → 校验通过才返回给学生。这个思路本质上就是“多智能体协作”一个负责生成一个负责审核。6.2 错题分析与学习建议错题分析功能需要结合结构化数据。建议设计如下数据表学生ID题目ID知识点标签答题结果对/错错误类型概念不清、审题错误、计算错误当学生提交一道错题时智能体先通过题目ID查知识点标签再结合学生的历史错题记录生成个性化的薄弱项分析和学习建议。这里要用到大模型的结构化输出能力让模型以 JSON 格式返回分析结果。下面是一个提示词片段示例ANALYSIS_PROMPT 你现在是一名学生学情分析师。请根据学生的历史错题记录分析其薄弱知识点。 输出格式要求 { weak_points: [知识点A, 知识点B], suggestions: [复习建议1, 复习建议2], priority: 高 } 学生历史错题{history_records} 6.3 学情报告学情报告是老师最需要的功能。它的实现思路是把班级学生的答题数据按知识点聚合统计正确率再交给智能体生成报告。聚合后的数据示例{ class_id: 高二3班, knowledge_stats: [ {point: 光合作用, correct_rate: 0.72}, {point: 细胞呼吸, correct_rate: 0.85}, {point: 遗传规律, correct_rate: 0.45} ] }智能体可以基于这些数据生成“本周班级在遗传规律模块正确率仅45%建议增加显隐性判断的专项训练并针对自由组合定律安排课堂讲评。”相比直接展示一堆数据表格这种自然语言报告对老师来说更友好。7. 常见问题与排查思路在开发智能教学平台的过程中下面这些问题几乎一定会遇到。问题现象常见原因解决思路模型回答编造知识点知识库缺失或检索召回不准确检查知识库覆盖范围提高切块质量增加RAG召回数检索结果与问题不相关Embedding模型效果一般更换更专业的中文Embedding模型或对查询做关键词改写工具调用不触发提示词约束太弱在系统提示词中明确“当学生要求出题时调用generate_question”并检查工具描述是否清晰上下文超长多轮历史全部传给模型只保留最近几轮消息或对历史做摘要压缩接口响应太慢模型推理时间长工具链路过长使用流式输出设置超时阈值对简单问题走快捷通道并发过高时服务不稳定模型服务限流数据库连接不够增加排队机制使用异步Client合理配置连接池生成答案与教材表述不一致RAG片段截断导致语义不完整优化切块保留章节标题和上下文摘要排查问题时建议先记录一条完整请求链路用户提问 → 检索片段 → 模型输入 → 工具结果 → 模型输出。只要链路日志清晰大部分问题都能快速定位。尤其是 RAG 检索很多时候问题不是模型推理而是“召回的知识本身就是错的或不全的”。8. 最佳实践与工程建议从演示项目走向真正可用的教学平台还需要补齐工程化的几个关键环节。8.1 知识库质量比模型更关键很多团队一开始把精力放在调提示词上但没发现问题出在知识库。知识库的切块、去重、版本管理、覆盖度直接影响生成质量。建议从第一天起就建立知识库的版本管理机制每次更新都记录变更内容并配套一个评测集来验证更新效果。8.2 建立学科评测集准备 50 到 100 道覆盖核心知识点的测试题目每个问题都标注正确答案和参考依据。每次修改提示词、模型版本或知识库后都跑一遍评测集计算回答准确率和召回依据达标率。这样可以避免“修好一个问题引入五个新问题”的情况。8.3 教育场景的安全边界面向未成年人的教学平台需要在产品层面做好边界设计不采集与学习无关的个人隐私信息。学生对话内容需要脱敏存储。涉及心理、健康、价值观等问题时不提供超出学科范围的建议。生成内容需要经过内容安全审核避免出现不适合学生的表述。技术层面可以在智能体流程中增加一道“输出合规校验”工具对模型最终输出做一次检查。8.4 降级方案大模型服务会出现超时、限流、宕机等情况。平台必须设计降级策略模型不可用时至少还能通过知识库检索返回最相关的教材原文或者返回预设的静态答疑内容。不能让一张聊天页面完全不可用。8.5 成本控制大模型调用的成本大头在 Token 消耗尤其是多轮对话和长知识片段。优化思路包括对问题先做意图分类简单问题走小模型或规则匹配。知识召回数量不要设置过大3 到 5 个片段足够。保存常用问答缓存相同问题直接返回缓存结果。对生成的练习题、学情报告等长文本采用异步生成避免挤占在线资源。8.6 可观测性每一步都要有日志和指标。建议至少记录模型调用耗时、Token 消耗、知识库检索耗时、检索命中结果、工具调用次数、最终回答耗时。这些数据既可以用来排查故障也可以用来评估智能体在真实场景中的表现。9. 总结与下一步学习建议到这里我们已经从概念到代码完整走了一遍“从对话智能体到生物学科智能教学平台”的实现路径。你现在应该理解了对话智能体和普通问答机器人的区别掌握了 RAG 知识库的搭建方法学会了设计工具调用型智能体并能够用 FastAPI 快速把智能体封装成可用的教学服务。下一步可以往这几个方向继续深入学习 LangGraph、Dify 等成熟的 Agent 编排框架了解复杂任务如何用图结构编排。研究多智能体协作模式例如“出题 Agent 审核 Agent 讲解 Agent”的团队协作。引入知识图谱把知识点之间的关系建模成语义网络实现更精准的学习路径推荐。完善学生模型基于长期学习记录构建个性化学习档案真正做到因材施教。文中的所有代码都是一个最小闭环建议你把它下载下来替换成你自己真实的教学知识库跑通之后再逐步添加业务功能。第一次跑通 RAG 问答、第一次让模型成功调用出题工具、第一次生成一份完整的班级学情报告这些里程碑会帮助你快速建立起对大模型应用的工程直觉。如果这篇文章对你有帮助可以收藏备用。也欢迎在评论区聊聊你在教学平台开发中遇到的坑我们一起探讨。