
简介面向CAAC无人机执照考试备考人员及无人机操作员这份docx文档以单选题形式系统覆盖无人机飞行原理、操作技巧、法律法规、飞行安全、维护保养与气象知识等模块适合考前集中刷题和日常自查。资源共1个文件为Word格式docx文档体积约120KB内容紧凑、便于打印或导入手机端学习。从内容预览看题目涉及飞行手册使用、紧急情况处置、适航证书管理、无线电许可证、发动机慢车维护、装载重心计算及飞行教员签字等考点不仅有法规条款记忆也有实操判断训练每题附正确答案方便快速校对和查漏补缺帮助使用者熟悉考试题型、厘清易混淆概念。目前已有174人学习浏览对于正在备考CAAC执照或希望系统补强无人机理论知识的读者是一份轻量实用的题库资料。1. CAAC 无人机执照考试题库备考先把文档变成数据集距离考试还有一周很多人会把《CAAC 无人机执照考试题库.docx》从头到尾翻三遍合上文件却发现错题还是那些错题。问题不在于记忆力而在于 docx 里的题目只适合线性阅读不适合统计、追踪、对比和回查。把这份题库当作一个原始数据集来处理先抽结构、再清洗、入库后面对接刷题、错题分析、同类题归纳都顺理成章。这篇文章面向准备考取 CAAC 无人机执照的飞手、培训机构的教员、以及给学员做考前系统的技术人目标是把 docx 里的几千道题变成一张随时可以查询、统计、生成训练计划的关系表。2. 用 python-docx 解析 CAAC 题库把题目清洗成结构化数据2.1 先看清 docx 内部结构再决定用哪种解析方式docx 不是纯文本文件它的正文内容存放在 word/document.xml 里段落、表格、图片、批注分别挂在不同节点上。如果直接用 Python 打开整个文件做字符串匹配会遇到两个麻烦一是题干和选项混在同一个段落里正则写起来非常别扭二是有些题目的答案和解析不在同一个段落坐标范围丢失一条整道题的参考价值就打了折扣。处理这种文档最稳妥的工具是 python-docx。它把段落和表格分开暴露成 doc.paragraphs 和 doc.tables读题目时可以按两种来源分别处理。大多数培训机构给的题库 docx 排版并不统一有的题干带数字编号“1.”“1、”有的选项是“A. xxx B. xxx”挤在同一行有的答案是“正确答案A”还有的是“【答案】A”。解析前先手工打开文档看三五个题目确认编号和选项的规律再写对应规则比盲目套正则更省时间。from docx import Document import re doc Document(CAAC 无人机执照考试题库.docx) questions [] for para in doc.paragraphs: text para.text.strip() if not text: continue if re.match(r^\d[\.、]\s*, text): entry { question: re.sub(r^\d[\.、]\s*, , text), options: [], answer: , analysis: } questions.append(entry) elif re.match(r^[A-F][\.、]\s*, text): if questions: questions[-1][options].append(text) elif re.match(r^(答案|【答案】|正确答案), text): if questions: questions[-1][answer] text.split()[-1].strip() elif re.match(r^(解析|【解析】), text): if questions: questions[-1][analysis] text这里的核心逻辑是“按段落类型分段定位”以数字开头的段落成为新题目以 A-F 开头的并入当前题的选项列表答案和解析则分别挂到同一道题下面。参数上的选择依据是 docx 常见排版习惯——题干编号连续、选项成行、答案解析单独成段。如果你的文档里选项和题干挤在同一个段落需要在第一层 if 里继续拆分常见做法是用re.split(r(?[A-F][\.、]), text)把“A. xxx B. xxx”切成多段后再入库。2.2 用表格批量提取和图片题兜底方案有一部分题库会把题目放在 docx 的表格里一列是题干一列是答案。遇到这种情况doc.paragraphs 扫不到任何内容必须先遍历 doc.tables。for table in doc.tables: for row in table.rows: cells [cell.text.strip() for cell in row.cells] if len(cells) 2 and 答案 in cells[-1]: entry { question: cells[0], options: [], answer: cells[-1], analysis: } questions.append(entry)表格提取时要注意合并单元格相邻单元格可能共用同一个 cell 对象导致同一道题被重复添加。常见规避方式是临时记录上一个 question 的 id插入前比较一下内容是否一致。图片题在纯文本解析下会丢失图形内容比如无人机结构标记题、气象云图判断题常规做法是先把题干文字抽出图片单独导出成一个文件目录再用image_path字段做关联入库后仍然能定位到原始图。2.3 清洗规则去空白、去重、归一化选项题目抽出来只是第一步清洗才是让数据可用的关键。中文文档里常见问题有全角空格和半角空格混用、题干尾部带有多余句号、选项里混着“对/错”、同一道题在不同章节重复出现。清洗规则我一般会这样设计先把所有空白字符替换成空字符串再把“正确答案”这类前缀统一去掉最后以 question 字段做唯一性约束做去重。def clean_question(text): text re.sub(r\s, , text) text text.replace(, ().replace(, )) return text.strip(。;) questions [ {**q, question: clean_question(q[question])} for q in questions ] questions list({q[question]: q for q in questions}.values())这个清洗逻辑的细节在于光标换行符和零宽空格不会在屏幕上显示但会塞进字符串里入库后影响 LIKE 查询的准确率括号归一化是为后续统计“多选多选题”“判断题”这类关键字做准备去重时用 question 做键答案和解析保留最新出现的那份。2.4 入库 SQLite建表、插入、校验统计结构化完成后把题目写进 SQLite 是最常用的做法。表结构尽量拆细一点后面做错题统计和模拟考试时不需要再改动表。CREATE TABLE IF NOT EXISTS questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, chapter TEXT, qtype TEXT, question TEXT UNIQUE, options_json TEXT, answer TEXT, analysis TEXT, wrong_count INTEGER DEFAULT 0 );插入时直接用参数化写法避免单引号把 SQL 语句打断。import sqlite3, json conn sqlite3.connect(caac.db) cur conn.cursor() for q in questions: cur.execute( INSERT OR IGNORE INTO questions (qtype, question, options_json, answer, analysis) VALUES (?, ?, ?, ?, ?) , ( q.get(qtype, ), q[question], json.dumps(q[options], ensure_asciiFalse), q[answer], q[analysis] ) ) conn.commit()插入后马上做三道校验查询按题型分组统计、查完全重复的题干、查答案是非 ABCD 的异常记录。SELECT qtype, COUNT(*) FROM questions GROUP BY qtype; SELECT question, COUNT(*) as c FROM questions GROUP BY question HAVING c 1; SELECT id, question, answer FROM questions WHERE answer NOT IN (A,B,C,D,A,B,C,D,正确,错误) LIMIT 20;这组查询的输出结果可以对照原始文档做人工抽查。入库量通常在 1000 道以上清洗后如果少了三分之一先怀疑表格里的题没被读到如果多出大量重复则是段落拆分规则把同一个题干拆成了两段。3. 给 CAAC 题库加一层本地 RAG 检索错题解释不再靠死记3.1 为什么关键词搜索不适合做考点关联题库进了 SQLite 后最常见的需求是搜一道题“无人机失速后应该先推杆还是先加油门”。用 SQL 的 LIKE %失速% 能搜到很多含“失速”的题目但搜不到题干里写“机翼迎角超过临界角”的同类题。考试时题干往往会换一种表述方式同一条法规知识会在不同的题目里反复包装关键词匹配在这种语义变化面前非常无力。语义检索的常见落地方式是向量检索。把每一道题的题干、选项、答案拼接成一条文本用嵌入模型转成向量检索时把问题也转成向量找余弦相似度最高的几条。这个方案在本地就能跑不需要联网也不需要申请任何云端接口几千道题的向量库内存占用通常在几十 MB 级别。3.2 用 ChromaDB 构建题目向量库from sentence_transformers import SentenceTransformer import chromadb import sqlite3 conn sqlite3.connect(caac.db) rows conn.execute(SELECT id, question, options_json, answer FROM questions).fetchall() texts [] ids [] for row in rows: qid, question, options_json, answer row texts.append(f{question} { .join(json.loads(options_json))} 答案:{answer}) ids.append(str(qid)) model SentenceTransformer(all-MiniLM-L6-v2) embeddings model.encode(texts, normalize_embeddingsTrue).tolist() client chromadb.PersistentClient(path./caac_vec) collection client.get_or_create_collection(caac_qa) collection.add(idsids, documentstexts, embeddingsembeddings)这里的嵌入模型 all-MiniLM-L6-v2 是英文为主的通用模型对中文支持尚可但如果你手头题库里中文长句子特别多可以换成 paraphrase-multilingual-MiniLM-L12-v2模型体积大一些中文语义召回更准。normalize_embeddings 参数置为 True是因为后面计算相似度时用点积比余弦更省时间但需要保证向量已经做了归一化。3.3 把检索封装成一个可复用函数向量库建好后封装一个查询函数输入是任意一道错题输出是库里最接近的几条题目及解析。def search_similar(question, top_k5): emb model.encode([question], normalize_embeddingsTrue).tolist() res collection.query(query_embeddingsemb, n_resultstop_k) for doc, dist in zip(res[documents][0], res[distances][0]): print(f[相似度 {1 - dist:.3f}] {doc[:80]})调用时把错题的题干直接传进去。distances 返回的是余弦距离范围是 0 到 2越接近 0 越相似为了直觉上容易理解输出时换算成1 - dist显示。当一道错题不理解时把 top_k 调到 8往往能看到同一考点下不同问法的题目比单独看一条解析更容易归纳出命题人的套路。对合规敏感的场景建议全流程保持本地运行不要用在线模型的接口提交试卷内容。文档中的法规条文、服务条款都属于内部资料本地模型虽然效果略逊于大模型但数据安全边界可控。4. 从题库里提炼高频考点法规、气象和飞行性能的三张参数表4.1 用词频统计找出命题重点题库入库后最快速的考点提炼方法是做词频统计。对题干文本做中文分词统计高频词再看这些词分布在哪些章节。import sqlite3, re from collections import Counter conn sqlite3.connect(caac.db) questions conn.execute(SELECT question FROM questions).fetchall() words [] for (q,) in questions: words re.findall(r[\u4e00-\u9fa5]{2,6}, q) stopwords set(下列 关于 以下 属于 不属于 正确 错误 说法 描述.split()) freq Counter(w for w in words if w not in stopwords) for word, count in freq.most_common(40): print(word, count)运行后通常会看到“无人机”“空域”“机场”“气象”“驾驶员”“高度”“目视”“执照”这批词不断出现。把这些词映射到对应章节就能画出教材里的重点分布。词频统计只是辅助别单独靠这个判断考点需要配合章节和题型做二次过滤比如只看判断题里出现的高频词往往能找到法规中容易混淆的细节。4.2 运行分类对照表视距内、超视距的边界要记清楚CAAC 执照体系和运行分类是理论考试中经常出现的题目考点不在于背出行标条文而在于区分不同运行场景下的要求。对照维度视距内驾驶员超视距机长运行范围保持在视距内可在视距外飞行操控方式直接目视观察依靠地面站监控培训侧重点基本操控、应急返航航线规划、数据链、应急处理考试难度相对基础理论深度更大这张表的记忆点在于视距内驾驶员强调“人眼可见”超视距强调“链路和站控”。很多题目把两者混在一起比如问“以下哪项属于超视距机长的职责”选项却放在视距内的操作上。做题时先判断题目中的运行场景再匹配对应职责正确率会明显提高。4.3 气象与飞行性能的关键参数气象和飞行性能是计算题的高发区。高频考点集中在温度、气压、密度高度、失速速度、重心位置这几个参数上。参数变化方向对飞行的影响空气温度升高密度高度增加升力下降起飞滑跑距离变长气压下降密度高度增加发动机功率下降爬升率降低重心前移机头变重失速速度上升操控变迟钝重心后移机头变轻纵向稳定性下降失速特性变差飞机结冰翼型破坏失速速度提高阻力增加这类题的关键在于建立“参数变化 - 直接效应 - 飞行结果”的三段式推导。如果只是硬背结论考试时换个数值或换个表述就容易错。备考时把这些参数自己推一遍比如温度升高导致密度高度升高进而导致真实空速不变时指示空速偏低就能应付大多数变体题。5. 考前一周用间隔重复和模拟抽题把错题率压下来考前一周的复习策略和平时不同。平时追求覆盖面考前追求的是“已错题不能再错”。间隔重复的核心原则是错题在快忘记时再次出现时间间隔通常按 1 天、3 天、7 天递增。利用已经入的库可以用 SQL 直接筛选出今天该复习的错题。-- 假设 answers 表记录了每次答题结果 SELECT q.question, q.answer, q.analysis FROM questions q JOIN answers a ON q.id a.question_id WHERE a.is_correct 0 AND ( julianday(now) - julianday(a.answered_at) BETWEEN 1 AND 2 OR julianday(now) - julianday(a.answered_at) BETWEEN 5 AND 6 ) GROUP BY q.id ORDER BY q.id;这个查询的逻辑是第一次答错的题隔 1 到 2 天再出现如果这次做对了再隔 5 到 6 天出现一次如果间隔时间太长说明已经接近遗忘边界不合适。执行前把 answered_at 字段更新到 answers 表保持节奏准确。模拟考试用随机抽题的方式生成试卷不要每次按顺序刷题否则你会记住上一题的答案位置而不是记住知识本身。常规做法是单选 50 题、多选 20 题、判断 30 题随机打乱后限制 30 分钟完成。刷完立刻把错题写回 answers 表并记录 is_correct 字段让每天的检索表自动更新。最后一个具体技巧是错题回归复述对做错的题目不要马上看解析先把题干读一遍用自己的话说出选择的理由再对照题库的解析找偏差。这个过程能暴露你是“没记住知识点”还是“记混了概念”。把每天的错误原因归类成“法规混淆”“计算失误”“气象判断错误”三类考前最后一天只刷归类最多的那一类题目。这个做法的可执行性在于它不需要额外工具一张纸一支笔就能完成而且对短时记忆的提升明显好于反复看同一份答案列表。本文还有配套的精品资源点击获取