LangGraph에서 에이전트가 멈추는 이유 – Human in the Loop 설계 패턴 정리

langgraph human in the loop

에이전트가 멈춰야 할 때 멈추지 않거나, 멈추지 말아야 할 때 멈추는 문제를 LangGraph로 멀티에이전트 시스템을 운영하면서 꽤 오래 고민했다. 이론적으로 Human-in-the-Loop는 단순하다. 에이전트가 스스로 판단하기 어려운 지점에서 사람에게 확인을 요청하고, 사람의 입력을 받아서 다시 진행하는 것이다. 그런데 실제로 구현해보면 “어느 노드에 interrupt를 거냐”와 “체크포인터를 어떻게 설계하냐”가 에이전트 전체 흐름을 좌우한다는 걸 알게 된다. 이 글은 … Read more

RAG 파이프라인 구축부터 운영까지! 실무에서 쌓은 것들 한방에 정리!

rag파이프라인구축

어느 순간부터 RAG 파이프라인을 짜는 것보다 운영하는 게 더 어렵다는 걸 알게 됐다. 처음에는 임베딩 모델을 골라서 벡터 DB에 인덱싱하고, 유사도 검색으로 컨텍스트를 뽑아서 LLM에 넘기면 끝이라고 생각했다. 실제로 돌려보기 전까지는 그렇게 생각했다. 그런데 막상 프로덕션에 올리면 다른 세계가 펼쳐진다. 검색 정확도가 쿼리 유형마다 들쭉날쭉하고, FastAPI 서버는 동시 요청 몇 개에 응답이 뭉개지고, 벡터 DB … Read more

Codex vs Claude Code AI 에이전트 개발할 때 어떤 걸 켜야 하나

codex_claude_code

두 도구를 다 써보지 않으면 비교를 제대로 할 수 없다. Codex vs Claude Code 비교 글이 검색하면 나오긴 하는데, 대부분 스펙 표를 나열하거나 벤치마크 숫자로 끝난다. 실제로 LangGraph 에이전트를 만들고, RAG 파이프라인을 디버깅하는 맥락에서 두 도구를 번갈아 쓰면서 느낀 차이는 그 표들이 잘 담지 못하는 부분에 있었다. 나는 LangGraph 기반 멀티에이전트 시스템을 운영하고, RAG 파이프라인 … Read more

LangGraph 에이전트에 PostgreSQL BM25를 직접 붙여본 기록 – Elasticsearch 없이 검색 노드 만들기

PostgreSQL_BM25

며칠 전 PostgreSQL 안에서 BM25 검색이 네이티브로 돌아간다는 소식을 보고 바로 테스트해봤다. 그동안 하이브리드 검색을 하려면 BM25는 PostgreSQL의 tsvector로 어설프게 흉내내거나, 아예 Elasticsearch를 따로 띄우는 수밖에 없었다. 그런데 이제 PostgreSQL 익스텐션 하나로 진짜 BM25 스코어링이 인덱스 레벨에서 돈다는 거다. 마침 LangGraph 에이전트의 검색 노드를 손보던 시기여서, 바로 적용해봤다. 이 글은 그 적용 과정과 결과를 정리한 … Read more

FastAPI RAG 서버가 느려진 이유! 비동기인데 왜 막히나 싶었던 디버깅 기록

fastapi_rag_비동기

분명히 비동기로 짰는데 왜 느려지는 거지. RAG 서버 운영하면서 가장 많이 했던 생각이 이거다. FastAPI는 처음부터 async를 전제로 설계된 프레임워크다. 동시성 처리에 강하다는 게 거의 상식처럼 통한다. 그런데 실제로 RAG 파이프라인을 얹어서 운영해보면, “비동기로 썼다”는 사실 자체가 성능을 보장해주지 않는다는 걸 몸으로 배운다. 이 글은 내가 운영하던 RAG API가 동시 요청 몇 개만 들어와도 응답 … Read more