inflearn logo
강의

Course

Instructor

RAG System Implemented with AI Agents (w. LangGraph)

섹션 5, 사용자 정의 조건부 엣지 관련 질문입니다.

169

qkenr1321559

4 asked

0

from langgraph.graph import MessagesState, StateGraph, START, END
from langchain_core.messages import HumanMessage, SystemMessage
from langgraph.prebuilt import ToolNode
from IPython.display import Image, display

# LangGraph MessagesState 사용
class GraphState(MessagesState):
    pass

# 노드 구성 
def call_model(state: GraphState):
    system_message = SystemMessage(content=system_prompt)
    messages = [system_message] + state['messages']
    response = llm_with_tools.invoke(messages)
    return {"messages": [response]}

def should_continue(state: GraphState):
    last_message = state["messages"][-1]
    # 도구 호출이 있으면 도구 실행 노드로 이동
    if last_message.tool_calls:
        return "execute_tools"
    # 도구 호출이 없으면 답변 생성하고 종료 
    return END

# 그래프 구성
builder = StateGraph(GraphState)
builder.add_node("call_model", call_model)
builder.add_node("execute_tools", ToolNode(tools))

builder.add_edge(START, "call_model")
builder.add_conditional_edges(
    "call_model", 
    should_continue,
    {
        "execute_tools": "execute_tools",
        END: END
    }
)
builder.add_edge("execute_tools", "call_model")

graph = builder.compile()

# 그래프 출력 
display(Image(graph.get_graph().draw_mermaid_png()))
# 그래프 실행
inputs = {"messages": [HumanMessage(content="스테이크 메뉴의 가격은 얼마인가요?")]}
messages = graph.invoke(inputs)

위 코드는 강사님께서 제공해주신 코드를 가져온 것입니다.

제가 궁금한 것은 Tool 노드를 사용하고 다시 call_model 노드로 왔을 때 SytemMessage가 중복되지 않을까? 라는 생각을 했습니다.

 

예를 들어 message : [유저 인풋] 가 처음으로 그래프에 들어오게된다면

def call_model(state: GraphState):
    system_message = SystemMessage(content=system_prompt)
    messages = [system_message] + state['messages']
    response = llm_with_tools.invoke(messages)
    return {"messages": [response]}

message : SystemMessage + [유저 인풋]

이 될것입니다.

그 이후 response를 호출하여

message : SystemMessage + [유저 인풋] + toolMessage

이 되어 상태를 업데이트 하고,

 

그리고 tool 콜이 있어서 툴노드를 마무리 한 이후 돌아왔을 땐 GraphState에 있는 message는 SystemMessage + [유저 인풋] + toolMessage + [툴이보낸 메세지] 일테니

call model 노드에서

SystemMessage + SystemMessage + [유저 인풋] + toolMessage + [툴이보낸 메세지]

가 적용되어 툴 콜 할때마다 SytemMessage가 쌓이는 구조가 되지 않을까 생각이 들었는데 맞을까요?

 

 

llm langchain rag ai-agent langgraph

Answer 1

0

pdstudio

안녕하세요! 좋은 질문입니다.

우려하신 부분은 이해가 됩니다. 그러나 이 코드에서는 시스템 메시지가 중복되어 쌓이지 않습니다.

  1. call_model 함수 내부를 보면:

    def call_model(state: GraphState):
        system_message = SystemMessage(content=system_prompt)
        messages = [system_message] + state['messages']
        response = llm_with_tools.invoke(messages)
        return {"messages": [response]}
    
  2. 중요한 부분은 return {"messages": [response]} 입니다. 이 부분이 상태를 어떻게 업데이트하는지가 중요합니다.

  3. MessagesState는 메시지 배열을 관리하는 특별한 상태 클래스인데, return {"messages": [response]} 코드는 기존 메시지를 대체하지 않고 추가합니다.

  4. 하지만 system_message는 매번 함수 호출시 새로 생성되어 임시로 메시지 목록에 추가되고, 상태에는 중복 저장되지 않습니다.

  5. 최종 상태에 저장된 messages 속성의 목록을 확인해보시면 됩니다.



    감사합니다.

     

법률 실습 data 안에 pdf 파일 없음

0

50

2

엥?? 화면이 안나옵니다.

0

83

1

버전에 3.11이랑 3.11.X 랑 차이가 있나요?

0

96

1

왜 파이썬 버전을 같게 해야하는가?

0

128

3

poetry 설정을 어떻게 해야하나요?

0

175

5

섹션2-11 내용중 tool_call

0

89

2

gradio 를 통한 챗봇 인터페이스 실습이 진행되지 않습니다.

0

218

2

모델의 성능에 따라서 선택하는 도구가 많이 차이 나나요?

0

200

2

Fan-in 시 여러개 노드에서 하나로 병합되는 과정에서 질문 입니다.

0

143

3

로드맵

0

154

2

강의 46에서 노드의 병렬 수행시 Thread-Safety 문제는 없을까요?

0

164

2

similarity_search 후 왜 다시 LLM을 통해 grade를 측정 하나요?

0

163

2

agent_executor 실행시 JSONDecodeError에러가 발생해요.

0

215

4

툴의 숫자가 많을때 동작

0

185

2

안녕하세요 후속강의 듣고 싶은데, 비용이 부담되어서..

0

187

2

[실습을 위한 환경 설정 방법] 자료가 없습니다.

0

246

3

최근 안내해주신 수강생 이벤트 관련 문의입니다.

0

141

1

AI 에이전트로 구현하는 RAG 시스템 수강생입니다.

0

195

1

수업 자료 문의

0

244

3

docker 환경에서 해당 서비스를 구성해보는 건 어떤가요?

0

228

2

numpy 설치 에러

0

621

1

The onnxruntime python package is not installed.

0

273

1

강사님의 LLM 모델의 버전이 어떻게 되나요?

0

260

1

Agent RAG 구현에서 '정보 추출 및 평가' 노드 결과 애러

0

174

2