생성형 AI를 법률 분야에 활용하기 위한 실험으로, LangGraph와 Pinecone, OpenAI API, SentenceTransformer 등을 조합하여 한국어 법률 조언 에이전트 파이프라인을 구축했습니다.

LangGraph를 통해 각 에이전트를 node로 등록하고, 그 사이 흐름을 edge로 연결했습니다.
g.add_node("filter", filter_agent)
g.add_node("retrieve", retrieve_ctx)
g.add_node("lawyer", lawyer_agent)
g.add_node("judge", judge_agent)
g.set_entry_point("filter")
g.add_edge("filter", "retrieve")
g.add_edge("retrieve", "lawyer")
g.add_edge("lawyer", "judge")
g.add_conditional_edges("judge", route, {
"lawyer": "lawyer", # 점수가 낮으면 다시 lawyer로 되돌림
END: END # 점수 통과 시 종료
})
def route(state: LegalState) -> str:
if state.score >= 80 or state.retry >= MAX_RETRY:
return END
state.retry += 1
return "lawyer"
model = SentenceTransformer("jhgan/ko-sroberta-multitask")
def query_top_k(text: str, namespace: str, k: int):
vector = model.encode(text).tolist()
result = index.query(vector=vector, top_k=k, include_metadata=True, namespace=namespace)
return [match["metadata"]["text"] for match in result["matches"]]
@dataclass
class LegalState:
question: str
category: str = "privacy"
ctx_texts: List[str] = field(default_factory=list)
advice: str = ""
score: int = 0
feedback: str = ""
retry: int = 0

langgraph에서 나오는 "recursive 25 limit" 오류는 LangGraph 내부에서 재귀적으로 노드(예: agent, 상태 등) 를 실행하는 과정이 최대 25번까지만 허용되기 때문에 발생하는 오류입니다.
LangGraph는 상태 기반 흐름을 순차적으로 따라가며 각 노드를 실행합니다.
하지만 특정 조건에서 루프(loop) 또는 재귀적인 분기가 설정되어 있을 경우, 실수로 무한 루프에 빠질 수 있습니다.
이를 방지하기 위해 LangGraph는 다음과 같은 제한을 둡니다:
python
복사편집
def route(state: LegalState) -> str:
if state.score >= 80:
return END
return "lawyer" # 다시 lawyer로 루프
이런 구조는 judge -> lawyer -> judge -> lawyer ... 순환을 만드는데, 점수가 계속 80 미만이면 25번까지 반복하다가 오류 발생:
RuntimeError: Recursive execution limit (25) reached.
MAX_RETRY를 설정하고 이를 기반으로 루프 중단:
MAX_RETRY = 2
def route(state: LegalState) -> str:
if state.score is None:
return "lawyer"
if state.score >= 80 or state.retry >= MAX_RETRY:
return END
state.retry += 1
return "lawyer"
LangGraph 내에서 루프를 쓸 경우 retry를 명시적으로 제한
이미 retry 필드를 두신 건 매우 좋은 구조예요! state.retry >= MAX_RETRY 조건은 반드시 넣어주세요.
🔗 관련 기술 참고: