
AI 에이전트를 직접 만들어보고 싶다는 생각은 계속 있었는데, 좋은 기회가 되어 이번에 제대로 학습해보게 되었습니다.
길벗 출판사의 《처음 만드는 AI 에이전트 서비스》는 개발 환경 설정부터 LangChain 기초, Tool 구현, 에이전트 제작, 그리고 FastAPI + React로 서비스를 완성해 배포하는 것까지 하나의 흐름으로 이어집니다. 1주차에는 Part 1(1~4장)을 모두 학습했습니다.
1~2장. 환경 설정과 LangChain 첫 호출
1장은 가상환경을 만들고 프로젝트 구조를 잡는 것으로 시작합니다. 최종 목표물인 'AI 글 분석 에이전트'의 전체 구조(요약 / 감성 분석 / 재작성 중 에이전트가 스스로 골라 실행)를 먼저 보여주고 시작하는 점이 좋았어요. 뭘 만들지 알고 시작하니 이후 내용이 훨씬 잘 이해되는 것 같았습니다.
2장에서는 LangChain으로 실제 LLM을 호출해봤습니다. LangChain의 핵심은 모델을 바꿔도 코드 구조는 그대로 유지된다는 것. 인상 깊었던 건 API 키 관리 부분인데, .env에 키를 두고 .gitignore에 반드시 추가하는 원칙을 초반에 못 박고 갑니다. 그리고 SystemMessage / HumanMessage / AIMessage의 구분 — 이전 응답(AIMessage)까지 함께 넘겨야 대화 맥락이 유지된다는 게 개념적으로 정리가 됐습니다.
3장. 프롬프트를 코드처럼 다루기
3장은 프롬프트를 '잘 쓰는 법'이 아니라 '구조화하는 법'에 대한 내용이었습니다. f-string으로 문자열을 조립하던 걸 PromptTemplate으로 바꾸고, 대화 구조가 필요하면 ChatPromptTemplate으로 역할까지 한 번에 정의하는 식이죠. 대화 이력을 통째로 끼워 넣는 MessagesPlaceholder, 변수를 미리 채워두는 partial()까지 보고 나니 프롬프트도 결국 관리 대상이라는 감이 왔습니다.
호출 방식도 invoke() / batch() / stream() 세 가지를 상황별로 나눠 설명해줘서, 나중에 화면에 실시간 출력할 때 뭘 써야 할지 미리 그림이 그려졌습니다.
4장. LCEL과 출력 데이터 다루기 ⭐
이번 주에서 가장 얻어간 게 많은 장입니다.
LangChain의 거의 모든 구성 요소가 Runnable이라는 공통 규격을 따르기 때문에, 파이프 연산자로 prompt | llm | parser처럼 연결할 수 있습니다. 데이터 흐름이 코드에 그대로 드러나는 게 꽤 인상적이었어요.
그중에서도 특히 유용했던 네 가지를 꼽자면,
with_structured_output() — LLM 응답은 결국 문자열이라 프로그램에서 쓰려면 파싱이 필요한데, Pydantic으로 스키마를 정의하고 이걸 붙이면 응답이 바로 객체로 돌아옵니다. result.sentiment처럼 필드로 접근할 수 있으니, 정규식으로 텍스트를 긁어내던 방식과는 아예 차원이 다릅니다.
RunnablePassthrough — 앞 단계 출력에 원본 입력이 묻혀 사라지는 문제를 해결해줍니다. 중간에 원본 텍스트가 다시 필요할 때 유용해요.
assign() — 기존 입력은 그대로 둔 채 새 키를 추가하는 방식. 덮어쓰기가 아니라 누적이라는 게 핵심이라, 단계를 거칠수록 데이터가 쌓이는 구조를 만들 수 있습니다.
RunnableParallel — 요약, 감성 분석, 키워드 추출처럼 서로 의존하지 않는 작업을 동시에 실행합니다. 순차 실행 대비 대기 시간이 줄어드는 게 확실히 체감됐습니다.
마지막 4-5절 실습에서 이 셋을 조합해 텍스트 분석 파이프라인을 만드는데, 문법만 따로 볼 땐 "이걸 언제 쓰지?" 싶었던 게 여기서 한 번에 이해됐습니다.
1주차 마무리
Part 1은 결국 "LLM을 어떻게 안정적으로, 프로그램이 다룰 수 있는 형태로 호출할 것인가"에 대한 내용이었습니다. 출력을 규격화하고 데이터 흐름을 설계하는 이 부분들은 앞으로 Tool과 에이전트를 만들 때 계속 쓰일 것 같습니다.
다음 주에는 Part 2로 넘어가 Tool을 정의하고 직접 구현해볼 예정입니다. 이제 슬슬 '에이전트'다운 게 나올 차례라 기대되네요 🙂