저자 소개
추천사
1부 시작하기
1장 에이전트의 시대
AI 에이전트의 시대
1.1 생성형 AI의 발전 속도
1.1-1 폭발적인 성장의 시작
1.1-2 2026년, AI는 어디까지 왔는가?
1.1-3 왜 발전 속도가 중요한가?
1.2 AI 에이전트의 능력
1.2-1 LLM의 한계
1.2-2 AI 에이전트란 무엇인가?
1.2-3 에이전트의 핵심 구성 요소
1.2-4 생각하고, 행동하고, 관찰하기
1.2-5 기존 소프트웨어와 무엇이 다른가?
1.2-6 에이전트는 ‘새로운 팀원’
1.3 AI 에이전트의 실생활 예시
1.3-1 ChatGPT: 에이전트로의 진화
1.3-2 에이전트 도입의 확산
1.3-3 왜 지금 배워야 하는가?
1.4 AI 에이전트 개발을 시작해 보자
1.4 AI 에이전트 개발을 시작해 보자
1.4-1 이 책에서 배울 것
1.4-2 왜 LangChain과 LangGraph인가?
핵심 정리
2장 개발 시작하기
개발 시작하기
2.1 개발 환경 설정
2.1-1 Python 설치
2.1-2 패키지 관리자 사용하기
2.1-3 LangChain & LangGraph 설치
2.1-4 Streamlit으로 채팅 UI 만들기
2.2 LLM 모델 사용 준비
2.2-1 OpenAI API 키 발급
2.2-2 모델 선택 가이드
2.3 프로젝트 구성
2.3-1 프로젝트 구조 생성
2.3-2 환경 변수 및 API 키 관리
2.3-3 첫 번째 에이전트 만들기
2.3-4 애플리케이션 실행
2.3-5 프로젝트 공유 준비
핵심 정리
3장 LangChain
3.1 LangChain 첫걸음
3.1-1 LLM 개발, 생각보다 복잡하다
3.1-2 LangChain 소개
3.1-3 LangChain과 커뮤니티
3.1-4 LangChain 공식문서
3.2 챗 모델
3.2-1 Invoke 메서드로 챗 모델 호출하기
3.2-2 챗 모델 활용하기
3.2-3 스트리밍 호출
3.2-4 다양한 모델 공급자 지원
3.3 메시지
3.3-1 메시지 타입
3.3-2 왜 여러 유형의 메시지가 필요할까?
3.3-3 SystemMessage 활용하기
3.3-4 AIMessage 활용하기
3.3-5 스트리밍과 MessageChunk
3.4 프롬프트
3.4-1 프롬프트란 무엇인가?
3.4-2 왜 프롬프트가 중요한가?
3.4-3 프롬프트 템플릿이 필요한 이유
3.4-4 프롬프트 템플릿 사용하기
3.5 러너블
3.5-1 러너블이란 무엇인가?
3.5-2 왜 러너블이 중요한가?
3.5-3 러너블의 핵심 인터페이스
3.5-4 러너블 활용 예제
3.5-5 RunnableLambda
3.6 러너블 설정
3.6-1 RunnableConfig
3.6-2 콜백
3.6-3 Configurable
3.7 LCEL
3.7-1 LCEL 기본 문법
3.7-2 함수 연결하기
3.7-3 RunnableParallel
3.7-4 RunnablePassthrough
핵심 정리
4장 프롬프트 엔지니어링프롬프트 엔지니어링
4.1 프롬프트 엔지니어링 소개
4.1-1 프롬프트 엔지니어링이 해결하는 문제들
4.1-2 프롬프트 엔지니어링을 시작하기 전에
4.1-3 프롬프트 엔지니어링은 반복적인 과정이다
4.2 프롬프트 엔지니어링의 기본 원칙
4.2-1 명확하고 직접적이며 상세하게
4.2-2 구조화 프롬프트: XML과 Markdown 활용
4.2-3 실전 예시: 구조화 프롬프트
4.3 프롬프트 엔지니어링의 핵심 기법
4.3-1 페르소나
4.3-2 맥락 정보 제공하기
4.3-3 사고 연쇄
4.3-4 퓨샷 프롬프팅
4.4 모델 파라미터: 프롬프트를 넘어 LLM을 제어하는 힘
4.4-1 샘플링 파라미터: 출력의 다양성 제어
4.4-2 출력 제어 파라미터
4.4-3 반복 억제 파라미터 116
4.4-4 프로덕션 환경에서의 최적화
핵심 정리
2부 핵심 구성 요소
RAG
5장 RAG
5.1 LLM 모델의 한계
5.1-1 정적인 학습 데이터의 한계
5.1-2 지식 단절 문제
5.1-3 환각 현상과의 연결
5.1-4 파인튜닝의 한계
5.1-5 더 나은 해결책의 필요성
5.2 RAG 소개
5.2-1 RAG란?
5.2-2 RAG의 장점
5.2-3 RAG의 핵심 구성 요소
5.3 RAG 구현
5.3-1 OpenSearch 소개
5.3-2 OpenSearch 설치
5.3-3 문서 인덱싱
5.3-4 검색 및 답변 생성
5.3-5 LangChain LCEL을 활용한 간편 구현
5.4 Retriever 성능 개선 - Hybrid Search
5.4-1 임베딩이란?
5.4-2 검색 방식의 종류
5.4-3 하이브리드 검색 구현
5.4-4 가중치 튜닝
핵심 정리
메모리
6장 메모리
6.1 메모리란?
6.1-1 메모리가 없을 때
6.1-2 메모리가 있을 때
6.1-3 LLM은 왜 기억을 못할까?
6.2 메모리 전략
6.2-1 전체 저장(Full History)
6.2-2 최근 N개만 저장(Window)
6.2-3 요약 저장(Summary)
6.2-4 전략 비교
6.3 전체 대화 저장하기
6.3-1 기본 구현
6.3-2 동작 원리
6.3-3 대화 기록 확인하기
6.3-4 session_id의 중요성
6.4 최근 대화만 저장하기
6.4-1 메시지 자르기 구현
6.4-2 trim_messages 옵션
6.4-3 토큰 기반 자르기
6.5 대화 요약하기
6.5-1 요약 메모리 구현
6.5-2 동작 원리
6.5-3 다양한 저장소 활용하기
핵심 정리
7장 메모리
도구와 MCP
7.1 도구와 MCP 개요
7.1-1 LLM과 도구의 역할 분담
7.1-2 도구의 개념과 구조 176
7.1-3 LangChain에서의 도구 정의 방식
7.2 MCP 프로토콜 이해하기
7.2-1 MCP의 아키텍처
7.2-2 도구 발견과 호출: tools/list, tools/call
7.2-3 오류 처리
7.2-4 MCP와 LangChain 통합
7.2-5 MCP 도입 시 고려사항
핵심 정리
구조화된
8장 구조화된 출력출력
8.1 구조화된 출력이란?
8.1-1 자유 텍스트 응답의 문제
8.1-2 약속된 형식으로 응답받기
8.1-3 구조화된 출력이 없을 때
8.1-4 구조화된 출력이 있을 때
8.1-5 핵심 장점
8.2 Pydantic 스키마 기초
8.2-1 Pydantic이란?
8.2-2 BaseModel로 스키마 정의하기
8.2-3 Field로 상세 설명 추가하기
8.2-4 타입 힌트의 중요성
8.2-5 완성된 스키마 예제
8.2-6 스키마 설계 원칙
8.3 LangChain에서 구조화된 출력 사용하기
8.3-1 with_structured_output 메서드
3-2 기본 사용법
8.3-3 반환 값은 Pydantic 객체
8.3-4 동작 원리
8.3-5 프롬프트와 함께 사용하기
8.4 method 옵션 이해하기
8.4-1 세 가지 method 옵션
8.4-2 json_schema (기본값)
8.4-3 function_calling
8.4-4 json_mode
8.4-5 method 선택 가이드
8.4-6 코드 예제
8.4-7 strict 옵션
8.4-8 include_raw 옵션
8.5 실전 활용
8.5-1 여러 휴가 신청 한 번에 처리하기
8.5-2 선택지 제한하기
8.5-3 선택적 필드 처리하기
핵심 정리
3부 에이전트 구축
9장 에이전트 구축
LangGraph
9.1 LangGraph란?
9.1-1 왜 LangGraph인가?
9.1-2 LangGraph의 핵심 아이디어
9.1-3 LCEL vs. LangGraph
9.2 StateGraph의 기본 구조
9.2-1 State: 그래프의 메모리
9.2-2 Node: 작업 수행자
9.2-3 Edge: 연결 경로
9.2-4 첫 번째 그래프 만들기
9.3 노드와 엣지 추가하기
9.3-1 노드 등록하기
9.3-2 순차 연결
9.3-3 조건부 분기
9.3-4 HR 요청 분류 에이전트
9.3-5 루프
9.3-6 병렬 실행
9.3-7 Subgraph
9.3-8 동적 라우팅
9.4 그래프 실행하기
9.4-1 컴파일
9.4-2 동기 실행(invoke)
9.4-3 스트리밍 실행
9.4-4 실행 흐름 디버깅
9.5 영속성과 체크포인트
9.5-1 왜 영속성이 필요한가?
9.5-2 InMemorySaver 사용하기
9.5-3 세션 관리 (thread_id)
9.5-4 휴먼 인 더 루프
핵심 정리
10장 단일 에이전트 설계단일 에이전트 설계
10.1 서비스 요구에서 단일 에이전트 설계까지
10.1-1 기능 요구를 에이전트 문제로 바꾸기
10.1-2 입력·출력·품질 기준으로 다시 쓰기
10.2 단일 에이전트 아키텍처의 기본 구조
10.2-1 한 화면·한 엔드포인트·한 에이전트
10.2-2 입력 파싱·검증 레이어
10.2-3 LLM + RAG + 도구 호출 레이어
10.2-4 후처리·포맷팅 레이어
10.2-5 관측 가능성·오류 처리 레이어
10.3 단일 에이전트를 위한 선형 워크플로우 패턴
10.3-1 왜 ‘선형 워크플로우’로 보는가?
10.3-2 패턴 A: 기본 순차형 워크플로우
10.3-3 패턴 B: 의도 분기형 워크플로우
10.3-4 패턴 C: 병렬 도구 호출 워크플로우
10.3-5 패턴 D: 툴 퍼스트 워크플로우
10.3-6 패턴 선택을 위한 간단한 체크리스트
10.4 에이전틱 워크플로우와 LangChain ReAct 에이전트
10.4-1 선형 워크플로우에 ‘선택과 반복’ 더하기
10.4-2 ReAct 패턴: 생각과 행동의 반복
10.4-3 create_agent로 ReAct 에이전트 만들기
10.4-4 단일 에이전트에서 에이전틱 워크플로우를 어디까지 쓸까?
10.5 실습 선형 워크플로우 + ReAct 에이전트 + 휴먼 인 더 루프
10.5-1 시나리오: 교육비 지원 신청 에이전트
10.5-2 도구 정의하기: 선형 워크플로우를 잘게 나누기
10.5-3 휴먼 인 더 루프 미들웨어로 승인 단계 추가하기
10.5-4 간단한 CLI 루프로 에이전트 실행해 보기
10.5-5 선형 워크플로우의 패턴과 휴먼 인 더 루프를 어떻게 조합했는가?
10.6 단일 에이전트의 한계 신호 읽기
10.6-1 단일 에이전트가 한계에 다다랐다는 신호들
10.6-2 단일 에이전트에서 확장해 나갈 때 확인할 것들
핵심 정리
11장 멀티 에이전트 멀티 에이전트
11.1 단일 에이전트를 넘어서는 문제들
11.1-1 단일 에이전트 복잡도를 보는 네 가지 축
11.1-2 멀티 에이전트를 고려해야 하는 시점
11.1-3 멀티 에이전트의 장단점: 구조·운영·서비스 관점에서 보기
11.2 멀티 에이전트 구조의 구성 요소
11.2-1 역할 중심 에이전트 정의
11.2-2 상태 중심 설계
11.2-3 상위 그래프와 서브그래프
11.3 주요 멀티 에이전트 패턴
11.3-1 라우터-전문가 패턴
11.3-2 검증자·가드레일 패턴
11.3-3 기타 패턴
11.4 실습 예제 LangGraph로 멀티 에이전트 그래프 설계·구현하기
11.4-1 예제 구조 한눈에 보기
11.4-2 도메인별 단일 에이전트 만들기(create_agent)
11.4-3 create_supervisor로 라우터-전문가 패턴 구현하기
11.4-4 수동 StateGraph 설계와 Supervisor 패턴 비교
11.5 도메인 예제 HR 상담 서비스에 멀티에이전트 적용하기
11.5-1 전체 구조 한눈에 보기
11.5-2 에이전트별 설계 포인트
11.5-3 운영 중 구조를 진화시키기
11.5-4 멀티 에이전트 설계 시 스스로에게 던질 질문
핵심 정리
4부 프로덕션 운영
12장 관측 가능성
관측 가능성
12.1 에이전트 관측 가능성
12.1-1 에이전트 운영의 출발점
12.1-2 우리가 다루는 관측 가능성의 영역
12.1-3 에이전트 관찰의 단위
12.1-4 관찰을 이루는 세 가지 축
12.1-5 실전 도구와 12장의 흐름
12.2 로그와 지표
12.2-1 에이전트 실행 로그의 계층 구조
12.2-2 단위별 필수 로그 필드
12.2-3 관찰 도구와 애플리케이션 로그의 역할 분담
12.2-4 기본 지표 설계
12.2-5 단위별 지표
12.2-6 운영 전략
12.3 흐름 추적
12.3-1 로그와 지표 사이를 잇는 퍼즐 조각
12.3-2 에이전트 실행을 흐름으로 그려 보기
12.3-3 Langfuse 설치 및 설정
12.3-4 Langfuse의 흐름 추적 모델: Trace와 Observation
12.3-5 LangGraph + LangChain + Langfuse 연동 예시
12.3-6 흐름 추적을 운영에 활용하는 방법
12.4 관측 가능성을 활용한 운영 흐름
12.4-1 질문에서 출발하는 운영 흐름
12.4-2 자주 마주치는 세 가지 상황
핵심 정리
13장 평가와 품질 관리평가와 품질 관리
13.1 RAG 평가 지표
13.1-1 검색기 평가
13.1-2 Generator 평가
13.1-3 End-to-End 평가
13.1-4 평가 지표 선택 가이드
13.2 평가 도구와 자동화
13.2-1 Langfuse로 평가 점수 기록
13.2-2 RAGAS로 자동 평가
13.2-3 Langfuse와 RAGAS 통합
13.3 LLM 평가와 로직 기반 평가
13.3-1 LLM-as-a-judge란?
13.3-2 LLM 평가 구현
13.3-3 로직 기반 평가(Structured Output 검증)
13.3-4 CI/CD 파이프라인에 통합
13.3-5 평가 방법 선택 가이드
13.4 Reasoning 디버깅 실패 원인 추적하기
13.4-1 최종 답변만으로는 원인을 알 수 없다
13.4-2 에이전트의 실행 단계 이해하기
13.4-3 content_blocks로 모델의 사고 과정 들여다보기
핵심 정리
14장 성능 & 비용 최적화
능 & 비용 최적화
14.1 왜 최적화가 필요한가?
14.1-1 생성형 AI 서비스가 다른 이유
14.4-2 비용 계산해 보기
14.1-3 속도 문제
14.1-4 최적화의 세 가지 축
14.2 측정 최적화의 시작점
14.2-1 무엇을 측정해야 하는가?
14.2-2 워터폴 분석
14.2-3 Langfuse에서 병목 찾기
14.2-4 비용 측정
14.2-5 측정 후 우선순위 정하기
14.3 병렬 처리 속도의 핵심
14.3-1 순차 실행의 문제
14.3-2 병렬 실행의 효과
14.3-3 LangGraph로 병렬 처리 구현
14.3-4 배치 처리
14.3-5 병렬 처리 시 주의사항
14.3-6 실전 패턴: 검색 + 검증 병렬화
14.4 추론 강도 조절
14.4-1 Reasoning Effort란?
14.4-2 분류기 기반 라우팅
14.4-3 계단식 호출(Cascading)
14.4-4 LangGraph로 라우팅 구현
14.4-5 Fallback 패턴
14.4-6 라우팅 시 주의사항
14.5 프롬프트 & 토큰 최적화
14.5-1 프롬프트 압축
14.5-2 출력 길이 제한
14.5-3 대화 요약으로 컨텍스트 절감
14.5-4 컨텍스트 필터링
14.5-5 토큰 수 추정
핵심 정리
15장 신뢰성과 에러 처리뢰성과 에러 처리
15.1 AI 에이전트의 실패 이해하기
15.1-1 오류와 장애
15.1-2 재시도할 수 있는 오류
15.1-3 핵심 패턴
15.2 오류 처리 재시도와 폴백
15.2-1 Tenacity로 똑똑한 재시도
15.2-2 LangChain 네이티브 재시도
15.2-3 Fallback으로 오류 우회
핵심 정리
안전한 에이전트 개발
16.1 여기까지 오며 만든 것들
16.1-1 에이전트가 예상대로만 동작할까?
16.1-2 전통적인 코드 vs. AI 에이전트 16.1-3 16장에서 배울 것
16.1-4 가드레일이 필요한 순간들
16.2 시스템 프롬프트 보호하기
16.2-1 시스템 프롬프트는 왜 중요할까?
16.2-2 시스템 프롬프트 노출 시도 유형
16.2-3 방어 전략 1 프롬프트에 보호 규칙 추가
16.2-4 방어 전략 2 입력 검증 (코드 레벨)
16.2-5 방어 전략 3 민감 정보 분리
16.2-6 에이전트에 통합하기
16.3 입력 가드레일
16.3-1 입력 가드레일이란?
16.3-2 민감 정보 마스킹
16.3-3 유해 콘텐츠 필터링
16.3-4 계층화된 입력 가드레일
16.3-5 에이전트에 적용하기
16.4 출력 가드레일
16.4-1 왜 출력도 검증해야 할까?
16.4-2 출력 가드레일의 역할
16.4-3 금지 키워드 필터
16.4-4 민감 정보 마스킹
16.4-5 시스템 프롬프트 유출 탐지
16.4-6 통합 출력 가드레일
16.4-7 전체 파이프라인
16.5 에이전트 권한 제어
16.5-1 과도한 권한 부여의 위험
16.5-2 구현 예제
핵심 정리