μ²μ λ§λλ AI Agent ꡬννκΈ°: βλ§λ§ νλ μ±λ΄βμμ βμΌμ νλ μμ΄μ νΈβλ‘
μ²μ λ§λλ AI Agent ꡬννκΈ°: βλ§λ§ νλ μ±λ΄βμμ βμΌμ νλ μμ΄μ νΈβλ‘ κ°λ°νλ€ λ³΄λ©΄ μ΄λ° μκ°μ΄ μ΅λλ€. βμ§λ¬Έμ λ΅μ...
μ²μ λ§λλ AI Agent ꡬννκΈ°: βλ§λ§ νλ μ±λ΄βμμ βμΌμ νλ μμ΄μ νΈβλ‘
κ°λ°νλ€ λ³΄λ©΄ μ΄λ° μκ°μ΄ μ΅λλ€. βμ§λ¬Έμ λ΅μ μνλλ°β¦ μ μλμΌλ‘ μΌμ λͺ» νμ§?β
AI Agentλ 무μμΈκ°
AI Agentλ₯Ό ν λ¬Έμ₯μΌλ‘ μ€μ΄λ©΄ LLM(λͺ¨λΈ) + μν(state) + λꡬ(tools) + 루ν(loop)μ λλ€.
β ν΅μ¬ νΉμ§ πΉ λνκ° μλλΌ λͺ©ν μ€μ¬μΌλ‘ λμ πΉ βμκ° β μ€ν β κ΄μ°° β λ€μ νλβ κ°μ λ°λ³΅ 루νλ₯Ό κ°μ§ πΉ κ³μ°κΈ°, νμΌ, DB, API κ°μ λꡬ νΈμΆμ μ μ λ‘ μ€κ³
μ±λ΄κ³Ό μμ΄μ νΈμ μ°¨μ΄
πΉ μ±λ΄: μ§λ¬Έ β λ΅λ³(ν μ€νΈ) πΉ μμ΄μ νΈ: λͺ©ν β κ³ν β λꡬ μ€ν β κ²°κ³Ό κ²μ¦ β λ€μ μ‘μ
μλ₯Ό λ€μ΄ βμ΄λ² μ£Ό κ°λ° ν μΌ μ 리ν΄μ€βλ₯Ό λ°μμ λ, μ±λ΄μ λͺ©λ‘μ μ μνλ λ° κ·ΈμΉμ§λ§ μμ΄μ νΈλ β μΊλ¦°λ/μ΄μ νΈλ컀λ₯Ό μ‘°ννκ³ β μ°μ μμλ₯Ό κ³μ°νκ³ β μ΄μ λ¬Έμλ₯Ό μ μ₯νλ μμΌλ‘ μ€μ μμ νλ¦μ λ§λλλ€.
ꡬν μ€κ³: μ΅μ κΈ°λ₯λΆν° μ‘μ
μ²μλΆν° κ±°λν νλ μμν¬λ₯Ό λΆμ΄λ©΄ λλ²κΉ μ΄ μ΄λ €μμ§λλ€. μ΅μ μμ΄μ νΈλ μλ 4κ°λ©΄ μΆ©λΆν΄μ.
1οΈβ£ State(μν): λͺ©ν, μ§ν λ‘κ·Έ, μ€κ° κ²°κ³Ό μ μ₯ 2οΈβ£ Policy(μ μ± ): μ§κΈ 무μμ ν μ§ κ²°μ (λͺ¨λΈ νΈμΆ) 3οΈβ£ Tools(λꡬ): μ€μ νλ(ν¨μ) 4οΈβ£ Loop(루ν): μ’ λ£ μ‘°κ±΄κΉμ§ λ°λ³΅
λꡬ μ€κ³ ν
πΉ λꡬλ βν μ€νΈ μμ±βμ΄ μλλΌ κ²°κ³Όκ° λͺ νν μμ μ΄ μ’μμ(κ³μ°, μ‘°ν, μ μ₯) πΉ μ λ ₯/μΆλ ₯μ λ¨μνκ² μ μ§νλ©΄ μμ μ±μ΄ ν μ¬λΌκ°λλ€ πΉ μ€ν¨ν μ μλ€λ μ μ (μμΈ μ²λ¦¬, μ¬μλ)λ₯Ό κΌ λ‘λλ€
μ€μ μ½λ: νμ΄μ¬μΌλ‘ λꡬ νΈμΆν Agent λ§λ€κΈ°
μλ μμλ κ³μ°κΈ° λꡬμ λ©λͺ¨ μ μ₯ λꡬλ₯Ό κ°μ§ μ΄κ°λ¨ μμ΄μ νΈμ λλ€. λͺ¨λΈμ OpenAI νΈν APIλ₯Ό κ°μ νμ§λ§, ν΅μ¬μ βλͺ¨λΈμ΄ λꡬλ₯Ό μ ννκ³ β μ€ννκ³ β κ΄μ°° κ²°κ³Όλ‘ λ€μ νλβμ μ΄μ΄κ°λ νλ¦μ λλ€.
import json
# --- Tools ---
def tool_calc(expression: str) -> str:
try:
# λ°λͺ¨μ©: μ€μ μλΉμ€μμλ μμ ν νμ μ¬μ© κΆμ₯
result = eval(expression, {"__builtins__": {}})
return str(result)
except Exception as e:
return f"calc_error: {e}"
MEMO = []
def tool_save_memo(text: str) -> str:
MEMO.append(text)
return f"saved({len(MEMO)}): {text[:30]}"
TOOLS = {
"calc": tool_calc,
"save_memo": tool_save_memo,
}
# --- Agent loop (λͺ¨λΈμ 'λ€μ μ‘μ
'μ JSONμΌλ‘ λ°ννλ€κ³ κ°μ ) ---
def fake_llm_decide(goal: str, observation: str) -> str:
"""
μ€μ λ‘λ LLM νΈμΆλ‘ λ체λ©λλ€.
λ°ν νμ μ:
{"action":"tool","tool":"calc","input":"(12000*3)*0.9"}
{"action":"tool","tool":"save_memo","input":"μ μ° κ²°κ³Ό: ..."}
{"action":"finish","output":"μ΅μ’
λ΅λ³ ..."}
"""
if not observation:
return json.dumps({"action":"tool","tool":"calc","input":"(12000*3)*0.9"}, ensure_ascii=)
observation:
json.dumps({:,:,:}, ensure_ascii=)
json.dumps({:,:}, ensure_ascii=)
():
state = {: goal, : []}
observation =
step (max_steps):
decision = json.loads(fake_llm_decide(goal, observation))
state[].append({: decision, : observation})
decision[] == :
decision[], state
decision[] == :
tool_name = decision[]
tool_input = decision[]
observation = TOOLS[tool_name](tool_input)
observation =
, state
(run_agent()[])
β μ΄ μμ μμ μ€μν ν¬μΈνΈ πΉ κ²°μ (Decision)κ³Ό κ΄μ°°(Observation)μ λΆλ¦¬ν΄μ κΈ°λ‘ β λλ²κΉ μ΄ μ¬μ πΉ μ’ λ£ μ‘°κ±΄μ΄ λͺ νν¨(steps μ ν, finish μ‘μ ) πΉ λꡬ μ€ν¨κ° μμ΄λ 루νκ° κΉ¨μ§μ§ μμ(μλ¬ λ¬Έμμ΄μ κ΄μ°°λ‘ λκΉ)
μμ μλ리μ€: κ°λ° μ 무μ λ°λ‘ μ°λ Agent μμ΄λμ΄
μ€λ¬΄μμ λ°λ‘ κ°μΉκ° λλ ν¨ν΄μ βλ°λ³΅ + κ·μΉ + μΈλΆ λ°μ΄ν°β μ‘°ν©μ λλ€.
πΉ λ¦΄λ¦¬μ¦ λ ΈνΈ μμ΄μ νΈ: μ΄μ λͺ©λ‘ μμ½ β λ³κ²½μ λΆλ₯ β λ¦΄λ¦¬μ¦ ν μ€νΈ μμ± β νμΌ μ μ₯ πΉ μ½λ 리뷰 보쑰: diff μμ½ β μν κ΅¬κ° νμ§ β 체ν¬λ¦¬μ€νΈ μμ± πΉ μλ¬ νΈλ¦¬μμ§: λ‘κ·Έ νμ± β μ μ¬ μ΄μ κ²μ(λ΄λΆ DB) β μ¬ν μ μ°¨ μ 리
ꡬν μ νν λΆλͺνλ ν¨μ κ³Ό ν΄κ²°μ±
β μμ μ±μ μ¬λ¦¬λ 체ν¬λ¦¬μ€νΈ πΉ λꡬ μ λ ₯ κ²μ¦: μ«μ/λ μ§/κ²½λ‘ κ°μ κ°μ νΉν μ격νκ² πΉ κΆν λΆλ¦¬: βμ½κΈ° λꡬβμ βμ°κΈ° λꡬβλ₯Ό λΆλ¦¬νλ©΄ μ¬κ³ κ° μ€μ΄λλλ€ πΉ κ΄μ°° λ‘κ·Έ μ μ₯: λμ€μ λ¬Έμ λ₯Ό μ¬νν μ μμ΄μΌ κ°μ μ΄ λ©λλ€ πΉ μ΅λ μ€ν μ ν: 무ν 루ν λ°©μ§μ© μμ μ₯μΉ
λ§λ¬΄λ¦¬: μ’μ Agentλ βλ§βλ³΄λ€ βνλ¦βμ΄ κ°νλ€
AI Agent ꡬνμ λ³Έμ§μ λͺ¨λΈμ λλνκ² λ§λλ κ² μλλΌ, λꡬμ 루νλ₯Ό μ€κ³ν΄μ μΌμ λλ΄κ² λ§λλ κ²μ λλ€. μ€λ μκ°ν μ΅μ κ΅¬μ‘°λ‘ μμν΄μ, λ€μ λ¨κ³λ‘λ πΉλꡬ νμ₯(API/DB) πΉκ³ν λ¨κ³ μΆκ°(νλλ) πΉκ²μ¦ λ¨κ³(체컀)κΉμ§ λΆμ΄λ©΄ κ½€ ννν μμ΄μ νΈκ° λ©λλ€.
#aiagent #κ°λ° #νμ΄μ¬ #llm #μμ΄μ νΈ #λꡬνΈμΆ #μλν #μννΈμ¨μ΄κ°λ° #νλ‘λνΈκ°λ°
β¬οΈ μ΄ κΈμ΄ λμμ΄ λμ ¨λ€λ©΄, μλ κ΄κ³ λ₯Ό ν λ²λ§ ν΄λ¦ν΄μ£ΌμΈμ! μ μκ² ν° νμ΄ λ©λλ€ πββοΈ β¬οΈ