第3章 开发产品售后规范与服务指南证据助手

工作阶段: 从资料治理到证据检索、回答路由与验收。
公共核心项目: 开发一个可离线运行的“产品售后规范与服务指南证据助手”。它回答客户账号安全、产品基础排查、标准配件换货、售后申请和服务时间等工作问题;找不到依据时拒答,资料互相矛盾时并列冲突,不靠模型记忆补写业务事实。
核心技术: 有效期资料过滤、中文字符2/3-gram、TF-IDF向量、余弦相似度、关键词基线、语义检索边界、证据约束回答、引用集合校验、拒答与冲突路由。
输入输出链: 9个模拟资料块 → 只索引8个当前有效资料 → 8条独立校准题选参 → 提问 → 两种检索器之一 → answer/refuse/conflict路由 → 引用校验 → 12条冻结问答验收。
应用中的AI: 参考版用可解释的字符TF-IDF向量检索完成“按字符模式找候选资料”;回答端故意采用抽取式证据回答器。可选语言模型只能改写已经命中的证据,并必须通过引用约束。
协助开发的AI: 帮助解释向量计算、阅读失败记录、生成限定范围的故障测试和审查单次代码修改;学生运行程序、检查差异并保留固定测试独立性。
人的责任: 登记资料状态,确认现实中的版本和适用范围,判断引用是否真正支持结论,解释冲突并决定是否采用。
主要交付物: 可运行工程、资料卡与系统卡、关键词基线、TF-IDF检索器、回答适配器、独立校准集、冻结问答集、单元测试、机器可读报告和发布结论。
明确边界: 全部资料是教材模拟材料;参考结果为not_ready_for_use,只能课堂观察,不能当作本单位真实规章或自动对外服务。
跨章关系: 读取第1章任务与第2章数据包,为第4章事实约束、第10章工作流和第11章验收提供证据模块。

学习目标

完成本章学习后,你将能够:

  1. 把企业服务问答拆成资料治理、检索、回答路由、引用核验和验收五个环节;
  2. 说明字符n-gram、TF-IDF和余弦相似度怎样把文本转成可比较的数值表示,并区分字符相似检索与文本嵌入式语义检索;
  3. 在同一冻结题集上比较关键词基线与向量检索,而不是只展示一个“看起来正确”的回答;
  4. 运行完整工程,观察正常、同义改写、边界、陌生、冲突、过期与故障输入;
  5. 依据真实的11/12结果作出“不具备发布条件”的判断,并提出下一轮校准计划。

项目导入

售后服务人员经常需要核对“标准配件在签收后多少天内可以申请换货”“显示设备没有画面时普通使用者能否拆机”“客户服务中心周六受理到几点”。直接打开通用聊天模型也许能得到流畅答案,却无法证明答案来自企业当前有效文件。模型还可能把其他品牌条款、旧版服务规则或一般常识混入回答。真实工作需要的不是一句像答案的话,而是一条可回查、会拒答、能显式呈现冲突的证据链。

本章完成一个从输入、模型到验收都可运行的纵向项目。配套工程自带9块教师编写的模拟企业资料,其中8块标记为当前有效,1块是明确过期的旧版配件换货规则。程序在启动时过滤过期资料,把有效段落变成中文字符2/3-gram,再计算TF-IDF向量和余弦相似度。命中充分时返回证据原文和编号;没有命中时走refuse;命中同一冲突组的两个有效条款时走conflict。这三个路由共同构成应用,不是一个孤立的提示词片段。

为了判断这种“智能”是否真的改善工作,项目另设透明关键词规则作为基线,并把两种系统放在同一组12条冻结问答上比较。参考运行中两者都是11/12:向量检索找到了关键词基线漏掉的同义改写,却把资料库没有覆盖的“上门服务费用”错误关联到售后申请资料;关键词基线安全拒绝该陌生问题,却漏掉“整串口令”这种改写。工程因此不宣称向量检索更好,结论明确写为not_ready_for_use。学生要学习的正是怎样从失败认识模型边界,而不是怎样把演示包装成成功产品。

本章成果

AI协同开发路线

学生先阅读任务合同、资料卡和系统卡,画出“有效资料—校准—检索—路由—引用—验收”链。随后先运行校准网格并打开代码定位字符切分、向量计算、阈值和拒答条件,参数冻结后才查看最终逐题结果。与协助开发的AI讨论失败时,只提供模拟问题、命中编号、分数和期望行为,不提供真实账号、密钥或单位内部敏感文件。AI可提出一个小改动,学生负责判断改动是否偷看了冻结答案、是否损害其他题并重跑全部验收。

本章不要求非人工智能专业学生从空白手写TF-IDF。学生要能用自然语言说清任务,让AI解释或生成局部代码,然后亲自找到输入文件、运行入口、关键变量、输出报告和失败样例。真正的学习证据包括:能指出effective_status为什么在建索引前过滤;能解释余弦高分不等于事实正确;能说明Q09为何比普通漏答更危险;能拒绝“把Q09关键词硬编码进去”这种污染测试的捷径。

第一节 把工作要求拆成需要核对的证据问题

一、先确定简报支持什么决定

证据助手不是一般问答。首版任务是帮助售后服务人员根据已登记的当前资料回答客户账号、产品基础排查、标准配件换货、售后申请和服务时间问题,并在无依据或资料冲突时转人工。它不诊断设备内部故障,不替企业发布新规定,也不承诺费用或维修结果。只有先确定回答要支持的工作决定,才能知道需要哪些资料和证据。

一个问题可能混合多类要求。例如“客户的显示设备画面闪烁,能否自行重启,若无效应怎样申请售后?”可以拆为:服务指南允许普通使用者执行哪些重启步骤,这是规则问题;当前产品编号、连接状态和故障现象是什么,这是事实问题;已重启多少次或等待多久,这是计算或记录问题;是否继续使用设备,这是需要结合现场风险的专业判断。

二、四类问题使用不同方法

事实问题需要找到明确记录,如型号、日期和现象;规则问题需要查有效说明或制度;计算问题应把确定数据交给普通程序,不让语言模型心算关键结果;专业判断可以参考证据,却应由有资格的人员确认。把四类问题混成一句,会让模型把“资料原文”与“自己的建议”写在同一语气中。

证据问题表至少包含问题编号、类型、所需证据、时效要求、无证据时动作和责任人。例如Q03是“普通使用者是否允许打开设备外壳”,证据应来自当前有效的安全说明;无命中时不得根据常识回答,必须转设备管理人员。

三、为资料建立有效性索引

每份资料使用稳定的doc_id,每个可检索块使用稳定的chunk_id,并记录标题、版本、适用对象、来源位置、授权和有效状态。同名文件不代表同一版本。旧版材料可以保留用于解释历史记录,但检索时应明确标为“过期,不作为当前操作依据”。网页材料若会变化,应保存获准使用的快照及访问日期。

资料越多不一定越可靠。把不相关、过期或来源不明的内容一起放进检索库,会增加错误命中的机会。项目组应说明为什么纳入每份资料,也应记录已排除的资料及理由。

四、建立人工关键词基线

在使用字符TF-IDF前,先为每类资料列出3—6个关键词或短语。配套工程把这些规则保存在data/keyword_rules.json,与TF-IDF检索器读取同一组当前有效资料,并采用相同的top_k=3。关键词基线透明、稳定,材料术语明确时可能已经足够。

关键词也会漏掉词面不同但意思相关的表达。本章引入字符2/3-gram和TF-IDF,是为了让问题与资料共享的短字符片段形成可比较的数值表示,而不是让模型替人认定证据。它能处理部分表达变化,也可能被偶然重合的字符误导,所以必须与基线和拒答测试一起观察。

第二节 用关键词和字符TF-IDF寻找相关段落

一、先把文档切成可回查的段落

整个文档直接生成一个向量,会把不同主题压在一起;切得只有几个字,又会失去条件和例外。本项目已经把模拟资料整理为9个可回查的块,编号为C001至C009,每块同时保留标题、版本、适用范围和有效状态。真实迁移时可以按自然段切分,但表格标题、章节标题和相邻条件应与内容一起保存;扫描件若读错关键单位,应回到原图复核。

切分结果应包含稳定编号、原文、来源版本和页码或区域。回答引用[C003]一类编号,使用者可以直接回查。切分规则发生变化,编号和测试结果也可能变化,因此需要更新索引版本并重新校准。

二、字符TF-IDF向量表示什么

参考工程没有调用预训练嵌入模型。它先删除标点和空白,把中文连续的两个字、三个字作为特征;再计算TF-IDF权重,把每个问题和资料块表示成稀疏向量。余弦相似度比较两个归一化向量的方向,并按分数排序。这里的高分只说明共享的加权字符片段较多,不代表资料真实,也不是答案正确概率。

字符片段方法不需要下载模型,计算过程容易逐行查看,但它不是完整语义理解。“口令”与资料中的“密码”只有在周围表达也有重合时才可能命中;两个不相关问题也可能因“服务、申请、产品”等片段偶然接近。高分段落可能只是在讨论相似词语,没有回答问题,检索结果仍需后续路由和人工检查。

因此,本章当前实现应准确称为“字符TF-IDF相似检索”,不能因为使用了向量和余弦相似度就称为语义检索。文本嵌入式语义检索通常使用经过训练的嵌入模型,把问题与资料映射为稠密向量,使词面不同但含义接近的表达有机会靠近;它也可能把范围外问题错误拉近,并增加模型版本、运行依赖和数据边界。配套工程保留统一检索接口,未来可以把嵌入式语义检索作为可替换扩展,但必须使用独立校准集重新选参,并原样保留拒答、冲突、过期过滤、引用核验和冻结验收,不能把“换成嵌入模型”当作自动解决Q09的答案。

证据问题 ──字符2/3-gram──TF-IDF──> 问题向量 ┐
                                             ├─ 余弦相似度 ─> Top-3候选
有效资料 ──字符2/3-gram──TF-IDF──> 资料向量 ┘

三、比较两种检索而不是迷信一种分数

选参数和测最终效果必须使用两组不同问题。data/calibration_qa.json有8条校准题,只用来比较预先声明的9组候选配置:top_k取1、2、3,min_score取0.04、0.08、0.12。calibrate.py逐组记录路由和候选证据;唯一8/8通过的是top_k=3、min_score=0.08,程序随后冻结这两个值。

为什么会选中这组参数?CAL01和CAL03是分数较低但确有依据的问题,0.12会把它们拒掉;CAL07是最高分约0.076的陌生问题,0.04会把它错误放行;CAL06要求同时找回两条冲突规定C006、C007和说明系统边界的C009,top_k小于3会漏掉所需候选。这个选择只对当前小型模拟资料和候选网格成立,不是通用参数。

参数冻结后,data/fixed_qa.json中的12条问题才第一次进入最终比较。Notebook在最终测试单元之前只使用不重合的演示题和校准题,acceptance.py会在忽略标点、空白和大小写后检查冻结题没有提前出现。学生若要研究把top_k从3改为2,必须回到校准集,先写预测并只改一个变量;不能在12条最终题上反复试到分数好看。

四、检索失败要显式呈现

如果最高相似度仍很低,或前几段都没有直接支持问题,系统应输出“无足够依据”,而不是让生成模型依靠常识补全。陌生型号、拼写错误和资料缺页都可能导致无命中。系统要保留原问题和检索分数,方便补资料或修正问题。

检索增强生成常用来概括“先检索依据,再约束生成”的实现模式。名称不是重点,关键是证据库范围、检索是否命中、生成是否受约束、引用能否回查。没有这些环节,只在提示中写“请准确回答”,不构成可靠证据链。

第三节 让模型只依据命中材料形成带来源简报

一、完整最小实现

配套工程的权威实现位于resources/ch03/project/evidence_assistant.py。它不要求云端模型,也不要求安装第三方库,Python标准库就能把资料转成TF-IDF向量。下面列出建索引、检索和路由的核心主链;完整的命令行入口、关键词基线、回答适配器、评估器和异常检查均保存在工程中,不把隐藏代码当作教学黑箱。

class TfidfIndex:
    def __init__(self, chunks):
        # 过期资料在进入模型以前就被确定规则排除。
        self.chunks = [c for c in chunks if c["effective_status"] == "active"]
        if not self.chunks:
            raise ValueError("没有当前有效资料。")
        counts = [Counter(character_ngrams(c["text"])) for c in self.chunks]
        df = Counter()
        for item in counts:
            df.update(item.keys())
        n = len(self.chunks)
        self.idf = {token: math.log((1 + n) / (1 + freq)) + 1.0
                    for token, freq in df.items()}
        self.vectors = [self._vectorize(item) for item in counts]

    def _vectorize(self, counts):
        total = sum(counts.values()) or 1
        values = {token: (freq / total) * self.idf[token]
                  for token, freq in counts.items() if token in self.idf}
        norm = math.sqrt(sum(value * value for value in values.values())) or 1.0
        return {token: value / norm for token, value in values.items()}

    def search(self, question, top_k=3, min_score=0.08):
        query = self._vectorize(Counter(character_ngrams(normalize(question))))
        ranked = []
        for chunk, vector in zip(self.chunks, self.vectors, strict=True):
            score = sum(value * vector.get(token, 0.0)
                        for token, value in query.items())
            if score >= min_score:
                ranked.append({**chunk, "score": round(score, 6)})
        ranked.sort(key=lambda item: (-item["score"], item["chunk_id"]))
        return ranked[:top_k]


def resolve_question(question, hits):
    if not hits:
        return {"route": "refuse", "evidence": [],
                "answer": "无法从当前有效资料确认。请联系相应服务人员。"}

    groups = defaultdict(list)
    for hit in hits:
        if hit.get("conflict_group"):
            groups[hit["conflict_group"]].append(hit)
    conflict = next((items for items in groups.values() if len(items) >= 2), None)
    if conflict:
        return {"route": "conflict", "evidence": conflict,
                "answer": "当前有效资料存在冲突,不能自动选择。"}

    evidence = [hits[0]]
    answer = ExtractiveEvidenceAnswerer().answer(question, evidence)
    allowed = {item["chunk_id"] for item in evidence}
    valid, citations = validate_citations(answer, allowed)
    if not valid:
        return {"route": "refuse", "evidence": evidence,
                "answer": "回答引用校验失败,已停止输出。"}
    return {"route": "answer", "evidence": evidence,
            "citations": citations, "answer": answer}

这里的“模型”不是一个神秘接口。字符n-gram把连续的两个字、三个字变成特征;TF-IDF降低到处出现的特征权重,提高较有区分度特征的权重;余弦相似度比较两个归一化向量的方向。程序再用普通条件语句决定回答、拒答还是冲突。学生可以沿着代码逐行找到每个业务约束落在哪里,也可以把一个提问的实际特征、得分和证据编号交给大语言模型,请它解释为何会命中。

参考回答器直接复制证据并加[C001]一类引用,不把“生成得自然”当作项目必需条件。answer_adapter.py另提供CallableLanguageModelAnswerer:企业若有获准的本地或云端模型,可以把“问题+已命中证据”送给它组织语言;没有证据时适配器禁止调用,模型输出若引用了本次证据集合之外的编号也会被拒绝。模型因此是可替换模块,不是整个系统唯一的安全防线。

可选拓展,不属于参考主链。 answer_adapter.py保留了一个可调用语言模型的接口边界,实践单位具备合规模型服务时,可以让模型只改写已经命中的证据;工程没有附带云端地址、密钥、预运行结果或额外材料,也不把这项拓展计入参考分数。若进一步改用神经网络文本嵌入,必须另行提供可运行适配器、依赖说明和新的独立校准结果,原来的0.08门槛不可沿用。教材不以一段无法运行的接口代码代替真实工程。

二、运行时先看命中,再看简报

先进入工程目录并执行:

cd resources/ch03/project
python evidence_assistant.py "未安装的标准配件在签收后多少天内可申请换货?"
python evidence_assistant.py --baseline "未安装的标准配件在签收后多少天内可申请换货?"
python calibrate.py --report output/calibration_results.json
python evaluate.py --report output/my_report.json
python acceptance.py

前两条命令让同一个问题分别经过字符TF-IDF检索与关键词基线。终端输出包含route、answer、evidence、citations和human_review_required。阅读顺序应当是先看路由,再看证据原文与状态,最后看回答;如果证据错了,回答写得再好也没有可靠基础。calibrate.py显示9组候选参数的逐组结果,evaluate.py逐题显示最终题的预期和实际路由、证据编号与是否通过。acceptance.py还检查20个必需文件、7个Python文件语法、校准题与冻结题是否隔离,以及14个正常与故障单元测试。

参考运行不是虚构的“理想效果”。TF-IDF在Q01—Q08、Q10—Q12通过,在Q09“上门服务需要收多少费用”上失败:资料库没有上门服务收费规则,它却因字符片段偶然接近而命中C004售后申请资料,随后进入回答路由。关键词基线则正确拒绝Q09,但在Q02“工作人员会要求我在聊天里提供整串口令吗”上没有把“整串口令”识别为“密码”的同义表达。两者各通过11题,失败性质不同。

将运行现象提交给协助开发的AI时,应提供校准问题编号、命中段落、分数和期望,不提供密钥。一个合适的研讨请求是:“解释CAL07在门槛0.04时为何被错误放行、在0.08时为何拒答;只分析字符片段和分数,暂不改代码。”若AI建议修改,学生先检查它是否读取了冻结题、是否一次改了多个变量,再决定要不要在新校准版本中实验。

还要防止一种看似高效的作弊式修复:看到Q09失败后,直接把“上门服务费用”写进拒答黑名单。这样可能让这12题变成12/12,却没有获得处理其他陌生问题的能力,还污染了冻结测试。合理做法是扩充data/calibration_qa.json形成带版本的新校准集,在其中比较分数门槛、词面覆盖、第二名差距或“双系统均无可靠命中”的门控策略;最终评价必须换用未参与开发的新冻结集。固定题集是最后检查,不是逐题调参材料。

三、模型、普通程序和人怎样分工

字符TF-IDF承担文本数值表示与候选排序;可选大语言模型只承担基于证据的组织和表达;普通程序负责有效性过滤、来源编号、阈值、冲突分组、文件写入和引用编号集合检查;学生核对问题、命中和引用;资料责任人确认现实中的版本,业务责任人解释冲突和决定能否使用。

把所有步骤都交给语言模型会失去确定性,把所有问题都写成关键词规则又难以处理表达变化。可靠系统不是选一个“最强模型”,而是让不同环节承担适合的责任,并让失败能够被看见。

本项目也帮助理解“大模型是指挥中心”的适用边界。它可以与学生讨论任务、解释代码、把证据改写成更易读的句子,却不能替代资料治理和验收。如果将来更换为神经网络嵌入或云端语言模型,只需实现相同适配接口;任务合同、三种路由、引用集合和冻结测试仍然保留。软件更换不应让工程责任一起消失。

第四节 核对时效、冲突、缺失和专业责任

一、引用存在不等于引用支持

引用核验至少有三步:编号是否真实存在;段落是否包含所述条件;结论是否超出段落范围。资料写“允许重启一次”不能支持“可反复重启”;适用于A型号的条款不能直接用于B型号。学生可以在简报每条结论旁标注“直接支持、需要推断、不支持”,需要推断的内容单列并交责任人。

时效核验检查版本、生效日期、适用对象和是否被新材料替代。检索分数不会因为资料过期而自动降低,因此有效性过滤应在检索前或生成后由规则和人执行。

二、用失败样例建立固定回归

冻结问答data/fixed_qa.json共12条,覆盖正常问题、同义改写、边界条件、安全提示、未知领域、有效资料冲突和过期证据排除。Q11要求同时返回C006和C007,路由必须是conflict;Q12要求使用当前C003,并明确禁止出现过期C008。单元测试另覆盖空问题、问题过长、资料库没有有效资料、无证据拒答、非法引用、无证据时禁止调用语言模型和调用模型引用越界等故障。这样既测“答对”,也测“该停时能否停下”。

每次修改后都运行相同问题,记录检索命中、非法引用、无依据句、人工复核时间和高代价错误。测试问题不能在调试时全部变成提示示例,否则模型可能只是适应了这些题目。

本轮运行的机器事实如下:9块模拟资料中只有8块进入索引;两套系统均完成12条问答;TF-IDF为11/12,关键词基线为11/12;14个单元测试全部通过;工程验收脚本退出码为0。机器报告不只保存总分,还写明decision=not_ready_for_use和三个失败发布门,并固定两个失败身份:character_ngram_tfidf:Q09实际回答且引用C004,属于高代价范围外回答;transparent_keyword_rules:Q02拒答且缺少应有C001引用,属于可用性失败。验收把现场完整JSON与正式参考逐字段比较,因此不能用另一组11/12替换当前错误性质。这里“验收脚本通过”表示工程文件齐全、结果可复现且失败被如实记录,并不等于应用达到发布门。

下一轮应建立规模更大、版本明确的校准集研究拒答门,例如同时观察最高相似度、第二名差距和关键词覆盖。学生必须先写预测,再只改一个变量,并保留新的未知类问题作下一轮最终测试。若降低阈值,召回可能提高,陌生问题误答也可能增加;若提高阈值,拒答更安全,有依据的低分表达可能被误拒。没有一种阈值天然正确,选择取决于错误代价和任务边界。

三、专业迁移卡

专业迁移卡A:商贸商品与服务条款
输入改为经确认的商品参数、促销规则、退换条款和渠道限制;高代价错误是把旧价格、其他型号参数或内部规则当成当前承诺;交付物为带条款编号的客户答复草案、冲突表和转人工清单,由商品负责人和客服审核人员确认。

专业迁移卡B:制造设备说明与点检规范
输入改为指定型号说明书、点检规程、维修公告和版本记录;高代价错误是跨型号引用、遗漏停机条件或生成未经授权的拆修步骤;交付物为故障现象证据简报和允许操作边界,由设备技术人员批准,助手不直接控制设备。

专业迁移卡C:交通运行规程核对
输入改为适用线路的运行规程、临时通知和设施手册;时效与适用区域成为强制过滤条件;高代价错误是引用失效通知或省略人工调度权限。交付物为带来源的事件核对单和冲突事项,由授权调度或安全人员确认。

四、形成可负责的结论

验收结论可分为:对固定资料和问题范围“采用”;只用于查找候选段落、结论全部人工复核的“限用”;高代价引用错误或时效无法控制时“退回”;问题超出资料或专业权限时“转责任人”。报告同时说明模型、资料索引、程序和测试集版本。

本项目的合格结论是:“工程已可离线复现,8个当前有效资料块能够被检索,过期C008被排除,冲突资料可并列;但字符n-gram TF-IDF在12个冻结问题中误答1个资料范围之外的问题,关键词基线则漏答1个同义改写。两者均为11/12,向量系统未通过未知问题拒答门。当前版本仅供课堂观察与人工核验证据候选,不自动对外回答,结论为not_ready_for_use。”它展示证据和边界,而不是对模型能力的笼统评价。

完整复现应从README开始,不依赖教师口头补步骤。另一组在Python 3.10—3.12环境中进入resources/ch03/project/,直接执行python acceptance.py,应看到两套逐题结果、文件与语法检查、Notebook隔离检查和14项单元测试。若环境、代码或数据变化导致结果不同,应保留新的输出并调查原因,不能手工把报告改回参考数字。

本章小结

本章完成了一个可运行、可失败、可复核的企业证据助手。项目从模拟资料治理开始,经字符n-gram、TF-IDF、余弦检索进入三种回答路由,再用引用集合和固定题集验收。关键词基线让学生能判断复杂方法是否真的改善工作;可替换回答适配器说明语言模型可以参与表达,但必须服从证据范围。真实的11/12对11/12结果表明,同义表达能力与陌生问题拒答之间存在权衡。一个完整AI项目不以“成功演示”结束,而以说明适用范围、失败类型、人的责任和下一轮实验结束。

关键术语

目标测试

  1. 字符TF-IDF检索返回最高余弦相似度段落,能够直接说明什么?
    A. 段落一定真实 B. 段落在该表示下与问题较接近 C. 答案已获批准 D. 资料一定最新
  2. 下列哪项最适合交给普通程序而不是语言模型?
    A. 组织简报语言 B. 找同义表达 C. 检查引用编号是否属于命中集合 D. 概括段落
  3. 资料没有回答某问题时,系统最合适的行为是什么?
    A. 使用模型常识补全 B. 选择相似度最高段落强行回答 C. 明确无依据并转待确认 D. 删除问题
  4. 为什么要保留关键词检索基线?
    A. 它总比TF-IDF检索好 B. 可比较新方法是否改善命中,并处理型号等精确词 C. 它能判断专业责任 D. 它无需资料
  5. 判断并改错:“引用编号合法,就证明引用段落一定支持对应结论。”
  6. 判断并改错:“把更多资料全部放入检索库,一定会提高回答可靠性。”
  7. 把“这台设备坏了怎么办”拆成一个事实问题、一个规则问题和一个专业判断问题。
  8. 设计一个资料冲突测试,写出输入材料、问题和期望输出行为。
  9. 说明怎样用data/calibration_qa.json研究把top_k从3改为2,同时保持12条冻结题集不参与选参。应记录哪些指标?
  10. 本项目两个系统都在12条冻结问答中通过11条:向量系统误答一个未知问题,关键词系统漏答一个同义改写。请比较错误代价,作出验收结论,并列出下一轮最小实验和责任人。