尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于大语言模型的双维度题目附带内容相似度分析框架

基于大语言模型的双维度题目附带内容相似度分析框架 在教育测评和考试命题领域有一个长期被忽视、却非常折磨人的问题题目的相似度分析。过去我们谈题目相似度往往只盯着题干和选项的文本重叠用TF-IDF、编辑距离、Jaccard相似度这类方法去算。但在大规模、高利害的测评场景里真正的风险往往不在题目正文而在于“附带内容”Incidental Content——比如阅读理解的材料、情境题的背景信息、选项中的干扰项细节、图表说明、参考答案的表述方式。这类内容相似度分析难在哪里第一它不像题干那样精炼而是大段大段的材料语义密度高第二不同年份、不同科目的试卷之间材料可能换了说法但指向同一个知识点或同一个事实来源纯粹的字符匹配完全失效第三测评机构对题目复用、抄袭识别、版权合规的要求越来越高但人工审核大规模题目的附带内容成本高到几乎不可持续。这篇文章要讲的就是一个专门解决这个问题的技术方案一个面向大规模评估场景、基于大语言模型LLM的双维度题目附带内容相似度分析框架。我会从问题定义、框架思路、技术选型、流程拆解、代码实现思路到工程落地建议完整地拆给你看。读完你会明白为什么传统的相似度算法在这个场景下不够用双维度框架到底解决了什么本质问题以及如果你想在自己的题库系统里落地类似能力应该怎么设计。1. 这篇文章真正要解决的问题如果只看项目名称你可能会觉得这是一个“用LLM比较两段文字是否相似”的常规NLP任务。但如果真的做过教育测评领域的数据治理你会知道事情远没有这么简单。在大规模评估Large-Scale Assessments体系里一个题目往往由多个部分组成题干Stem、选项Options、材料/情境Stimulus/Material、参考答案与评分标准Rubric/Answer Key、元数据标签学科、知识点、难度、认知层次等。其中“附带内容”通常指除核心题干之外、服务于题目情境和作答任务的延伸材料。在阅读理解、完形填空、材料作文、数学应用题、科学探究题中附带内容甚至比题干本身更长、更有信息量。这就带来一个连锁问题题目是不是重复了往往不取决于题干而取决于附带内容是否实质相似。两个题目可能题干措辞完全不同但如果材料来源于同一篇科普文章、同一个社会事件数据表、同一份历史档案它们在高利害考试中就存在内容泄露或版权合规风险。传统做法有三个痛点词法层方法失效改写法、同义替换、语序调整后字符重叠率很低但语义上仍然是同一份材料。忽略语境单纯判断两段文本相似没有考虑“这道题在考什么”同样的材料在数学题和语文题里的风险权重完全不同。规模不可控一个大型题库有几万到几十万道题两两比较是亿级计算量人工抽检几乎靠运气。这篇文章要解决的核心问题就是如何借助LLM强大的语义理解能力构建一个可落地的、双维度的自动化相似度分析框架让附带内容层面的题目重复、抄袭、素材复用风险可以被系统性地检测出来而不只是靠人工抽查。直接说我的判断这个框架的本质不是“用LLM替换掉传统相似度算法”而是在保留传统方法可解释、可回溯优势的基础上增加一个能理解语义和语境的高维判断层。双维度不是炫技而是工程上必须做的折中。2. 双维度框架的核心概念与设计思路要理解这个框架先要搞清楚“双维度”到底指哪两个维度。虽然不同团队在具体实现上会有差异但从命名和实际需求来推理最合理的切分是维度一内容语义相似度Semantic Content Similarity维度二题目语境与功能相似度Contextual Functional Similarity2.1 内容语义相似度是什么这个维度解决的是“这两段附带内容在语义上是不是在说同一件事”。它不关心词面是否相同而是关心实体、事件、数据、观点、论证结构是否“实质相似”。例如甲卷材料“某城市2022年PM2.5年均浓度为35微克/立方米较2019年下降18%。”乙卷材料“该市2022年细颗粒物年平均浓度降至35μg/m³相比2019年降低了近两成。”字符重叠率很低但语义完全一致。传统TF-IDF可能给出0.3以下的相似度但LLM可以非常精准地判断出这是同一组数据的不同表达。2.2 题目语境与功能相似度是什么这个维度是很多AI方案最常忽略的。它回答的是“这两道题的附带内容即使相似它们在各自题目中承担的功能是否相同”举个例子两篇阅读材料都讲“全球变暖”但一篇是语文阅读理解要求学生赏析说明文的语言特点另一篇是地理综合题要求学生分析温室气体排放与温度变化的定量关系。材料可能有部分重叠但题目考察目标完全不同如果系统只按语义相似度报警会产生大量误报。引入语境维度后系统会同时比较学科与题型语文阅读题 vs 地理综合题认知层次识记、理解、应用、分析、评价、创造附带内容的功能定位是背景材料、干扰项还是有实际作答价值的素材考核知识点隐藏的知识点标签从这个维度出发系统可以区分“照搬材料”和“借用素材但变换考点”这两种完全不同风险等级的情况。2.3 为什么不能只用向量相似度很多快速方案会用Embedding向量做余弦相似度。这个方案在语义召回阶段非常好用但在高利害评估场景中直接作为最终判断依据远远不够。原因有四向量相似度无法给出可解释的证据系统报了“相似度0.85”但审题专家无法快速定位到底哪句话、哪个数据点相同导致复核成本依然很高。上下文敏感度不足两段文本各自围绕不同考点展开向量可能拉高相似度但实际风险很低。阈值难设定不同学科、不同题型的相似度分布差异极大单一阈值要么漏报要么误报。LLM的强项被浪费LLM不仅能判断相似还能抽取证据、归纳差异、给出风险分级这些能力在传统向量方案中根本用不上。所以双维度框架的真正设计逻辑是用向量化方法做第一轮召回再用LLM做精细化判断和证据抽取最后用题目语境信息做风险校准。3. 框架的整体架构与工作流程在给出代码之前我们需要先把框架的架构层次讲清楚。一个完整的双维度LLM相似度分析框架包含以下五个层次。3.1 数据接入层负责从题库系统中抽取题目及附带内容。常见的题库系统存储格式有JSON、XML、关系数据库表。对一个题目来说至少需要提取题目唯一标识Item ID学科Subject题型Item Type题干Stem附带内容Stimulus / Material / Long Passage选项Options参考答案/评分标准Answer Key / Rubric知识点标签Knowledge Points认知层次Cognitive Level这一层的关键是建立统一的题目内容模型Item Content Model后续所有分析都基于这个模型避免不同来源的题目结构差异干扰分析。3.2 召回层当题库规模达到十万级甚至百万级时对每一对新题目都做LLM推理是不现实的。召回层的目的是用高效的低成本方法先筛选出“候选相似对”把LLM推理的规模缩小几个数量级。召回层的常用选择BM25稀疏检索适合词汇重叠高的场景快速且可解释。Embedding向量检索适合同义改写多、词汇重叠低的场景。两路并行召回 合并去重工程上最稳妥保证召回率不塌。在建库时将附带内容切分为段落级或句子级单元分别向量化并存储。分析新题目时用同样的方式处理其附带内容然后到向量库中检索Top-K个候选。3.3 语义判断层维度一对于召回得到的候选对进入LLM语义判断阶段。这个阶段的Prompt设计是核心主要任务包括判断两段附带内容是否“实质相似”抽取相似的具体片段证据标注相似类型事实数据相同、事件相同、论述结构相同、观点相同、其余给出语义相似度评分例如0到5的离散分数这个阶段的输出是结构化JSON方便下游程序消费。3.4 语境校准层维度二这一步把题目的语境信息引入判断流程。基本做法是将两道题的学科、题型、知识点、认知层次、附带内容功能类型作为额外的上下文信息让LLM重新评估“语义相似”在考试语境中是否构成实际风险。例如LLM在维度一认为“内容高度相似”但语境校准后发现两道题分别考查“说明方法识别”和“数据读取”那么风险等级会从“高危”降到“中低危”。语境校准不仅降低误报率还能更好地支持人工复核排序让专家优先看“又相似、考点又重叠”的题目对。3.5 输出与人工复核层最终系统输出一个结构化报告包含相似度总分两个维度的细分得分相似证据片段风险等级高/中/低建议处理动作标记复用、送审、忽略人工复核阶段不能省略。LLM的判断再强也不能完全替代专家在高利害场景中的最终决定但系统的目标是让专家复核量下降80%以上。4. 环境准备与前置条件这个框架本身是技术方案不依赖某个特定商业产品。落地时我们可以选择两条技术路线路线A完全基于开源模型与向量库本地部署适合数据敏感、无法调用外部API的教育测评机构。LLM推荐使用ChatGLM、Qwen、Yi等开源中英文模型具体使用哪个以项目实际测试效果为准。向量库可以选择Milvus、Qdrant或Elasticsearch。路线B基于商业LLM API 云端向量检索适合快速原型验证、中小规模题库。API选择OpenAI、Claude、通义千问、文心一言等具体以后端能力为准。向量检索可以使用各云厂商自带的向量数据库。需要说明的是本文不到具体版本号因为LLM开源生态迭代太快今天推荐的版本下个月就可能被替换。文章重点演示通用设计你完全可以根据实际环境选择版本。如果是本地开发调试推荐环境如下Python 3.10 OpenAI / 兼容OpenAI协议的大模型API LangChain 或 LlamaIndex用于编排Prompt和调用链 Sentence-Transformers 或 云厂商Embedding API FAISS开发环境 / Milvus生产环境 JSON格式题库数据样本我建议先用Python写一个最小可运行的原型跑通“题目导入 → 向量召回 → LLM维度一判断 → LLM维度二校准 → 报告输出”的完整链路再考虑性能优化和分布式部署。5. 核心流程拆解与代码实现下面我们用一个接近真实的示例一步步拆解框架的实现。示例数据是虚构的但字段结构模拟了实际题库系统中的常见格式。5.1 题目数据模型// 文件路径data/item_example.json { item_id: R02023001, subject: science, item_type: multiple_choice, stem: 根据材料该城市2022年PM2.5年均浓度较2019年下降了多少, attached_content: 某城市生态环境局发布报告显示该市2022年PM2.5年均浓度为35微克/立方米较2019年的42微克/立方米下降了约16.7%。专家表示这主要得益于产业结构调整和新能源汽车推广。, options: [A. 约10%, B. 约17%, C. 约25%, D. 约33%], knowledge_points: [大气污染, 数据读取, 百分比计算], cognitive_level: apply }// 文件路径data/item_example_2.json { item_id: R02023002, subject: science, item_type: short_answer, stem: 读材料计算该城市2022年PM2.5年平均浓度相比2019年下降了百分之多少并说明下降的主要原因。, attached_content: 2022年某市细颗粒物PM2.5年平均浓度为35μg/m³这一数值较2019年的42μg/m³降低了约16.7%。当地政府称空气质量的改善是工业源治理与绿色交通体系建设共同作用的结果。, options: [], knowledge_points: [大气污染, 数据读取, 数学计算], cognitive_level: analysis }这两个题目就是典型的“附带内容实质相似、但题目形式与考点不完全相同”的例子。下面我们用代码实现双维度分析。5.2 维度一LLM语义相似度判断我们首先定义一个通用的LLM调用函数。这里使用的是兼容OpenAI协议的接口这样无论后端是哪个服务商代码结构都可以保持稳定。# 文件路径llm_analyzer.py import json from openai import OpenAI client OpenAI( api_keyyour-api-key, base_urlyour-llm-endpoint # 兼容OpenAI协议即可 ) def llm_chat_json(messages: list) - dict: response client.chat.completions.create( modelyour-model-name, messagesmessages, temperature0.1, response_format{type: json_object} ) return json.loads(response.choices[0].message.content) def analyze_semantic_similarity(content_a: str, content_b: str) - dict: prompt f 你是一位教育测评领域的题目相似度分析专家。请判断下面两段题目的附带内容是否在语义上实质相似。 附带内容A {content_a} 附带内容B {content_b} 请从以下几个角度判断 1. 是否包含相同的事实、数据、事件、观点或论证结构。 2. 是否是同一来源材料的不同改写版本。 3. 相似的具体片段有哪些。 请输出JSON格式如下 {{ is_substantially_similar: true/false, similarity_score: 0-5之间的整数, similar_fragments: [A中的片段, B中的片段], similarity_type: same_data | same_event | same_argument | same_source | none, reason: 判断理由 }} messages [ {role: system, content: 你是严谨的教育测评内容安全专家只输出结构化JSON。}, {role: user, content: prompt} ] return llm_chat_json(messages)这段代码的核心是Prompt设计。关键在于“实质相似”这个定义要明确否则LLM会给出模棱两可的答案。实践建议是在Prompt中显式加入“判断标准”和“反例”让输出更稳定。5.3 维度二题目语境与功能校准维度二的实现不是重新做一次相似度判断而是把题目层面的结构化信息作为“校准信号”让LLM判断相似内容在实际评测中的风险级别。# 文件路径context_calibrator.py from llm_analyzer import llm_chat_json def calibrate_risk_with_context(item_a: dict, item_b: dict, semantic_result: dict) - dict: prompt f 你正在参与大规模测评题库的内容安全审核。两套题目已经通过语义分析被判定为附带内容相似。 请你结合题目语境信息最终评估该相似情况的风险等级。 【题目A】 学科{item_a[subject]} 题型{item_a[item_type]} 知识点{, .join(item_a[knowledge_points])} 认知层次{item_a[cognitive_level]} 题干{item_a[stem]} 【题目B】 学科{item_b[subject]} 题型{item_b[item_type]} 知识点{, .join(item_b[knowledge_points])} 认知层次{item_b[cognitive_level]} 题干{item_b[stem]} 【语义分析结果】 相似性类型{semantic_result[similarity_type]} 相似度得分0-5{semantic_result[similarity_score]} 相似片段{semantic_result[similar_fragments]} 请回答以下问题 1. 两道题虽然在附带内容上相似但它们的学科、知识点、认知层次是否相同 2. 相似的附带内容在各自题目中承担的考察功能是否一致 3. 综合考虑下该相似情况在“高利害考试题目复用风险”上属于什么等级 输出JSON {{ same_subject: true/false, same_knowledge_points: true/false, same_cognitive_level: true/false, content_function_overlap: high | medium | low, risk_level: high | medium | low, suggestion: 建议采取的动作例如标记复用、送人工复核、可忽略 }} messages [ {role: system, content: 你是高利害测评中题目内容安全审核专家。}, {role: user, content: prompt} ] return llm_chat_json(messages)5.4 召回层用向量检索缩小比较范围在实际题库中不可能对每一对题目都调用LLM。所以召回层是必须的。我们使用Sentence-Transformers生成Embedding然后用FAISS做最近邻检索。# 文件路径vector_recall.py import numpy as np import faiss from sentence_transformers import SentenceTransformer # 加载Embedding模型实际项目中请根据数据情况选择 encoder SentenceTransformer(BAAI/bge-large-zh-v1.5) def build_vector_index(contents: list): embeddings encoder.encode(contents, normalize_embeddingsTrue) dim embeddings.shape[1] index faiss.IndexFlatIP(dim) index.add(embeddings.astype(float32)) return index def recall_candidates(query_content: str, index, item_list: list, top_k: int 10): query_vec encoder.encode([query_content], normalize_embeddingsTrue).astype(float32) scores, indices index.search(query_vec, top_k) candidates [] for score, idx in zip(scores[0], indices[0]): candidates.append({ item: item_list[idx], retrieval_score: float(score) }) return candidates这一步需要注意的是Embedding模型的领域适配性。通用Embedding模型对教育测评领域的专有名词和表达方式可能不够灵敏。建议在项目中期用一批专家标注的相似题对做微调或领域适配。如果资源不允许至少要做多路召回不要把宝都押在一个Embedding模型上。5.5 主流程编排最后把召回、维度一、维度二串成一个完整的分析流程。# 文件路径main_pipeline.py from vector_recall import build_vector_index, recall_candidates from llm_analyzer import analyze_semantic_similarity from context_calibrator import calibrate_risk_with_context def analyze_new_item(new_item: dict, item_list: list, index): 输入新题目返回所有相似候选的风险评估结果。 query_content new_item[attached_content] candidates recall_candidates(query_content, index, item_list, top_k5) results [] for cand in candidates: old_item cand[item] # 召回分数过低的直接跳过节省LLM调用 if cand[retrieval_score] 0.6: continue semantic_result analyze_semantic_similarity( new_item[attached_content], old_item[attached_content] ) # 维度一已经判定不相似就不必进维度二 if not semantic_result[is_substantially_similar]: continue risk_result calibrate_risk_with_context( new_item, old_item, semantic_result ) results.append({ new_item_id: new_item[item_id], candidate_item_id: old_item[item_id], retrieval_score: cand[retrieval_score], semantic_analysis: semantic_result, risk_assessment: risk_result }) return results5.6 运行与验证在开发环境运行可以准备一个包含几十道题的小样本库然后依次模拟新题入库观察输出结果。python main_pipeline.py预期输出是对每个新题输出候选列表、语义分析结果和风险等级。一个合格的输出应该能识别出示例中的两道PM2.5题目的相似关系并给出“高危或中高危”的判断。如果运行失败优先排查以下环节API密钥和Endpoint是否配置正确。模型是否支持response_format参数如果不支持需要在Prompt里明确要求“只输出JSON”并自己做清理。FAISS索引的向量维度是否一致。6. 效果评估方法论如果说代码实现是框架的骨架那么评估方法就是框架的神经系统。没有合理评估你根本无法回答“这个框架到底比传统方法好在哪里”这个关键问题。建议从四个层面评估6.1 召回率与误报率构造一个评测集包含三类样本明确相似样本、明确不相似样本、边界模糊样本。评测集可以来源于专家标注的历史抽检记录也可以由命题专家模拟编写。核心指标是高相似样本的召回率、低相似样本的误报率、整体准确率。注意这里的“准确率”不是LLM判断文本相似准不准而是最终风险分级准不准所以必须有人工复核作为ground truth。6.2 人工复核效率对比在相同规模题库上分别用“纯人工抽检”和“本框架辅助审核”统计专家完成一轮审查所需的时间。通常引入自动化框架后专家的核心工作从“通读材料找相似”变成“复核系统标记的证据片段”单位时间处理量会成倍提升。这个数据是决定项目是否能在机构内推广的关键。6.3 维度消融实验为了验证“双维度”设计是否真的有必要可以做消融实验只跑维度一、只跑维度二、双维度全开分别评估误报率和漏报率。从实际经验来看只跑维度一会在跨学科同素材场景产生大量误报只跑维度二会因为缺乏对文本实质相似性的判断而产生大量漏报。双维度全开的效果不是简单叠加而是更合理的风险排序。6.4 可解释性评估让命题专家审查系统输出的相似证据片段统计这些证据是否准确覆盖了真正的相似点。这个维度很多AI项目会忽略但在教育测评场景中极其重要因为专家如果对系统的证据不信任整套系统就会被弃用。7. 常见问题与排查思路问题现象可能原因排查方式解决方案LLM输出的JSON无法解析模型不支持强制JSON输出检查模型的API文档看是否支持response_format参数在Prompt中强化“只输出JSON”并对输出做正则清洗或换用支持JSON模式的模型向量召回的候选题目与目标完全不相关Embedding模型领域适配不足抽查候选与目标句的Embedding相似度分布更换更大的中英文Embedding模型或使用BM25混合召回提升词汇重叠场景的召回率维度一判断“不相似”但专家认为显然相似Prompt中“实质相似”的定义不够明确查看LLM输出的reason字段分析其判断依据在Prompt中加入正反例并要求LLM先抽取相似片段再下结论维度二把所有相似都判为“高危”语境校准Prompt没有给足风险判定标准检查输出的suggestion字段是否流于模板化在Prompt中细化风险等级定义加入“功能是否重叠”“是否跨学科”“认知层次是否一致”等维度的判定权重召回阶段过滤掉真相似样本检索阈值设置过高或Embedding模型没有区分同义改写统计召回分数分布分析被过滤样本的检索得分降低阈值把候选集扩大交给LLM做精细判断或增加多路召回API调用成本过高候选集过大LLM调用频繁查看日志中每个候选的召回分数设置召回分数下限对高置信的“不相似”样本直接过滤不进入LLM环节8. 最佳实践与工程建议把这样一个框架从论文概念落地到生产系统有五个工程建议值得重视。第一将题库内容建模标准化。很多题库系统的数据模型是“长字段大文本”附带内容和题干混在一个字段里这会给后续所有分析带来巨大麻烦。建议先建立统一的题目内容模型明确区分题干、选项、材料、解析、元数据并在入库时完成拆分和清洗。第二设计分层审核机制。不要让LLM做最终决策者。合理流程是系统输出风险分级和证据片段人工复核专家做最终确认。对“低危”样本可以直接自动通过对“高危”样本必须人工复核对“中危”样本可以抽样复核。这套机制能在效率与安全之间取得平衡。第三Prompt版本管理。双维度框架的精度高度依赖Prompt质量而Prompt的调试往往是迭代式的。建议把Prompt作为代码资产进行版本管理每次调整都要在同一评测集上跑回归测试避免“调好了A问题、破坏了B问题”。第四成本控制策略。LLM推理成本是大规模评测场景绕不开的问题。建议在召回层就把比较对数量控制在每日几千对以内并对不同风险等级的题目配置不同的LLM调用策略。例如小学低年级题的附带内容通常较短可以使用更轻量级的模型高利害选拔性考试题目则使用更强模型做精细化分析。第五安全与合规边界。题库数据往往涉及版权和保密要求尤其是尚未公开施测的题目。在技术方案落地时必须确认数据存储、模型调用、日志记录是否符合机构的数据安全规范。能本地部署的尽量本地部署必须调用云API时要做好数据脱敏并签署数据处理协议。任何自动化分析结果都不能直接替代法务或命题委员会的最终判断。另外这里要特别提醒教育测评场景中“相似度分析”的目的是内容安全管理和命题质量保障不能用于规避版权授权、过度清洗题目素材或其他超出合规边界的用途。系统的输出永远只是辅助决策工具而不是删除、修改、复用题目内容的自动执行依据。9. 总结与后续学习方向双维度LLM框架解决的核心矛盾是“大规模题库中附带内容相似度分析”对深层语义理解的需求与传统NLP方法在语义、语境、可解释性上的能力瓶颈之间的矛盾。维度一保障了“语义上是否实质相似”的判断力维度二保障了“在具体评测语境中是否构成风险”的校准能力两者组合兼顾了效果、成本与可解释性。如果你想继续深入建议按以下路径展开先建一个几百道题的小型评测集把Promp设计、召回阈值、风险分级标准定下来。再逐步扩大题库规模重点观察召回层的性能瓶颈和LLM调用成本。接着做一次人工复核效率对比实验用数据说服团队采纳这套方法。最后再考虑要不要引入更强的语义模型、多模态支持图片型附带内容或更细粒度的知识图谱约束。这套框架的价值不在于它使用了多前沿的LLM技术而在于它把一个原本依赖专家经验、耗时巨大的内容安全审核流程变成了一个可量化、可回溯、可持续优化的自动化系统。对正在做题库系统、在线考试平台或教育内容治理的同学来说这个方向值得长期跟踪。
返回列表