| """μκ° νμ΅ λ£¨ν - μ΄μμ μΉμΈ μ λΆμ κ²°κ³Όλ₯Ό μΈμλνΈ DBμ μλ κΈ°λ‘ |
| |
| μΉμΈλ λΆμμ INC-AUTO-{date}-{alarm_id}.mdλ‘ μ μ₯νλ©΄ RAG κ²μ λμμ ν¬ν¨λμ΄ |
| ν₯ν μ μ¬ μλμ μμΈ λΆμ/λμ κΆκ³ μ νλκ° μ μ§μ μΌλ‘ ν₯μλ¨ |
| |
| PDF κΈ°νμ "μκ° νμ΅ λ£¨ν - μ΄μμ μΉμΈ κ²°κ³Όκ° μΈμλνΈ DBμ μ¦μ λ°μ" λμ νλͺ© |
| """ |
| from datetime import datetime |
| from pathlib import Path |
|
|
| from agents.rag.store import KNOWLEDGE_DIR |
| from core.schema import TierData |
|
|
|
|
| def record_incident(alarm: dict, tier_data: TierData, work_order_id: str) -> Path: |
| """μΉμΈλ λΆμμ μΈμλνΈ .mdλ‘ μ μ₯, μ μ₯λ κ²½λ‘ λ°ν""" |
| date = datetime.now().strftime("%Y-%m-%d") |
| doc_id = f"INC-AUTO-{date}-{alarm['id']}" |
| path = KNOWLEDGE_DIR / f"{doc_id}.md" |
| path.write_text(_render_doc(doc_id, alarm, tier_data, work_order_id), encoding="utf-8") |
| return path |
|
|
|
|
| def _render_doc(doc_id: str, alarm: dict, td: TierData, work_order: str) -> str: |
| now = datetime.now().strftime("%Y-%m-%d %H:%M") |
| t1, t2, t3, t4 = td["tier1"], td["tier2"], td["tier3"], td["tier4"] |
|
|
| causes_md = "\n".join( |
| f"{i+1}. {c['name']} ({c['pct']}%) - {c['evidence']}" |
| for i, c in enumerate(t2["causes"]) |
| ) |
| deps_md = ", ".join( |
| f"{d['stage']}({d['delta']}, {d['tag']})" for d in t3["dependencies"] |
| ) |
| impact_md = ", ".join( |
| f"{l['label']} {l['lots']} lot/{l['wafers']}μ₯" for l in t3["impact_lots"] |
| ) |
|
|
| def actions(items): |
| return "\n".join( |
| f"- {a['text']}" + (f" ({a['meta']})" if a.get("meta") else "") |
| for a in items |
| ) |
|
|
| return f"""# {doc_id} - {alarm['title']} μλ κΈ°λ‘ |
| |
| ## λΆλ₯ |
| - μ ν: μλ νμ΅ μΈμλνΈ (μ΄μμ μΉμΈ κΈ°λ°) |
| - 곡μ : {alarm['title']} |
| - lot: {alarm['lot_id']} |
| - λ°μ μλ¦Ό: {alarm['time']} |
| - κΈ°λ‘ μκ°: {now} |
| - μμ
μ§μμ: {work_order} |
| |
| ## Tier 1 μ΄μ νμ§ |
| - μ΄μ μ μ: {t1['score']} |
| - κΈ°μ¬ μΌμ Top: {', '.join(f['name'] for f in t1['features'])} |
| - μν₯ lot: {t1['lot']['id']} ({t1['lot']['wafers']}μ₯) |
| |
| ## Tier 2 μΆμ μμΈ |
| {causes_md} |
| |
| ## Tier 3 μν₯ νκ° |
| - μμ μμ¨ μμ€: {t3['yield_loss']} %p |
| - 곡μ μμ‘΄μ±: {deps_md} |
| - μν₯ WIP: {impact_md} |
| |
| ## Tier 4 μ±ν κΆκ³ |
| |
| ### μ¦μ μ‘°μΉ |
| {actions(t4['immediate'])} |
| |
| ### μ€μ₯κΈ° μ‘°μΉ |
| {actions(t4['longterm'])} |
| |
| ## μ΄μμ κ²°μ |
| - κΆκ³ μ±ν: μ 체 μΉμΈ |
| - μμ
μ§μμ λ°ν: {work_order} |
| """ |
|
|