qti logkit
当前,用于标记XML中的评估,测试和单个问题的最广泛使用的标准是IMS问题与测试互操作性(QTI)。 IMS是与电子学习标准相关的组织(请参阅参考资料中的链接),其标准范围从元数据到传输学习者信息。 QTI标准化了如何在XML中标记问题,将其安排到测试和评估中,添加元数据以及将所有内容打包在ZIP文件中的方法。
QTI XML不仅描述问题,评估和测试的静态部分(文本,布局,顺序等),而且描述其动态行为,例如,当用户给出错误答案时的行为方式,何时提供某些反馈,以及如何计算分数。 您可以按照自己的意愿使此过程变得复杂:QTI为您提供编程工具以使这一切成为现实。
不幸的是,这一切如何运作有点令人困惑。 该文档围绕定义标准而不是对其进行解释 。 一些例子都伴随着一个有用的文档(IMS问题和测试互操作性实施指南 -见相关信息中的链接),但是这仍然没有提供有关内部发生的事情的细节。
本文探讨了QTI基本构建模块:评估项目中的响应和结果处理。 您如何评价用户的响应,以及在评分方面如何处理?
如果您不熟悉QTI,本节将简要介绍评估项目。
评估项目 (简称项目 )是QTI的基本组成部分。 一个项目可以由任意复杂的文本组合(带有标记),多个不同类型的问题,辅助信息面板,多媒体对象等组成。 当答案被认为是正确的,得分和反馈时,它也定义了自己的结果和响应处理。
实际上,QTI评估项目通常并不复杂。 我见过的大多数只包含一个问题。 清单1显示了QTI评估项目的剖析。
<assessmentItem xmlns="http://www.imsglobal.org/xsd/imsqti_v2p1" ...>
<responseDeclaration ...>
<!-- Information about the answers to the questions inside -->
</responseDeclaration>
<outcomeDeclaration ...>
<!-- Internal variables for computing scores, controlling feedback, etc. -->
</outcomeDeclaration>
<itemBody ...>
<!-- Text and the interactive parts (questions) -->
</itemBody>
<responseProcessing ...>
<!-- How to handle the user's response -->
</responseProcessing>
<modalFeedback ...>
<!-- Optional feedback messages to the user -->
</modalFeedback>
</assessmentItem>
这是标记的细分:
<responseDeclaration>
包含有关问题的答案(响应)的信息:何时正确,以及(可选)如何评分? <itemBody>
中的每个单独问题都需要一个<responseDeclaration>
<itemBody>
。 <outcomeDeclaration>
定义一个内部变量,例如,用于将分数返回到环境或用于控制对用户的反馈。 <itemBody>
元素包含此项目的文本,标记和问题。 标记与XHTML具有显着的相似性,但请注意:尽管您看到了诸如<p>
和<ul>
类的熟悉的元素,但是所有内容都在QTI命名空间( http://www.imsglobal.org/xsd/imsqti_v2p1
)中,而不是在XHTML名称空间。 该标准并未规定您必须使用浏览器进行渲染,这为解释留下了很大的空间。 因此,在不同的QTI处理引擎之间交换内容时,一致的渲染是一个主要问题。 <responseProcessing>
部分描述了学生完成项目后要执行的操作。 它的内容是一种简单的编程语言,您可以在其中执行计算,设置<outcomeDeclaration>
变量等。 <modalFeedback>
定义项目对学生的反馈(例如,答案正确时显示“ Well done”)。 本文与<responseDeclaration>
, <outcomeDeclaration>
和<responseProcessing>
部分有关。
项目中的<itemBody>
元素可以包含与用户的零次或多次交互。 这些交互大多数都是典型的问题(例如,多项选择,订单元素,填空)。 您还可以添加诸如“上传文档”,“绘制图片”和“开始电影”之类的交互。
清单2提供了一个多项选择题的示例。
<itemBody>
<choiceInteraction responseIdentifier="RESPONSE" shuffle="true" maxChoices="1">
<prompt>What is the top color of the Dutch flag?</prompt>
<simpleChoice identifier="A">Red</simpleChoice>
<simpleChoice >="B">Orange</simpleChoice>
<simpleChoice identifier="C">Black</simpleChoice>
<simpleChoice identifier="D">White</simpleChoice>
</choiceInteraction>
</itemBody>
清单3提供了一个订购问题的示例。
<itemBody>
<orderInteraction responseIdentifier="RESPONSE" shuffle="false">
<prompt>Order these cities from north to south:</prompt>
<simpleChoice identifier="A">Tripoli</simpleChoice>
<simpleChoice identifier="B">Stockholm</simpleChoice>
<simpleChoice identifier="C">Paris</simpleChoice>
</orderInteraction>
</itemBody>
QTI v2.1定义了20种交互类型。 您可以在《 IMS问题与测试互操作性实施指南》中找到全套示例。 您确定要使用的类型,但请注意,并非所有QTI处理引擎都支持所有交互类型。
如您在示例中所见,交互具有一个responseIdentifier
属性,该属性将交互绑定到具有相同标识符的<responseDeclaration>
。 这是结果和响应处理的链接,我稍后再讲。
理解QTI的响应和结果处理的重要前提是了解其数据模型以及其复杂性背后的原因。
当用户完成QTI项目后,需要检查答案。 为此,答案表示为数据。 有时,数据很简单:单选题单选题只返回给定答案的标识符,而数字滑块交互则返回一个数字。 但是,大多数交互类型更为复杂。 例如:
通过绑定到交互的<responseDeclaration>
可以确定答案是对还是错。 这意味着它必须具有用于交互的适当数据类型。 例如, 清单4提供了<positionObjectInteraction>
的声明,这是一个问题类型,您必须在其中将对象放置在图形(例如,地图)上。 它的数据类型是一组点。
<responseDeclaration identifier="RESPONSE" baseType="point" cardinality="multiple">
<correctResponse>
<value>118 184</value>
<value>150 235</value>
<value>96 114</value>
</correctResponse>
</responseDeclaration>
QTI数据类型由<responseDeclaration>
和<outcomeDeclaration>
元素上的baseType
和cardinality
属性定义:
baseType
属性定义基本数据类型:
boolean
directedPair
duration
file
float
identifier
integer
pair
point
string
uri
cardinality
属性定义baseType
元素的数量以及该集合是否有序。 值是:
multiple
ordered
record
(本文未讨论的一种特殊的,相当复杂的类型) single
响应和结果处理负责当用户完成项目后发生的事情。 QTI处理器必须执行诸如确定答案是否正确,计算分数以及提供反馈之类的任务。 <responseDeclaration>
, <outcomeDeclaration>
和<responseProcessing>
部分均在此过程中起作用。
<responseDeclaration>
元素的标识符始终将其绑定到项目主体中的交互。 清单5提供了一个示例。
<responseDeclaration identifier="QUESTION1" cardinality="single"
baseType="identifier">
<correctResponse>
<value>B</value>
</correctResponse>
</responseDeclaration>
<itemBody>
<choiceInteraction responseIdentifier="QUESTION1" shuffle="false" maxChoices="1">
<prompt>Is a goldfish a mammal?</prompt>
<simpleChoice identifier="A">Yes</simpleChoice>
<simpleChoice identifier="B">No</simpleChoice>
</choiceInteraction>
</itemBody>
<responseDeclaration>
不是一个简单的变量:最好将其视为面向对象的对象。 该对象具有三个“方法”,您可以在该项目的<responseProcessing>
部分中进行计算:
清单6提供了<responseDeclaration>
的示例,其中根据给出的答案计算分数。
<responseDeclaration identifier="QUESTION1" cardinality="multiple"
baseType="identifier">
<correctResponse>
<value>A</value>
<value>D</value>
</correctResponse>
<mapping defaultValue="0" lowerBound="0" upperBound="1">
<mapEntry mapKey="A" mappedValue="0.5"/>
<mapEntry mapKey="B" mappedValue="-0.5"/>
<mapEntry mapKey="C" mappedValue="-0.5"/>
<mapEntry mapKey="D" mappedValue="0.5"/>
</mapping>
</responseDeclaration>
<itemBody>
<choiceInteraction responseIdentifier="QUESTION1" shuffle="false" maxChoices="0">
<prompt>Which are colors?</prompt>
<simpleChoice identifier="A">Red</simpleChoice>
<simpleChoice identifier="B">Small</simpleChoice>
<simpleChoice identifier="C">Soft</simpleChoice>
<simpleChoice identifier="D">Purple</simpleChoice>
</choiceInteraction>
</itemBody>
因此,如果学习者提供了答案A(红色),B(小)和D(紫色),则分数将根据<mapping>
计算为(A)0.5 +(B)-0.5 +(D) 0.5 = 0.5。
您可能想知道为什么此过程都在<responseDeclaration>
内部完成。 还可以在<responseProcessing>
部分中确定答案是否正确并计算分数。 当您也可以计算正确答案和分数时,似乎并不需要直接声明它们(反之亦然)。
其背后的原因是QTI还希望该标准适用于简单的情况,例如,渲染引擎仅忽略响应处理,而仅查看定义的正确响应。 相同的推理适用于预定义的响应处理模板 。
<outcomeDeclaration>
是变量的QTI等效项。 清单7提供了一个示例。
<outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float">
<defaultValue>
<value baseType="float">0.5</value>
</defaultValue>
</outcomeDeclaration>
该标记定义了一个名为SCORE
的变量,其中包含一个float
,默认值为0.5。 提供默认值是可选的。 如果不这样做,则将数字变量初始化为0.0,将非数字变量初始化为NULL
。
注意: SCORE
是保留名称。 您可以使用它来提供数字分数,以表示候选人对环境的整体表现。
您可以到添加更多的情报<outcomeDeclaration>
通过提供一个叫做结构<matchTable>
或<interpolationTable>
我还没有看到它们的使用,并且大多数渲染引擎可能不支持它们,因此在此不做解释。
项目的<responseProcessing>
部分包含有关渲染引擎的指令,该指令关于用户提供答案后的操作。 指令可以采用两种格式:
让我们首先检查响应处理脚本。 清单8提供了这样一个脚本的示例。
<responseDeclaration identifier="RESPONSE_01" cardinality="single"
baseType="string">
<correctResponse>
<value>white</value>
</correctResponse>
</responseDeclaration>
<responseDeclaration identifier="RESPONSE_02" cardinality="single"
baseType="string">
<correctResponse>
<value>green</value>
</correctResponse>
</responseDeclaration>
<outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float"/>
<itemBody>
<p>Fill in the right colors:</p>
<p>Snow is
<textEntryInteraction responseIdentifier="RESPONSE_01" expectedLength="5"/>
and grass is
<textEntryInteraction responseIdentifier="RESPONSE_02" expectedLength="5"/>.
</p>
</itemBody>
<responseProcessing>
<responseCondition>
<responseIf>
<and>
<match>
<variable identifier="RESPONSE_01"/>
<correct identifier="RESPONSE_01"/>
</match>
<match>
<variable identifier="RESPONSE_02"/>
<correct identifier="RESPONSE_02"/>
</match>
</and>
<setOutcomeValue identifier="SCORE">
<baseValue baseType="integer">1.0</baseValue>
</setOutcomeValue>
</responseIf>
<responseElse>
<setOutcomeValue identifier="SCORE">
<baseValue baseType="integer">0.0</baseValue>
</setOutcomeValue>
</responseElse>
</responseCondition>
</responseProcessing>
该响应处理检查学习者对定义的正确(最佳)响应的两个响应的值。 这是在<match>
元素中完成的。 两者都必须正确,这由周围的<and>
元素处理。 如果是,则将SCORE <outcomeDeclaration>
设置为1.0; SCORE <outcomeDeclaration>
,将其设置为1.0。 否则,将其设置为0.0。 清单9提供了另一个稍微复杂一些的示例。
<responseDeclaration identifier="RESPONSE" cardinality="multiple"
baseType="identifier">
<correctResponse>
<value>A</value>
<value>C</value>
</correctResponse>
<mapping lowerBound="0.0" upperBound="1.0" defaultValue="0.0">
<mapEntry mapKey="A" mappedValue="0.5"/>
<mapEntry mapKey="B" mappedValue="-0.25"/>
<mapEntry mapKey="C" mappedValue="0.5"/>
<mapEntry mapKey="D" mappedValue="-0.25"/>
</mapping>
</responseDeclaration>
<outcomeDeclaration identifier="SCORE" cardinality="single" baseType="float"/>
<outcomeDeclaration identifier="FEEDBACK" cardinality="single" baseType="identifier"/>
<outcomeDeclaration identifier="FEEDBACK_TRESHOLD" cardinality="single"
baseType="float">
<defaultValue>
<value baseType="float">0.75</value>
</defaultValue>
</outcomeDeclaration>
<itemBody>
<choiceInteraction responseIdentifier="RESPONSE" shuffle="true" maxChoices="0">
<prompt>Which countries are south of the USA?</prompt>
<simpleChoice identifier="A">Mexico</simpleChoice>
<simpleChoice identifier="B">Canada</simpleChoice>
<simpleChoice identifier="C">Brazil</simpleChoice>
<simpleChoice identifier="D">Norway</simpleChoice>
</choiceInteraction>
</itemBody>
<responseProcessing>
<responseCondition>
<responseIf>
<isNull>
<variable identifier="RESPONSE"/>
</isNull>
<setOutcomeValue identifier="SCORE">
<baseValue baseType="float">0.0</baseValue>
</setOutcomeValue>
<setOutcomeValue identifier="FEEDBACK">
<baseValue baseType="identifier">FAILURE</baseValue>
</setOutcomeValue>
</responseIf>
<responseElse>
<setOutcomeValue identifier="SCORE">
<mapResponse identifier="RESPONSE"/>
</setOutcomeValue>
<responseCondition>
<responseIf>
<gte>
<variable identifier="SCORE"/>
<variable identifier="FEEDBACK_TRESHOLD"/>
</gte>
<setOutcomeValue identifier="FEEDBACK">
<baseValue baseType="identifier">ANSWER_CORRECT</baseValue>
</setOutcomeValue>
</responseIf>
<responseElse>
<setOutcomeValue identifier="FEEDBACK">
<baseValue baseType="identifier">FAILURE</baseValue>
</setOutcomeValue>
</responseElse>
</responseCondition>
</responseElse>
</responseCondition>
</responseProcessing>
除了设置分数外,此响应处理还将名为FEEDBACK
的<outcomeDeclaration>
设置为FAILURE
或ANSWER_CORRECT
。 您可以使用此声明向用户提供正确的反馈。
响应处理遵循以下步骤:
<responseDeclaration>
值为NULL
(由<isNull>
元素检查),并且SCORE
和FEEDBACK
设置为正确的值。 SCORE
设置为<responseDeclaration
的<mapping>
提供的值(使用<mapResponse>
元素)。 SCORE
与FEEDBACK_TRESHOLD <outcomeDeclaration>
(在<gte>
[大于或等于]元素中)设置的固定值进行比较,并相应地设置FEEDBACK
。 除了您自己的声明之外,您还可以在响应处理中使用一些预定义的变量:
duration
。 用户花在回答问题上的时间(以秒为单位)。 例如,当用户花费太长时间无法提供答案时,可使用此变量降低分数。 nunAttempts
和completionStatus
。 这些变量在有关自适应处理的部分中进行处理 。 如果您熟悉编程或脚本编制,则编写响应处理并不复杂。 您可以在QTI文档, IMS问题和测试互操作性评估测试,部分和项目信息模型中找到该语言的完整定义( 有关链接,请参阅参考资料 )。 如您所见,由于XML的原因,它非常冗长,您必须编写大量代码才能产生有意义的动作。 不幸的是,这是标准。
正如我已经在Response声明中提到的那样,QTI标准具有用于简单响应处理的内置选项。 例如,通过在<responseDeclaration>
使用正确的响应,它可以根本不执行任何脚本化响应处理就确定给定答案是对还是错。 这种方法允许简单的内容和随附的渲染引擎,而不会违反标准。
另一个简化功能是响应处理模板。 QTI预定义了三个用于基本响应处理的模板。 模板由固定的URI标识,例如:
<responseProcessing
template="http://www.imsglobal.org/question/qti_v2p0/rptemplates/match_correct"/>
实际的脚本已耦合到这些URI。 渲染引擎可以按照脚本的方式处理它们。 为了帮助渲染引擎找到正确的模板,您可以提供以下位置:
<responseProcessing template="..." templateLocation="/rptemplates/match_correct.xml/>
您可以在以下情况下使用预定义的模板:
<responseDeclaration>
称为RESPONSE
float
SCORE
的<outcomeDeclaration>
预定义的模板是:
Match_Correct
:如果答案不正确或错误,则将分数设置为0.0,如果正确或错误,则将分数设置为1.0。 URI是: http://www.imsglobal.org/question/qti_v2p0/rptemplates/match_correct
Map_Response
:如果没有答案,则将分数设置为0.0;否则,将分数设置为0.0。 否则,请使用RESPONSE <responseDeclaration>
的映射。 URI是: http://www.imsglobal.org/question/qti_v2p1/rptemplates/map_response
Map_Response_Point
:这与Map_Response
相同,但适用于图形交互类型。 它使用区域映射而不是标识符映射。 URI是: http://www.imsglobal.org/question/qti_v2p1/rptemplates/map_response_point
您可以使用响应处理脚本语言表达所有预定义的模板。 如果下载QTI示例,则包含模板脚本。 例如, 清单10显示了Map_Response
的代码。
<responseProcessing>
<responseCondition>
<responseIf>
<isNull>
<variable identifier="RESPONSE"/>
</isNull>
<setOutcomeValue identifier="SCORE">
<baseValue baseType="integer">0</baseValue>
</setOutcomeValue>
</responseIf>
<responseElse>
<setOutcomeValue identifier="SCORE">
<mapResponse identifier="RESPONSE"/>
</setOutcomeValue>
</responseElse>
</responseCondition>
</responseProcessing>
您不必保留这些QTI预定义模板。 在内容生产者和渲染引擎构建者紧密耦合的情况下,没有什么可以阻止您定义自己的内容。
至此,我已经讨论了QTI项目的响应处理,例如与问题的一次性学习者互动:提出问题,给出答案,计算分数。 QTI将此考试格式称为非自适应项目。 在另一种情况下,您想教给学习者一些东西,并使用问题作为这样做的机制。 在这种情况下,学习者通常有一个以上的机会回答问题。 可能会给出更详细的反馈(“此特定答案有误,”“我为您提供提示:...”),您可以根据尝试次数来调整分数。
对于这种情况,QTI定义了自适应项。 通过将根元素上的adaptive
属性设置为true()
来识别自适应项,如清单11所示 。
<assessmentItem adaptive="true" … >
…
</assessmentItem>
在自适应项目中,默认情况下,提供答案后,与学习者的交互不再结束。 相反,它可以通过两种方式结束:
completionStatus
可变completionStatus
有类型的四个可能的值identifier
: completed
, incomplete
, not_attempted
,和unknown
。 如果将其设置为completed
,则交互将结束。
另一个适用于自适应项的内置变量是numAttempts
。 如您所料,此变量仅计算用户回答该项目的尝试次数。 例如, 清单12显示了一个响应处理片段,该片段在用户进行了四次以上尝试后结束了交互。
<responseIf>
<gt>
<variable identifier="numAttempts"/>
<baseValue baseType="integer">4</baseValue>
</gt>
<setOutcomeValue identifier="completionStatus">
<baseValue baseType="identifier">completed</baseValue>
</setOutcomeValue>
</responseIf>
本文探讨了QTI渲染引擎执行(或应该执行:好的渲染引擎很少见)响应和结果处理的方式-在学习者回答问题后应该发生什么。 在大多数情况下,会设置分数,但您也可以将其用于其他目的。
如果您不想或不必实施完整的QTI响应和响应处理,则仍可以停留在标准范围内,而不必再比较给定的正确响应或使用内置的响应处理模板。
翻译自: https://www.ibm.com/developerworks/xml/library/x-qti/index.html
qti logkit