RAG 在智能题库中的应用:相似题检索和难度评估方案
RAG 在智能题库中的应用相似题检索和难度评估方案一、搜一元二次方程结果返回了 3000 道题学生挑了最难的开始做在线教育平台最大的资源浪费之一题库里 20 万道题学生却找不到适合自己的那一道。关键词搜索二次函数能返回 3000 条结果但这些题目按照录入时间排序而不是按难度排序导致学生要么做了太简单的题浪费时间要么做了太难的题打击信心直接退出。理想的智能题库需要解决两个问题一是找相似题给定一道题找到与其考察知识点和解题思路相似的题目二是评估难度这道题对当前学生来说有多难。前者用向量检索后者需要结合题目属性、学生历史表现和 IRT项目反应理论来建模。二、相似题检索与难度评估的系统架构核心设计是向量检索 难度预测的双路协同核心公式推荐得分 相似度_score × 0.6 难度适配_score × 0.4。相似度保证找对题难度适配保证适合学生。两者权重可以通过 A/B 测试调优。三、Python 实现相似题检索 IRT 难度模型import numpy as np from typing import List, Dict, Tuple, Optional from dataclasses import dataclass from scipy.special import expit # sigmoid 函数 dataclass class Question: 题库中的题目 question_id: str text: str subject: str knowledge_ids: List[str] question_type: str # choice, fill, proof difficulty_param: float # IRT b 参数难度 discrimination: float # IRT a 参数区分度 guess_param: float 0.25 # IRT c 参数猜测概率 embedding: Optional[np.ndarray] None dataclass class StudentAbility: 学生能力估计 student_id: str theta: float # IRT 能力值 θ theta_std: float # 能力值标准差不确定性 n_questions: int # 已作答题目数 class IRTDifficultyModel: 基于 IRT 的难度评估模型 staticmethod def probability_correct( theta: float, question: Question ) - float: 3PL IRT 模型P(correct|θ) a, b, c ( question.discrimination, question.difficulty_param, question.guess_param, ) return c (1 - c) * expit(1.702 * a * (theta - b)) staticmethod def information( theta: float, question: Question ) - float: 题目信息量用于选择最优下一题 q_val 1.702 * question.discrimination p IRTDifficultyModel.probability_correct( theta, question ) return (q_val ** 2 * (p - question.guess_param) ** 2 * (1 - p) / (p * (1 - question.guess_param))) staticmethod def update_ability( student: StudentAbility, question: Question, correct: bool, ) - StudentAbility: 贝叶斯更新学生能力值简化 EAP 估计 prob IRTDifficultyModel.probability_correct( student.theta, question ) # 似然函数 × 先验简化版 if correct: likelihood prob else: likelihood 1 - prob # 梯度方向更新 learning_rate 0.1 / (1 0.01 * student.n_questions) gradient correct - prob new_theta student.theta learning_rate * gradient return StudentAbility( student_idstudent.student_id, thetanew_theta, theta_stdstudent.theta_std * 0.95, # 随数据增加降低不确定性 n_questionsstudent.n_questions 1, ) class SmartQuestionBank: 智能题库 def __init__(self): self.questions: Dict[str, Question] {} # 倒排索引知识点 - 题目 ID 列表 self.knowledge_index: Dict[str, List[str]] {} # 学生能力模型 self.students: Dict[str, StudentAbility] {} def add_question(self, q: Question): 添加题目到题库 self.questions[q.question_id] q for kid in q.knowledge_ids: self.knowledge_index.setdefault(kid, []).append( q.question_id ) def search_similar( self, query_embedding: np.ndarray, top_k: int 10, min_similarity: float 0.85, ) - List[Tuple[Question, float]]: 向量检索相似题 results [] for q in self.questions.values(): if q.embedding is None: continue sim np.dot(query_embedding, q.embedding) / ( np.linalg.norm(query_embedding) * np.linalg.norm(q.embedding) 1e-8 ) if sim min_similarity: results.append((q, float(sim))) results.sort(keylambda x: x[1], reverseTrue) return results[:top_k] def recommend_by_ability( self, student_id: str, target_knowledge_id: str, top_k: int 5, strategy: str i_plus_1, ) - List[Tuple[Question, float]]: 基于学生能力推荐题目 student self.students.get(student_id) if student is None: # 新学生默认中等能力 student StudentAbility( student_idstudent_id, theta0.0, theta_std1.0, n_questions0, ) self.students[student_id] student # 获取该知识点的所有题目 candidate_ids self.knowledge_index.get( target_knowledge_id, [] ) if not candidate_ids: return [] scored [] for qid in candidate_ids: q self.questions.get(qid) if q is None: continue # 难度适配分 if strategy i_plus_1: # i1 策略推荐略高于当前能力的题 difficulty_match 1.0 - abs( q.difficulty_param - (student.theta 0.5) ) / 3.0 else: # 最近发展区策略 difficulty_match 1.0 - abs( q.difficulty_param - student.theta ) / 3.0 # 信息量加权 info IRTDifficultyModel.information( student.theta, q ) final_score ( 0.4 * difficulty_match 0.3 * info 0.3 * q.discrimination ) scored.append((q, final_score)) scored.sort(keylambda x: x[1], reverseTrue) return scored[:top_k] def hybrid_recommend( self, student_id: str, query_text: str, query_embedding: np.ndarray, top_k: int 10, ) - List[Tuple[Question, float, str]]: 混合推荐相似度 能力匹配 # 1. 向量检索相似题 similar self.search_similar( query_embedding, top_ktop_k * 3 ) # 2. 能力匹配过滤 student self.students.get(student_id) if student is None: # 新学生只按相似度排序 return [(q, sim, similarity) for q, sim in similar[:top_k]] # 3. 综合评分 scored [] for q, sim in similar: ability_score 1.0 - abs( q.difficulty_param - student.theta ) / 3.0 final 0.6 * sim 0.4 * ability_score scored.append((q, final, hybrid)) scored.sort(keylambda x: x[1], reverseTrue) return scored[:top_k]四、边界分析与 Trade-offs向量检索的精度 vs 效率全库做余弦相似度计算在 20 万量级还能撑约 200ms到 100 万题量就需要向量数据库。Milvus 和 Qdrant 都能满足但部署维护成本不低。小规模题库用 FAISS 的 IVF 索引内存中是性价比最高的方案。IRT 模型的数据需求3PL IRT 模型要求每个题目至少有 100-200 次作答数据才能稳定估计 a、b、c 参数。新题没有足够数据时可以用题目属性题型、字数、知识点难度做回归估计初始参数然后用在线学习逐步修正。i1 策略的风险持续推荐略高于能力的题目如果学生连续做错挫败感累积。实践中需要设置错误容忍窗口——连续 3 次错误后策略自动切换为复习模式推荐学生已经掌握的知识点题目来恢复信心。Embedding 模型的领域适配通用 Sentence-BERT 在数学题 Embedding 上效果一般相似度区分度不够。如果能用题库本身的数据做对比学习微调SimCSE 方法Top-10 召回率可以从 72% 提升到 91%。微调需要 5 万对正负样本成本可控。五、总结智能题库的两个核心技术是向量检索找相似题和IRT 模型评估难度。前者保证检索相关性后者保证难度适配性。两者融合的策略权重0.6 : 0.4需要通过实验确定没有通用最优值。工程上需要注意向量检索的索引构建和增量更新、IRT 参数的冷启动估计、以及难度推荐策略的容错机制。最终目标是让学生感觉每道题都刚刚好——既不会太简单觉得无聊也不会太难想要放弃。

相关新闻

Python 学习行为分析:学生作答数据的特征工程与模型训练

Python 学习行为分析:学生作答数据的特征工程与模型训练

Python 学习行为分析:学生作答数据的特征工程与模型训练 一、平台存了 500 万条做题记录,却不知道学生为什么会放弃 一个在线教育平台每天产生几十万条学生作答记录——什么时候开始做题、答了哪道题、花了多少秒、是对是错、错了之后有没有看解析。这些…

2026/7/23 11:51:23阅读更多 →
大数据运维:MapReduce 开发环境标准化搭建、Jar 打包与集群任务全流程运维

大数据运维:MapReduce 开发环境标准化搭建、Jar 打包与集群任务全流程运维

一、运维项目背景企业离线统计任务均基于 MapReduce 开发,运维核心工作:统一团队 IDEA Maven 标准化开发环境、规范 Jar 打包流程、编写集群任务提交自动化脚本、前置清理 HDFS 输出目录、排查版本 / 路径 / 权限类高频集群故障。本文基于 WordCount 基准…

2026/7/23 11:49:23阅读更多 →
道生物联 TK8620 无人机电台方案:全国产自主可控+30km 超远距 + 成本仅 LoRa 1/3

道生物联 TK8620 无人机电台方案:全国产自主可控+30km 超远距 + 成本仅 LoRa 1/3

面向工业巡检、FPV 穿越机、低空物流、固定翼航模及机器人远控等场景,道生物联基于全国产自研 TK8620 射频芯片,推出由 TKB-310 TurMass™ 无人机遥控发射板 TKM-300 TurMass™ 无人机遥控接收模块组成的无人机电台方案。 一、产品速览 1.TKB-310 TurM…

2026/7/23 11:49:23阅读更多 →
Tiva™ TM4C1294NCPDT电气特性与低功耗设计实战指南

Tiva™ TM4C1294NCPDT电气特性与低功耗设计实战指南

1. 项目概述:从数据手册到设计指南 对于任何一位嵌入式工程师来说,拿到一颗新的微控制器,第一件事往往不是急着写代码,而是翻开那本厚厚的 数据手册 ,直奔“电气特性”和“功耗”这两章。这就像你要了解一辆新车的性…

2026/7/23 17:20:44阅读更多 →
TMS320C6000 DSP EMIF异步接口与外部Flash存储器接口设计及编程实战

TMS320C6000 DSP EMIF异步接口与外部Flash存储器接口设计及编程实战

1. 项目概述与核心价值 在基于TMS320C6000系列DSP的嵌入式系统开发中,一个绕不开的“硬骨头”就是如何让DSP与外部Flash存储器高效、可靠地“对话”。你可能已经熟悉了DSP内核的强悍算力,但要让你的算法代码在板卡上电后能自动加载运行,或者需…

2026/7/23 17:20:44阅读更多 →
Claude Code周限额提升50%:AI编程助手高效使用指南

Claude Code周限额提升50%:AI编程助手高效使用指南

Claude Code 用户注意:官方刚刚宣布周限额提升 50%,这个福利将持续到 8 月 19 日。对于经常使用 Claude Code 进行编程辅助的开发者来说,这意味着一周内可以处理更多的代码任务、获得更长时间的 AI 编程支持。 这次限额提升直接关系到每个用…

2026/7/23 17:20:44阅读更多 →
一家药企的“跨界”逻辑:从化学分子到神经信号

一家药企的“跨界”逻辑:从化学分子到神经信号

2026年以来,山东科源制药股份有限公司(301281.SZ)在资本市场的关注度持续升温。触发这轮关注的,并非公司传统的原料药业务,而是一系列看似“跨界”的动作——参股脑机接口企业、间接切入人形机器人赛道、与高校共建联合…

2026/7/23 17:20:44阅读更多 →
百公里管网漏损分级定位实战方案2026

百公里管网漏损分级定位实战方案2026

百公里管网漏损分级定位实战方案2026面对几百公里供水管网漏点多、排查效率低的核心难题,行业验证有效的做法是采用"分级定位"策略——先通过DMA分区计量和在线压力监测锁定漏损区域,再利用固定式噪声记录仪预定位可疑管段,最后以声…

2026/7/23 17:20:44阅读更多 →
highgo用户crontab命令PAM权限限制问题

highgo用户crontab命令PAM权限限制问题

文章目录环境症状问题原因解决方案环境 系统平台:银河麒麟 (X86_64) 版本:4.5.11 症状 highgo用户执行crontab相关命令时,出现权限拦截错误,具体报错如下: [highgolocalhosts ~]$ crontab -…

2026/7/23 17:18:43阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →