λ€μ΄κ°λ©°
GPT-5, Claude Opus 4.6 κ°μ μ΅μ λͺ¨λΈμ΄ λ±μ₯ν΄λ AI μμ΄μ νΈλ₯Ό μ€μ νλ‘λμ μ ν¬μ νλ©΄ μ¬μ ν κ°μ λ¬Έμ κ° λ°λ³΅λ©λλ€. νκ°(hallucination), 무ν 루ν, μλͺ»λ λꡬ νΈμΆ, μ₯κΈ° μμ μμμ λ리ννΈ(drift)... λ μ’μ λͺ¨λΈλ‘ κ΅μ²΄νλ€κ³ ν΄μ ν΄κ²°λμ§ μμ΅λλ€.
κ·Έλμ λ±μ₯ν κ°λ μ΄ λ°λ‘ νλ€μ€ μμ§λμ΄λ§(Harness Engineering) μ λλ€.
νλ€μ€ μμ§λμ΄λ§μ΄λ, AI μμ΄μ νΈκ° νλ‘λμ μμ μ λ’°μ± μκ² λμνλλ‘ κ·Έ μ£Όλ³μ μ μ½(constraints), λꡬ(tools), νΌλλ°± 루ν(feedback loops)λ₯Ό μ€κ³νλ μΈνλΌ κ³΅ν λΆμΌμ λλ€.
ν΅μ¬ ν΅μ°°μ λ¨μν©λλ€. "μμ΄μ νΈ μ체λ₯Ό λ λλνκ² λ§λ€λ € νμ§ λ§κ³ , μμ΄μ νΈλ₯Ό λλ¬μΌ νκ²½μ λ λ¨λ¨νκ² μ€κ³νλΌ."
μ "νλ€μ€(Harness)"μΈκ°?
μλ ML νκ° λΆμΌμμ μ°μ΄λ "eval harness"λΌλ μ©μ΄κ° μμ΄μ νΈ μμ€ν μ λ°μΌλ‘ νμ₯λ κ²μ λλ€. λ§μΉ λ§(horse)μκ² λ§κ΅¬(harness)λ₯Ό μ±μ μνλ λ°©ν₯μΌλ‘ μΌνκ² νλ―, LLMμ΄λΌλ κ°λ ₯νμ§λ§ μμΈ‘ λΆκ°λ₯ν μμ§μ ꡬ쑰물μ μμ ν΅μ κ°λ₯ν μΌκΎΌμΌλ‘ λ§λλ κ²μ΄μ£ .
λΉμ νμλ©΄ μ΄λ μ΅λλ€.
"μ λ’°ν μ μλ μΈμ£Ό μμ μμκ² μΌμ λ§‘κΈΈ λ, μ΄λ€ μ§κ·Έ(jig), 체ν¬λ¦¬μ€νΈ, κ²μ νλ‘μΈμ€λ₯Ό κ°μΆ°μΌ κ²°κ³Όλ¬Όμ΄ μ λ’° κ°λ₯ν΄μ§κΉ?"
κ·Έ μ§κ·Έμ 체ν¬λ¦¬μ€νΈμ μ΄ν©μ΄ λ°λ‘ νλ€μ€μ λλ€.
νλ€μ€μ 3κ°μ§ ν΅μ¬ ꡬμ±μμ
π μ 체 ꡬ쑰λ

1οΈβ£ μ μ½ (Constraints) — "νμ§ λ§μμΌ ν κ²"μ μ€κ³
μμ΄μ νΈκ° ν μ μλ νλ 곡κ°μ μλμ μΌλ‘ μ’νλλ€.
| μ μ½ μ ν | μμ |
| μλλ°μ€ | 격리λ νμΌμμ€ν , 컨ν μ΄λ, λ€νΈμν¬ νμ΄νΈλ¦¬μ€νΈ |
| κΆν κ²μ΄νΈ | νκ΄΄μ μμ (μμ , κ²°μ λ±) μ μ¬μ©μ μΉμΈ νμ |
| μΆλ ₯ μ€ν€λ§ | JSON Schema κ°μ , μ ν¨νμ§ μμΌλ©΄ μ¬μλ |
| μμ° νκ³ | ν ν°/μ€ν /λΉμ© μνμ |
| κ°μ μ μ°¨ | "λ¨Όμ κ³νμ μΈμ°κ³ , κ·Έ λ€μ μ€ν" κ°μ μν¬νλ‘μ° κ°μ |
2οΈβ£ λꡬ (Tools) — 1κΈ μλ―ΌμΌλ‘μμ λꡬ μ€κ³
μ’μ λꡬλ λͺ¨νΈν μΆλ‘ λ¬Έμ λ₯Ό μ λ’°μ± μλ ν¨μ νΈμΆλ‘ λ°κΏλλ€.
μ’μ λꡬμ νΉμ§:
- β λͺ νν κ³μ½(contract)κ³Ό νμ
- β μ λ³΄κ° νλΆν μλ¬ λ©μμ§ ("File not found"κ° μλλΌ "File not found at /x/y. Did you mean /x/z?")
- β κ°λ₯ν κ²½μ° λ©±λ±μ±(idempotency)
- β μ μ ν μΆμν μμ€ (λ무 μ μμ€λ, λ무 λ§λ² κ°μ§λ μκ²)
λμ λꡬ vs μ’μ λꡬ μμ:
# β λμ λꡬ: λͺ¨νΈνκ³ μλ¬κ° λΆμΉμ
def run(cmd: str) -> str:
return os.system(cmd) # μμ΄μ νΈκ° λ μλͺ»νλμ§ μ μ μμ
# β
μ’μ λꡬ: λͺ
νν κ³μ½, μΉμ ν μλ¬
def search_files(
pattern: str,
directory: str = "/workspace"
) -> SearchResult:
"""νμΌ λ΄μ©μ κ²μν©λλ€.
Returns:
SearchResult with matches, or error with suggestions.
"""
if not os.path.exists(directory):
return SearchResult(
error=f"Directory '{directory}' not found.",
suggestions=find_similar_dirs(directory)
)
...
3οΈβ£ νΌλλ°± 루ν (Feedback Loops) — λΉ λ₯Έ μ€ν¨μ νμ΅
μμ΄μ νΈμ μ΄μμκ° "λκ° μλͺ»λμ"μ λΉ λ₯΄κ² μμμ°¨λ¦¬κ³ μμ ν μ μμ΄μΌ ν©λλ€.
- λ°νμ μ νΈ: ν μ€νΈ κ²°κ³Ό, νμ 체컀, λ¦°ν°, μ€ν νΈλ μ΄μ€
- κ΄μΈ‘μ±(Observability): λͺ¨λ λ¨κ³μ νΈλ μ΄μ±, λΉμ©/μ§μ° λ©νΈλ¦
- μ€νλΌμΈ νκ°(Eval Harness): λ°°ν¬ μ νκ· ν μ€νΈ
- HITL(Human-in-the-loop): μ€μ λΆκΈ°μ μμμ μ¬λ κ²ν
- 리νλ μ΄/λλ²κΉ : μ€ν¨ μΌμ΄μ€ μ¬ν λꡬ
μ€μ μμ: μ½λ© μμ΄μ νΈμ νλ€μ€
Anthropicμ Claude Code, Cognitionμ Devin κ°μ μ½λ© μμ΄μ νΈκ° μλνλ λ°©μμ λ¨μννλ©΄ λ€μκ³Ό κ°μ΅λλ€.

μ΄ κ΅¬μ‘° λλΆμ LLMμ΄ μλͺ»λ μ½λλ₯Ό μμ±ν΄λ ν μ€νΈκ° μ¦μ μ€ν¨λ₯Ό μλ €μ£Όκ³ , μμ΄μ νΈλ κ·Έ νΌλλ°±μ λ°μ μ€μ€λ‘ μμ ν μ μμ΅λλ€. λͺ¨λΈμ΄ λλν΄μκ° μλλΌ, νλ€μ€κ° μ€ν¨λ₯Ό λΉ λ₯΄κ² κ°μννκΈ° λλ¬Έμ μμ€ν μ μ²΄κ° μ λ’°ν λ§ν΄μ§λ κ²μ λλ€.
SRE μ¬κ³ λ°©μμ νμ₯
νλ€μ€ μμ§λμ΄λ§μ λ³Έμ§μ μΌλ‘ λΉκ²°μ μ (non-deterministic) μ»΄ν¬λνΈμ λν SRE μ¬κ³ λ°©μμ νμ₯μ λλ€.
μ ν΅ SRE νλ€μ€ μμ§λμ΄λ§
| μ ν΅ SRE | νλ€μ€ μμ§λμ΄λ§ |
| μλ² μ₯μ λ₯Ό κ°μ νκ³ μ€κ³ | LLM μ€ν¨λ₯Ό κ°μ νκ³ μ€κ³ |
| μν· λΈλ μ΄μ»€, μ¬μλ | κ²μ¦ λ¨κ³, μκ° μμ 루ν |
| λͺ¨λν°λ§/μλ¦Ό | μμ΄μ νΈ νΈλ μ΄μ±, νκ° λμ보λ |
| μΉ΄μ€μ€ μμ§λμ΄λ§ | μ λμ νκ°(adversarial eval) |
λ§μΉλ©°: μ μ§κΈ μ€μνκ°?
2025~2026λ μ "ν둬ννΈ μ μ§κΈ°"μ μλμμ "μμ΄μ νΈ μΈνλΌ μ μ§κΈ°"μ μλλ‘ λμ΄κ°λ λ³κ³‘μ μ λλ€. λ μ’μ λͺ¨λΈμ κΈ°λ€λ¦¬λ λμ , μ§κΈ κ°μ§ λͺ¨λΈλ‘ μ λ’°μ± μλ μμ€ν μ λ§λλ λ₯λ ₯ — κ·Έκ²μ΄ νλ€μ€ μμ§λμ΄λ§μ΄ μ½μνλ κ²μ λλ€.
ν΅μ¬μ λ¨ ν λ¬Έμ₯μ λλ€.
"μμ΄μ νΈλ₯Ό λ λλνκ² λ§λ€λ € νμ§ λ§κ³ , μ€μΊν΄λ©μ λ λ¨λ¨νκ² λ§λ€μ΄λΌ."
λ€μ κΈμμλ μ€μ νλ‘λμ νλ€μ€ ν¨ν΄(κ²μ¦ 루ν, νκ° νλ€μ€ ꡬμΆ, λꡬ μ€κ³ λ² μ€νΈ νλν°μ€)μ μ½λ μμμ ν¨κ» λ€λ€λ³΄κ² μ΅λλ€.
#AIμμ΄μ νΈ #νλ€μ€μμ§λμ΄λ§ #LLMOps #AgentInfrastructure #DevTools