89 lines
4.1 KiB
Python
89 lines
4.1 KiB
Python
"""
|
||
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()
|