') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); 【外滩大会2026】小学生讲题助手 · Issue #154 · modelstudioai/modelstudioai.github.io · GitHub
Skip to content

【外滩大会2026】小学生讲题助手 #154

Description

@yinshubinysb-dotcom

参赛项目名称

小学生讲题助手

团队 / 作者

殷紫溪

我做了什么

我做了一个面向小学生的 AI 学习助手——“小学讲题助手”。它不是只把答案摆出来,而是希望像一位有耐心的老师一样,把题目一步一步讲清楚,让同学知道“怎么算”,也知道“为什么这样算”。

我想解决的问题

在课后写作业时,我发现同学们经常遇到这几个问题:

  • 家长工作忙,不一定能随时耐心讲题;
  • 一个人遇到难题时,很容易卡住、着急,甚至失去信心;
  • 有些 AI 回答虽然给出了答案,但语言太复杂,或者没有展示思考过程,小学生不容易真正听懂。

因此,我想做一个随时可以提问、讲解方式更适合小学生的智能助手。它的目标不是替同学完成作业,而是帮助大家看懂思路、学会方法,慢慢养成独立思考的习惯。

我是怎么设计的

我先做了简单的访谈和体验测试,发现低龄学生更需要直观、亲切的引导,讲解中要少用复杂术语,还要把每一步的原因说清楚。于是,我把整个讲题流程设计成四个部分:

  1. 识别题目:支持文字、语音和拍照输入,通过 OCR 提取题目内容;
  2. 判断难度:分析题目需要一步计算还是多步推理;
  3. 分层讲解:简单题突出关键信息、算式和结果,难题则逐步推导并解释每一步为什么这样做;
  4. 规则兜底:当模型识别或回答出现异常时,用关键词和备用规则尽量保证讲解流程不中断。
Image

四个核心特点

  1. 多种方式都能提问:可以输入文字、说出题目,也可以直接拍照,降低使用难度。
  2. 根据题目难度改变讲法:基础题简洁讲,复杂题慢慢拆,不用同一种答案应付所有题目。
  3. 不只给答案,更重视思考过程:我设计了结构化提示词,让 AI 以老师的身份回答,并按照清楚的格式说明步骤和原因。
  4. 讲小学生能听懂的话:我参考三、四年级学生的认知特点,尽量使用亲切、规范、少术语的表达,让科技真正帮助学习,而不是增加负担。

实际体验

我邀请同学进行了体验。收到的反馈是,讲解比较容易理解,也比较耐心。这个过程让我认识到,一个学习助手真正重要的不是“答得多快”,而是能不能帮助使用者理解方法、建立信心。

下一步计划

  • 增加错题本,帮助整理容易出错的知识点;
  • 生成个性化学习报告,发现薄弱环节;
  • 适配更多终端,并逐步扩展到更多学科。

使用的工具

  • OpenWork / 百炼 CLI:qwen3.7-plus
  • 百炼能力 / 模型:项目开发
  • 其他:coze参与(多模态输入、OCR 题目识别、逻辑分析、文本生成、项目部署)

效果展示

核心界面截图:Image

项目链接(可选)

体验链接:https://code.coze.cn/web-sdk/7651237187912122377

视频:https://github.com/user-attachments/assets/52b007c9-dd95-4362-8701-470685958d18

踩坑记录(可选)

  1. 拍照识别容易看错数字:一些形状相近的数字会影响题目提取。我针对容易混淆的内容反复测试、调整识别方式,并保留文字输入作为备用方式。
  2. AI 有时只给答案,或者讲得太复杂:我用结构化提示词限定教师角色、任务和输出格式,要求它按步骤说明原因,并使用适合小学生的语言。
  3. 简单题和难题不能用同一种讲法:全部详细讲会显得啰嗦,全部简答又不利于理解,所以我加入难度判断,让不同题目进入不同的讲解分支。
  4. 模型回答可能不稳定:经过多轮测试,我继续优化提示词,并加入关键词和规则兜底,尽量减少异常中断和不符合教学逻辑的回答。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions