ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从离线题库到 RAG 智能出题:CodeTutorAgent 编程题库数据集的设计、解析与使用

从离线题库到 RAG 智能出题:CodeTutorAgent 编程题库数据集的设计、解析与使用 从离线题库到 RAG 智能出题CodeTutorAgent 编程题库数据集的设计、解析与使用【免费下载链接】hello-agents 《从零开始构建智能体》——从零开始的智能体原理与实践教程项目地址: https://gitcode.com/datawhalechina/hello-agents本篇文章以 hello-agents 仓库中 TutorAgent 项目 的编程题库数据集Practice Question Bank为核心系统讲解该离线题库在智能编程导师系统中的定位、题目 Markdown 数据结构、加载解析逻辑、向量化入库与检索过滤流程并给出完整的数据接入步骤。读完本文你将掌握如何为一套基于 RAG 的智能出题系统准备、组织并接入可检索的离线题库数据同时理解ExerciseAgent从题目召回、精确过滤到格式化输出的完整链路。一、题库数据集在智能编程导师中的定位在 CodeTutorAgent 这套多智能体协作的编程导师系统中出题环节由ExerciseAgent承担而它的知识来源正是离线编程题库数据集。数据集说明文档即 programmer/data/README.md明确指出该题库的核心定位是根据学习计划与当前阶段检索匹配的编程练习题导师系统先由 PlannerAgent 生成分阶段学习计划出题智能体则依据当前阶段的知识点从题库中召回对应题目支持不同难度题目标注难度标签系统按用户水平过滤作为智能编程导师系统的离线知识源题库不依赖外部在线服务作为 RAG检索增强生成的离线语料为 LLM 出题提供可验证的事实性题目内容避免凭空编造题目。在系统架构中题库数据经由两条代码路径被消费一是 services/problem_repository.py 负责的本地解析读取题目 Markdown 并抽取结构化字段二是 agents/exercise.py 中RAGTool负责的向量化检索。两条路径共同保证先召回、再过滤、最后格式化输出的出题质量。二、题库数据结构从解析源码反推题目格式数据集文档提到具体题目结构与字段说明请参考项目代码中的数据加载与解析模块。要理解题库数据的组织方式最直接的办法是阅读 problem_repository.py 的解析逻辑。从_parse_problem、_extract、_extract_block、_parse_examples等方法的正则规则可以完整反推出每道题目 Markdown 文件的字段结构字段题目文件中的写法解析依据正则说明slug目录名os.listdir得到的子目录名题目唯一标识同时写入path字段title# [题目标题]# \[(.*?)\]位于文件首行用方括号包裹description## Description之后到**Example之前_extract_block(text, ## Description, \\*\\*Example)题目描述正文examples**Example N:**块内含Input:、Output:、Explanation:_parse_examples的\*\*Example\s*\d:\*\*正则多组示例含输入、输出与可选的解释constraints**Constraints:**之后到**Follow-up之前_extract_block(text, \\*\\*Constraints:\\*\\*, \\*\\*Follow-up)约束条件tags**Tags:** 标签1, 标签2\*\*Tags:\*\*(.*)逗号分隔的知识点标签列表difficulty**Difficulty:** Easy/Medium\*\*Difficulty:\*\*(.*)题目难度值得注意的细节_extract_block使用re.SDOTALL模式跨行匹配说明Description、Constraints都是可跨行的长文本块一道题目的完整 Markdown 文件存放于题库根目录下的独立子目录中slug即子目录名path指向该目录内的README.md文件难度字段与 ExerciseAgent 的系统提示词 保持一致该智能体只输出Easy或Medium两种难度作为 RAG 召回时的语义过滤依据。这个目录 README.md的题库布局正是数据文档中将数据目录放置到项目指定路径这一步骤背后的设计——ProblemRepository会遍历题库根目录下每一个子目录自动发现并解析全部题目。三、题库加载与解析ProblemRepository 源码拆解ProblemRepository是题库数据的本地消费入口其工作分为两个阶段。3.1 全量加载_load_all_problems遍历题库根目录root_dir列出根目录下所有子目录名检查每个子目录下是否存在README.md不存在则跳过读取文件内容并调用_parse_problem解析解析成功后将slug目录名、path文件路径、content原始文本一并写入题目字典最终返回题目列表self.problems。构造函数__init__(self, root_dir...)在实例化时即完成全量加载题目数据在内存中常驻供后续精确过滤与向量化入库复用。3.2 字段解析_parse_problem通过一组小型正则工具方法完成字段抽取_extract(pattern, text)单行正则捕获用于title、tags、difficulty等短字段_extract_block(text, start, end)跨行块捕获用于description、constraints_parse_examples(text)先以**Example N:**分块再在每块内依次抽取Input:、Output:可选与Explanation:可选。所有字段解析失败时均有空值兜底如difficulty缺失则默认Unknowntags缺失则为空列表title缺失则整题判定为非法并跳过。3.3 过滤能力filter(*, tagsNone, difficultyNone)提供两类内置过滤按标签只要题目tags与传入标签存在任意交集即命中OR 语义按难度对difficulty做小写化精确匹配。该方法是数据文档所述支持不同难度的底层实现之一与 RAG 语义召回形成互补前者是精确规则过滤后者是向量相似度召回。四、题库向量化入库ExerciseAgent 的首次初始化数据文档指出在 exercise.py 代码中指定题库路径启动系统即可通过 RAG 模块进行题目检索这对应 exercise.py 中ExerciseAgent.__init__的初始化逻辑创建ProblemRepository(root_dir)其中root_dir为题库根目录源码默认指向HelloAgents-main/output目录可按实际部署位置修改创建RAGTool(collection_namerag_knowledge_base, rag_namespaceproblems)建立独立的向量集合惰性初始化检测先尝试self.rag.search(queryEasy, limit1)探测向量库是否为空或不存在异常同样视为未初始化若判定为空则触发入库流程逐题写入遍历repo.problems对每道题目调用self.rag.add_text(text..., document_idproblem[title])将结构化文本写入向量库。写入向量库的文本格式固定为Title: 题目标题 Difficulty: 难度 Tags: 标签列表 Description: 题目描述前 200 个字符这里Description被截断为前 200 字符既控制了向量文本长度又保留了题目的核心语义是 RAG 入库时对信息密度与检索效率的一种实用取舍。初始化完成后打印编程题目向量仓库构建完成。这种首次运行自动建库、后续直接复用的设计使题库数据既可以离线批量接入又不要求使用者手动执行向量化脚本降低了数据接入门槛。五、检索与出题RAG 语义召回 本地精确过滤双通道ExerciseAgent.run实现了完整的出题链路是题库数据真正被用起来的地方LLM 意图理解super().run(input_text)让 LLM 依据系统提示词判断用户要求的难度只允许输出Easy或Medium理解难度与知识点要求不生成新题目RAG 语义召回self.rag.search(queryresult, limit3, min_score0.3)在向量库中召回与难度/知识点语义最相近的至多 3 条题目文本min_score0.3为最低相似度阈值低于该值的结果被丢弃标题抽取用re.findall(rTitle:\s*(.), rag_results)从召回文本中提取题目标题本地精确过滤对每个标题调用get_problem_by_title(title)在ProblemRepository.problems内存列表中按title精确匹配取回包含完整description、examples、constraints的原始题目数据标准化输出若过滤结果为空返回没有找到相关题目否则用_format_problem将每道题格式化为结构化的 Markdown 推荐卡片。_format_problem输出的题目卡片包含推荐练习题标题、难度、标签、题目描述、编号示例Input / Output / Explanation、约束条件以及请先尝试独立完成不要直接查看题解完成后可提交代码进行评审的引导提示。这道工序直接呼应了 TutorAgent 中call_exercise工具的定位——出题人根据学习内容生成练习题见 tutor.py。这一设计的关键价值在于RAG 负责粗召回语义相近本地仓库负责精过滤字段完整、真实存在两者结合既发挥了向量检索的语义能力又避免了纯 RAG 输出幻觉题目、字段缺失的问题最终呈现给用户的题目永远是题库中真实存在的完整题面。六、题库数据接入四步使用流程数据文档给出了明确的接入步骤结合上文源码分析完整流程如下下载并解压题库数据从文档提供的网盘链接获取题库压缩包提取码i8v1解压后得到按题目组织的目录结构将数据目录放置到项目指定路径把题库根目录放到data/或任意可访问的本地路径每个题目子目录内必须包含一个 Markdown 文件ProblemRepository约定读取README.md在 exercise.py 中指定题库路径修改 agents/exercise.py 中ProblemRepository(root_dir)的root_dir参数指向实际题库根目录启动系统运行main.py后ExerciseAgent首次运行会自动完成向量库初始化之后用户请求出题时即可通过 RAG 模块完成语义检索并返回匹配题目。整个过程无需手工执行向量化脚本系统在首次启动时自动完成加载 → 解析 → 入库三步后续会话直接复用已构建的向量仓库。七、注意事项与合规使用数据文档明确了题库使用的边界仅限学习、研究与非商业用途题库属于社区开源整理的学习资源不得用于商业分发或闭源牟利公开展示或二次分发需注明来源若在课程、博客或二次开发中引用题库内容应保留并注明出处尊重数据整理者的贡献更新同步若题库内容更新数据文档会同步说明版本变化使用时以仓库最新说明为准。从工程视角补充两点实践建议其一题库路径在源码中目前为硬编码Windows 绝对路径部署到其他环境时应改为相对路径或通过配置注入其二向量库在题库更新后需触发重新初始化删除或重置rag_knowledge_base集合否则检索仍命中旧版题目文本。小结CodeTutorAgent 的编程题库数据集虽然是一份小而专的数据说明文档但它串联起了整条 RAG 智能出题链路ProblemRepository负责把散落的题目 Markdown 解析为结构化题目RAGTool负责把题目文本向量化并支持语义召回ExerciseAgent则在两者之上完成LLM 判断难度 → 向量粗召回 → 本地精过滤 → Markdown 格式化的完整出题流程。理解这套离线题库 RAG的设计不仅适用于本项目也可迁移到任何需要知识库驱动智能问答/出题的场景中。延伸阅读完整的题目加载解析实现见 services/problem_repository.py出题智能体与 RAG 初始化逻辑见 agents/exercise.py多智能体编排与call_exercise工具注册见 agents/tutor.py 与 tools/agent_tool.py系统整体说明见 programmer/README.md。【免费下载链接】hello-agents 《从零开始构建智能体》——从零开始的智能体原理与实践教程项目地址: https://gitcode.com/datawhalechina/hello-agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表