11장 · 프레임워크 기반 에이전트 구성왜 프레임워크가 필요한가 — 루프를 계속 손으로 고칠 것인가LangChain 생태계와 모델 어댑터 — 이름이 여러 개인 이유직접 만든 루프와 create_agent — 무엇이 무엇이 되는가실행 추적 — 답변이 아니라 과정을 본다따라하기 — LangChain으로 에이전트 다시 만들기정리와 체크리스트실습문제와 해답
11장. 프레임워크 기반 에이전트 구성
정리와 체크리스트
11장에서 배운 것
- 프레임워크 — 여러 프로그램에 공통인 뼈대를 미리 만들어 둔 것. 우리는 그 위에 우리 것만 얹습니다.
- LangChain — LLM 에이전트용 프레임워크.
create_agent가 에이전트 루프를 만들어 줍니다. - 모델 어댑터 — 서로 다른 회사의 모델을 같은 모양으로 감싸는 부품. Gemini용은
ChatGoogleGenerativeAI입니다. tool()— 함수의 이름·타입 힌트·독스트링으로 도구 선언을 만듭니다.- 메시지 —
HumanMessage,AIMessage,ToolMessage. 9장의contents에 쌓이던 것의 새 이름입니다. - 실행 추적 — 어떤 도구를 불렀고 무엇을 받았는지 남긴 기록. 답을 믿을 근거입니다.
- 회귀 세트 — 고칠 때마다 다시 돌리는 고정된 질문 묶음.
- 미들웨어 — 에이전트의 각 단계 앞뒤에 끼워 넣는 부품. 호출 횟수 제한 같은 장치를 답니다.
한눈에 보는 핵심
llm = ChatGoogleGenerativeAI(model=MODEL, google_api_key=...) # 모델 어댑터
TOOLS = [tool(raw["get_my_orders"]), ...] # 8장의 함수를 감싼다
agent = create_agent(model=llm, tools=TOOLS, system_prompt=SYSTEM)
for chunk in agent.stream({"messages": [...]}, stream_mode="values"):
... # 새 메시지만 골라 기록
| 프레임워크가 하는 일 | 모델이 하는 일 | 우리가 하는 일 |
|---|---|---|
| 모델 호출과 도구 실행을 반복한다 | 어떤 도구를 부를지 고른다 | 도구가 할 수 있는 일의 범위를 정한다 |
| 메시지를 차례로 쌓는다 | 도구 결과를 읽고 다음 행동을 정한다 | 시스템 프롬프트를 쓴다 |
| 모델마다 다른 형식을 맞춘다 | 최종 답변을 쓴다 | 비용 상한과 한도에 닿았을 때의 대응을 정한다 |
체크리스트
- [ ] 직접 만든 루프를 프레임워크로 옮기는 이유를 설명할 수 있다.
- [ ] 모델 어댑터가 무엇을 해 주는지 설명할 수 있다.
- [ ] 9장의
contents,function_calls,react_loop가 LangChain에서 각각 무엇이 되는지 말할 수 있다. - [ ]
tool()로 감싼 뒤에도 본인 주문만 조회되는 이유를 설명할 수 있다. - [ ]
invoke와stream의 차이를 설명할 수 있다. - [ ] 추적에서 도구 결정, 도구 결과, 최종 답변을 가려낼 수 있다.
- [ ] 답변에 숫자가 있는데 도구 호출 기록이 없으면 무엇을 의심해야 하는지 안다.
- [ ]
AIMessage.content가 문자열이 아닐 수 있음을 알고, 글자만 꺼내는 방법을 안다. - [ ] 프레임워크로 옮긴 뒤에도 우리에게 남는 일 세 가지를 말할 수 있다.
한 줄 핵심
프레임워크는 루프를 대신 돌려 줍니다. 무엇을 허용하고, 얼마까지 쓰고, 어디서 멈출지는 여전히 우리가 정합니다.