Files
jaspersoft-agent-learn/step_05_07_advanced/exercise.py
T

89 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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()