AI Agents for Beginners - 9. Metacognition in AI Agents
Metacognition in AI agents — self-reflection, corrective RAG, pre-emptive context loading, goal bootstrapping, intent-aware search, code generation, and SQL as RAG.
June 9, 2026
AI Agents for Beginners - 9. Metacognition in AI Agents
이 글은 Microsoft의 AI Agents for Beginners 강좌 Lesson 09를 기반으로 정리한 내용입니다.
What is Metacognition?
Metacognition은 "자신의 생각에 대한 생각(thinking about thinking)"입니다.
AI Agent에서 메타인지는 에이전트가 자신의 내부 프로세스를 인식하고, 행동을 모니터링·조절·적응할 수 있는 능력을 의미합니다.
AI Agent에서 메타인지는 에이전트가 자신의 내부 프로세스를 인식하고, 행동을 모니터링·조절·적응할 수 있는 능력을 의미합니다.
메타인지가 해결하는 주요 과제:
| 과제 | 설명 |
|---|---|
| Transparency | 에이전트가 자신의 추론과 결정을 설명할 수 있어야 함 |
| Reasoning | 정보를 종합하고 올바른 결정을 내리는 능력 향상 |
| Adaptation | 새로운 환경·조건 변화에 적응 |
| Perception | 환경 데이터를 정확하게 인식하고 해석하는 정확도 향상 |
메타인지가 에이전트 설계에 중요한 이유:
Importance of MetacognitionMermaidflowchart LR MC["Metacognition\n자신의 사고 과정 인식"] MC --> SR["Self-Reflection\n성능 평가·개선 영역 파악"] MC --> AD["Adaptability\n과거 경험 기반 전략 수정"] MC --> EC["Error Correction\n오류 자율 감지·수정"] MC --> RM["Resource Management\n시간·연산 자원 최적화"]
메타인지의 핵심 예시:
- "저렴한 항공편을 우선했는데… 직항편을 놓쳤을 수 있다. 다시 확인해보자."
- "사용자가 '너무 복잡하다'고 할 때마다 내가 인기도 기준으로 추천한 것이 문제였다."
에이전트 구성 요소인 Persona·Tools·Skills가 결합되어 특정 태스크를 수행하는 "전문성 단위"를 만들고, 메타인지가 이 단위가 스스로 개선되도록 합니다.
Planning in Agents
Planning은 목표 달성을 위한 단계를 설계하고, 현재 상태·리소스·장애물을 고려하는 AI Agent 행동의 핵심 요소입니다.
여행 에이전트의 9단계 계획 프로세스:
Travel Agent Planning FlowMermaidflowchart TD P1["1. Gather Preferences\n날짜·예산·관심사 수집"] --> P2["2. Retrieve Information\n항공·숙박·관광지 검색"] --> P3["3. Generate Recommendations\n개인화 일정 작성"] --> P4["4. Present to User\n일정 공유"] --> P5["5. Collect Feedback\n사용자 의견 수집"] --> P6["6. Adjust Based on Feedback\n일정 수정"] --> P7["7. Final Confirmation\n최종 확인"] --> P8["8. Book & Confirm\n예약 진행"] --> P9["9. Ongoing Support\n여행 중 지원"]
메타인지를 적용한 Travel Agent 구현:
travel_agent_metacognition.pypython
Metacognition LoopMermaidflowchart TD G["gather_preferences()\n선호도 초기화"] --> R["generate_recommendations()\n항공·숙박·관광지 검색 + 일정 생성"] --> U["사용자에게 일정 제공"] --> FB["User Feedback\n{liked, disliked}"] FB --> Adj["adjust_based_on_feedback()\nexperience_data 누적\n선호도 재조정"] Adj -->|"Updated Preferences"| R
experience_data에 피드백을 누적하고, adjust_based_on_feedback로 선호도를 재조정한 뒤 새 일정을 생성하는 것이 메타인지 루프의 핵심입니다.Corrective RAG System
두 가지 정보 접근 전략을 비교합니다:
| Corrective RAG | Pre-emptive Context Load | |
|---|---|---|
| 방식 | 쿼리 시점에 외부 소스에서 정보 검색 | 처리 전 관련 컨텍스트를 미리 로드 |
| 업데이트 | 실시간 정보 | 사전 로드된 정보 |
| 속도 | 검색 지연 발생 | 즉각적 응답 |
| 정확성 | 피드백 기반 오류 수정 | 고정된 컨텍스트 |
| 적합 상황 | 동적 데이터, 오류 수정 필요 시 | 알려진 도메인, 빠른 응답 필요 시 |
RAG Tool Calling vs Pre-Emptive Context LoadMermaid%%{init: {'look': 'handDrawn'}}%% flowchart TD subgraph RAG["RAG Tool Calling"] direction TD LLM1["LLM"] LLM1 --> T1["Tool"] LLM1 --> T2["Tool"] LLM1 --> T3["Tool"] T1 & T2 & T3 --> R1["Response"] end subgraph PCL["Pre-Emptive Context Load"] direction TD LLM2["LLM"] LLM2 --> CTX["Context\n(쿼리 처리 전 제공)"] CTX --> R2["Response"] end
Corrective RAG 접근법
Corrective RAG는 세 가지 요소로 오류를 수정하고 정확도를 높입니다:
| 요소 | 설명 |
|---|---|
| Prompting Technique | 관련 정보를 검색하도록 에이전트를 유도하는 구체적인 프롬프트 작성 |
| Tool | 검색된 정보의 관련성을 평가하고 정확한 응답을 생성하는 알고리즘·메커니즘 구현 |
| Evaluation | 에이전트 성능을 지속적으로 평가하고 정확도·효율을 개선하기 위한 조정 반복 |
Corrective RAG 단계별 구현 예시
Travel Agent에 Corrective RAG를 적용하는 5단계:
Step 1 — 사용자 입력 수집
목적지·날짜·예산·관심사 등 여행 선호도를 수집합니다.
step1_preferences.pypython
Step 2 — 정보 검색 및 초기 추천 생성
수집된 선호도를 기반으로 항공·숙박·관광지를 검색하고 초기 일정을 생성합니다.
step2_retrieve.pypython
Step 3 — 사용자 피드백 수집
초기 추천에 대한 사용자의 긍정·부정 피드백을 수집합니다.
step3_feedback.pypython
Step 4 — Corrective RAG 적용
- Prompting Technique: 피드백을 반영해 새 검색 쿼리 작성
step4_prompting.pypython
- Tool: 업데이트된 선호도로 재검색 및 새 일정 생성
step4_tool.pypython
- Evaluation: 피드백을 선호도에 반영하는 지속 평가 함수
step4_evaluation.pypython
Step 5 — 종합: Corrective RAG Travel Agent
위 단계를 하나의 클래스로 통합한 최종 예시입니다.
adjust_based_on_feedback가 피드백 누적 → 선호도 갱신 → 새 일정 생성까지 한 번에 처리합니다.corrective_rag_travel_agent.pypython
Corrective RAG Travel Agent FlowMermaidflowchart TD GP["gather_preferences()\n목적지·예산·관심사 저장"] --> GR["generate_recommendations()\nretrieve_information() 호출"] GR --> RT["search_flights + hotels + attractions"] RT --> CI["create_itinerary()"] CI --> SU["사용자에게 일정 제공"] SU --> FB["User Feedback\n{liked, disliked}"] FB --> AF["adjust_based_on_feedback()\nexperience_data.append(feedback)\nadjust_preferences() → 선호도 갱신"] AF -->|"Updated user_preferences"| GR
Corrective RAG 흐름
Corrective RAG FlowMermaidflowchart TD User["사용자 입력\n목적지·예산·관심사"] --> Retrieve["정보 검색\n항공·숙박·관광지"] --> Gen["초기 일정 생성"] --> Feedback["사용자 피드백 수집"] Feedback --> Adjust{피드백 분석} Adjust -->|"disliked 항목"| NewQuery["쿼리 재작성\npreferences['avoid'] 추가"] NewQuery --> Retrieve Adjust -->|"만족"| Done["최종 일정 확정"]
Pre-emptive Context Load
처리 전 알려진 도메인 정보를 메모리에 미리 로드해 외부 검색 없이 즉시 응답합니다:
preemptive_context.pypython
Pre-emptive Context Load FlowMermaidflowchart TD Init["__init__()\nself.context 미리 로드\n{Paris, Tokyo, NY, Sydney}"] --> Query["사용자 목적지 쿼리"] --> Get["get_destination_info(destination)\nself.context.get(destination)"] Get --> Check{컨텍스트 존재?} Check -->|"Yes"| Hit["country·currency·language·attractions\n즉각 반환 (외부 검색 없음)"] Check -->|"No"| Miss["'정보 없음' 반환"]
Bootstrapping a Plan with a Goal Before Iterating
목표를 미리 정의한 뒤 반복적으로 계획을 개선하는 접근법입니다.
bootstrap_plan으로 초기 계획을 수립하고, iterate_plan으로 점진적으로 최적화합니다:
bootstrap_plan으로 초기 계획을 수립하고, iterate_plan으로 점진적으로 최적화합니다:
bootstrap_plan.pypython
Goal Bootstrapping LoopMermaidflowchart TD Goal["명확한 목표 정의\n(예: 만족도 최대화, budget ≤ $2000)"] --> Bootstrap["bootstrap_plan\n목표·예산 기반 초기 계획 수립"] --> Execute["계획 실행"] --> Eval{결과 평가} Eval -->|"개선 가능"| Iterate["iterate_plan\n더 나은 목적지로 교체"] Iterate --> Execute Eval -->|"최적"| Done["최종 여행 계획 확정"]
Taking advantage of LLM for Re-ranking and Scoring
LLM Re-ranking은 초기 검색 결과를 그대로 사용하는 대신, LLM이 각 후보의 관련성·품질을 평가하고 최적 순서로 재정렬하는 기법입니다.
| 단계 | 설명 |
|---|---|
| Retrieval | 쿼리 기반으로 후보 문서·응답을 초기 검색 |
| Re-ranking | LLM이 후보를 관련성·품질 기준으로 재정렬 — 가장 유용한 정보가 상위에 위치 |
| Scoring | LLM이 각 후보에 점수를 부여해 최적 응답·문서 선택 |
여행 에이전트에서 사용자 선호도 기반으로 목적지를 LLM이 재순위·스코어링하는 예시:
llm_reranking.pypython
LLM Re-ranking & Scoring FlowMermaidflowchart TD Query["사용자 선호도\nactivity: sightseeing\nculture: diverse"] --> Retrieve["초기 후보 목록\n(Paris, Tokyo, NYC, Sydney)"] --> Prompt["generate_prompt()\n선호도 + 목적지 설명 포함"] --> LLM["LLM (Azure OpenAI)\n관련성·품질 평가"] LLM --> Rerank["Re-ranking\n가장 적합한 목적지 상위 정렬"] Rerank --> Score["Scoring\n각 후보에 점수 부여"] Score --> Result["최종 추천 목록\n(순위 + 점수 포함)"]
RAG: Prompting Technique vs Tool
RAG는 프롬프팅 기법과 통합 도구 두 가지 방식으로 활용할 수 있습니다:
| 측면 | Prompting Technique | Tool |
|---|---|---|
| 방식 | 각 쿼리마다 수동으로 프롬프트 작성 | 검색·생성 자동화 |
| 제어 | 검색 과정에 대한 세밀한 제어 가능 | 전 과정 자동 처리 |
| 유연성 | 특정 요구에 맞는 커스텀 프롬프트 | 대규모 구현에 더 효율적 |
| 복잡도 | 프롬프트 작성·조정 필요 | AI Agent 아키텍처에 통합 용이 |
rag_prompting_vs_tool.pypython
Evaluating Relevancy
Relevancy 평가는 에이전트가 검색·생성한 정보가 사용자 쿼리에 적합하고 정확한지 지속적으로 확인하는 과정입니다.
관련성 평가의 핵심 개념:
| 개념 | 설명 |
|---|---|
| Context Awareness | 쿼리의 문맥을 이해해 관련 정보 검색 (예: 사용자 예산·취향 고려) |
| Accuracy | 제공 정보가 사실적으로 정확하고 최신이어야 함 |
| User Intent | 쿼리 이면의 목적을 추론해 가장 관련성 높은 정보 제공 |
| Feedback Loop | 사용자 피드백을 지속 수집·분석해 관련성 평가 프로세스 개선 |
실용적인 관련성 평가 기법:
relevancy_techniques.pypython
Travel Agent에 관련성 평가를 적용한 전체 예시:
travel_agent_relevancy.pypython
Relevancy Evaluation FlowMermaidflowchart TD Pref["User Preferences\n{destination, budget, interests}"] --> GenRec["generate_recommendations()\n일정 생성 시작"] GenRec --> Retrieve["retrieve_information()\n항공·숙박·관광지 검색"] Retrieve --> Rank["filter_and_rank(hotels)\nrelevance_score 기준 정렬 → 상위 10개"] Rank --> Score["relevance_score(item, query)\ncategory·price·location 매칭 점수"] Score --> Itin["create_itinerary()\n최종 일정 생성"] Itin --> FB["User Feedback\n{liked, disliked}"] FB --> Adjust["adjust_based_on_feedback()\nrelevance +1 / -1 조정"] Adjust -->|"다음 추천에 반영"| Rank
Search with Intent
Intent-aware Search는 키워드 매칭을 넘어 사용자 쿼리의 실제 목적을 파악해 더 관련성 높은 결과를 제공합니다.
세 가지 인텐트 유형:
| Intent | 설명 | 예시 |
|---|---|---|
| Informational | 정보 탐색 | "파리에서 가볼 만한 박물관은?" |
| Navigational | 특정 웹사이트·페이지 이동 | "루브르 박물관 공식 사이트" |
| Transactional | 예약·구매 등 트랜잭션 수행 | "파리행 항공편 예약" |
search_with_intent.pypython
Intent-Aware Search FlowMermaidzenuml title Intent-Aware Search Flow User->Agent: "best museums in Paris" Agent->IntentClassifier: identify_intent(query) IntentClassifier->Agent: "informational" Agent->ContextAnalyzer: analyze_context(query, user_history) ContextAnalyzer->Agent: current + history context Agent->SearchEngine: search informational query with preferences SearchEngine->Agent: raw results Agent->Personalizer: personalize_results(results, user_history) Personalizer->Agent: filtered top 10 Agent->User: personalized recommendations
Generating Code as a Tool
Code Generating Agent는 AI 모델을 사용해 코드를 작성·실행하며 복잡한 문제를 해결합니다.
주요 활용 분야: 자동 코드 생성, SQL as RAG, 데이터 분석 자동화.
주요 활용 분야: 자동 코드 생성, SQL as RAG, 데이터 분석 자동화.
Travel Agent를 예시로 단계별로 구현합니다.
Step 1 — 사용자 선호도 수집
step1_agent.pypython
Step 2 — 데이터 검색 코드 동적 생성
에이전트가 선호도에 맞는 코드 스니펫을 직접 생성합니다.
step2_generate_code.pypython
Step 3 — 생성된 코드 실행
step3_execute.pypython
Step 4 — 일정 생성
step4_itinerary.pypython
Step 5 — 피드백 기반 코드 재생성
피드백을 반영해 선호도를 갱신하고, 갱신된 선호도로 코드를 다시 생성·실행합니다.
step5_feedback_regen.pypython
Code Generating Agent FlowMermaidflowchart TD S1["Step 1\ngather_preferences()\n사용자 선호도 수집"] --> S2["Step 2\ngenerate_code_to_fetch_data()\ngenerate_code_to_fetch_hotels()\n코드 동적 생성"] --> S3["Step 3\nexecute_code()\n생성된 코드 실행 → flights, hotels"] --> S4["Step 4\ngenerate_itinerary()\n항공·숙박·관광지 조합"] --> S5["Step 5\nadjust_based_on_feedback()\n선호도 갱신 → 코드 재생성·재실행"] S5 -->|"Updated Preferences"| S2
Leveraging Environmental Awareness and Reasoning
Schema 기반 환경 인식은 테이블 스키마를 이해하고 피드백에 따라 어떤 필드를 어떻게 조정할지 추론하는 방법입니다.
schema_awareness.pypython
Schema-Aware Feedback Adjustment FlowMermaidflowchart TD FB["User Feedback\n{liked, disliked}"] SC["Schema\n{favorites·avoid: +/-/default}"] FB & SC --> AdjFn["adjust_based_on_feedback()\nfavorites·avoid 직접 갱신"] AdjFn --> Loop["schema 필드 순회"] Loop --> EnvFn["adjust_based_on_environment()\n필드별 조정값 결정"] EnvFn --> UPref["Updated Preferences"] UPref --> GenF["generate_code_to_fetch_data()"] UPref --> GenH["generate_code_to_fetch_hotels()"] GenF --> ExF["execute_code() → flights"] GenH --> ExH["execute_code() → hotels"] ExF & ExH --> Itin["generate_itinerary()\nUpdated Itinerary"]
Using SQL as a Retrieval-Augmented Generation (RAG) Technique
SQL as RAG는 사용자 입력 기반으로 동적 SQL 쿼리를 생성해 데이터베이스에서 정보를 검색합니다:
sql_as_rag.pypython
동적으로 생성되는 SQL 쿼리 예시:
example_queries.sqlsql
SQL as RAG: Query Generation & Execution FlowMermaidflowchart TD Pref["User Preferences\n{destination, budget, dates, interests}"] --> GenRec["generate_recommendations(preferences)"] GenRec --> FQ["generate_sql_query('flights')\nSELECT * FROM flights WHERE ..."] GenRec --> HQ["generate_sql_query('hotels')\nSELECT * FROM hotels WHERE ..."] GenRec --> AQ["generate_sql_query('attractions')\nSELECT * FROM attractions WHERE ..."] FQ --> EF["execute_sql_query()\n→ flight results"] HQ --> EH["execute_sql_query()\n→ hotel results"] AQ --> EA["execute_sql_query()\n→ attraction results"] EF & EH & EA --> Dict["{flights, hotels, attractions}\nItinerary Dict"]
Example of Metacognition
지금까지 배운 개념을 통합한 메타인지 구현 예제입니다.
에이전트가 초기 결정을 내리고 → 자기 반성을 통해 오류를 인식하고 → 전략을 수정하는 3단계 사이클을 구현합니다:
에이전트가 초기 결정을 내리고 → 자기 반성을 통해 오류를 인식하고 → 전략을 수정하는 3단계 사이클을 구현합니다:
hotel_metacognition.pypython
Metacognition: Reflect & Adjust LoopMermaidflowchart TD Start["초기 결정\nrecommend_hotel('cheapest')"] --> Eval["자기 반성\nreflect_on_choice()"] Eval --> Feedback{User Feedback} Feedback -->|"'bad'\nprice < 100 or quality < 7"| Switch["전략 전환\n'cheapest' → 'highest_quality'"] Switch --> Retry["재추천\nrecommend_hotel('highest_quality')"] Retry --> Eval Feedback -->|"'good'"| Done["추천 확정"]
이것이 메타인지의 핵심입니다:
- 초기 결정: cheapest 전략으로 Budget Inn 선택
- 자기 반성: quality 6 → "bad" 피드백 인식
- 전략 수정: 최종적으로 Luxury Stay 추천
에이전트는 단순히 최종 추천만 바꾸는 것이 아니라, 자신의 의사결정 방식 자체를 수정합니다.
Summary
Lesson 09 SummaryMermaidflowchart LR Root["Metacognition\nin AI Agents"] Root --> MC["메타인지 루프"] Root --> RAG["RAG 전략"] Root --> Search["Intent Search"] Root --> Code["Code Generation"] MC --> M1["Self-Reflection\n성능 평가"] MC --> M2["Error Detection\n오류 인식"] MC --> M3["Strategy Adjustment\n전략 수정"] RAG --> R1["Corrective RAG\n피드백 기반 재검색"] RAG --> R2["Pre-emptive Load\n사전 컨텍스트 로드"] RAG --> R3["SQL as RAG\n동적 쿼리 생성"] Search --> S1["Informational"] Search --> S2["Navigational"] Search --> S3["Transactional"] Code --> C1["generate_code\n동적 코드 생성"] Code --> C2["execute_code\n실행·결과 반영"]
- Metacognition은 에이전트가 자신의 의사결정 방식을 인식하고 수정하는 능력으로, 단순한 결과 수정이 아닌 추론 전략 자체의 개선입니다
- Corrective RAG는 사용자 피드백을
prefer/avoid로 반영해 쿼리를 재작성하고 재검색하는 반복적 자기 수정 루프를 구현합니다 - Pre-emptive Context Load는 알려진 도메인 정보를 미리 메모리에 로드해 외부 검색 없이 즉각 응답하는 방식으로, 속도가 중요할 때 유효합니다
- Intent-aware Search로 Informational·Navigational·Transactional 인텐트를 분류하면 키워드 매칭보다 훨씬 관련성 높은 결과를 제공합니다
- Code Generation + SQL as RAG로 에이전트가 동적으로 코드를 작성·실행해 실시간 데이터를 검색하고 복잡한 태스크를 자동화합니다