""" Step 05-07 练习题:进阶能力 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🎯 练习目标: 1. 体验 RAG 的检索质量 2. 写一个 Self-Correction 闭环 3. 设计多 Agent 编排 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ """ # ═══════════════════════════════════════════════════════════════════════════════ # 练习 1:提升 SimpleRAG 的检索质量 # ═══════════════════════════════════════════════════════════════════════════════ """ 任务: SimpleRAG.retrieve() 当前用 Jaccard 相似度 + 简单分词。 改造为:把分词改成 "中文按字 + 英文按词 + 大小写归一化" 后再算 Jaccard。 要求: 1. 复用 SimpleRAG 类,不要重写 2. 实现 upgrade_retrieve(rag) 替换 rag.retrieve 方法 3. 用一个含中英文的小语料验证 提示: - re.findall(r'[\u4e00-\u9fff]|[A-Za-z]+', text.lower()) """ # ═══════════════════════════════════════════════════════════════════════════════ # 练习 2:实现 Self-Correction 主循环 # ═══════════════════════════════════════════════════════════════════════════════ """ 任务: SelfCorrectingAgent 在 concept.py 中是骨架。请补全它的 run() 方法: def run(self, requirement: str, generate_fn, validate_fn, max_retries=3): for attempt in range(max_retries): output = generate_fn(requirement, attempt, feedback) validation = validate_fn(output) if validation.passed: return output feedback = self.build_feedback(validation) return output 要求: 1. 第一次 attempt 不带 feedback 2. 每次失败用 build_feedback 拼出新的 feedback 3. 超过 max_retries 返回最后一次 output(不要抛异常) """ # ═══════════════════════════════════════════════════════════════════════════════ # 练习 3:给 MultiAgentSystem 加超时与失败回退 # ═══════════════════════════════════════════════════════════════════════════════ """ 任务: MultiAgentSystem.process() 是顺序调用 searcher -> generator -> validator。 任何一个 Agent 抛异常都让整个流程崩。 要求: 1. 在 process() 外层包 try/except,失败时返回 {"error": str(e)} 2. 给每个 Agent 加 timeout_seconds 参数(用 time.monotonic) 3. 验证:故意让 validator 抛异常,确认 process() 不会让程序崩溃 提示: - time.monotonic() 不受系统时间影响 - 简单演示里可以靠 sleep + 时间比较实现超时 """ def test_exercises(): from step_05_07_advanced.concept import SimpleRAG rag = SimpleRAG() rag.add_document("JasperReports 是一个 Java 报表库", {"source": "doc1"}) rag.add_document("JRXML 是 JasperReports 模板格式", {"source": "doc2"}) print(rag.retrieve("JasperReports")) if __name__ == "__main__": test_exercises()