■ StateGraph 클래스의 compile 메소드를 사용해 그래프로 언어 에이전트를 만드는 방법을 보여준다.
※ OPENAI_API_KEY 환경 변수 값은 .env 파일에 정의한다.
▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain_core.tools import tool from langgraph.graph import StateGraph from langgraph.graph import MessagesState from langgraph.prebuilt import ToolNode from langgraph.graph import START from typing import Literal from langgraph.graph import END from langgraph.checkpoint.memory import MemorySaver from langchain_core.messages import HumanMessage load_dotenv() chatOpenAI = ChatOpenAI(model = "gpt-4o-mini", temperature = 0) # 에이전트가 사용할 도구를 정의한다. @tool def search(query : str): """Call to surf the web.""" # 아래 코드는 테스트용이다. if "sf" in query.lower() or "san francisco" in query.lower(): return "It's 60 degrees and foggy." return "It's 90 degrees and sunny." toolList = [search] runnableBinding = chatOpenAI.bind_tools(toolList) # 새로운 그래프 정의한다. stateGraph = StateGraph(MessagesState) # 모델을 호출하는 함수를 정의한다. def callModel(messageState : MessagesState): messageList = messageState["messages"] responseAIMessage = runnableBinding.invoke(messageList) # 기존 목록에 추가되므로 목록을 반환한다. return {"messages" : [responseAIMessage]} toolNode = ToolNode(toolList) # 우리가 순환할 두 노드를 정의한다. stateGraph.add_node("agent_node", callModel) stateGraph.add_node("tool_node" , toolNode ) # 진입점을 `agent`로 설정한다. # 이는 이 노드가 호출된 첫 번째 노드라는 것을 의미한다. stateGraph.add_edge(START, "agent_node") # 계속할지 여부를 결정하는 함수를 정의한다. def shouldContinue(messageState : MessagesState) -> Literal["tool_node", END]: memessageList = messageState["messages"] lastMessage = memessageList[-1] # LLM이 도구 호출을 하면 "도구" 노드로 라우팅한다. if lastMessage.tool_calls: return "tool_node" # 그렇지 않으면 우리는 (사용자에게 답변)을 중단한다. return END # 이제 조건부 에지를 추가한다. stateGraph.add_conditional_edges( # 먼저 시작 노드를 정의한다.하 # `agent_node`를 사용한다. # 즉, `agent_node` 노드가 호출된 후에 취해진 에지이다. "agent_node", # 다음으로, 다음에 어떤 노드가 호출되는지 결정하는 함수를 전달한다. shouldContinue, ) # 이제 `tool_node`에서 `agent_node`로 일반 에지를 추가한다. # 즉, `tool_node`가 호출된 후 `agent_node`가 다음으로 호출된다. stateGraph.add_edge("tool_node", 'agent_node') # 그래프 실행 사이에 상태를 유지하기 위해 메모리를 초기화한다. memorySaver = MemorySaver() # 마지막으로, 컴파일한다. # 이렇게 하면 LangChain Runnable로 컴파일된다. # 즉, 다른 모든 실행 파일처럼 사용할 수 있다. # 그래프를 컴파일할 때 (선택적으로) 메모리를 전달한다는 점에 유의한다. compiledStateGraph = stateGraph.compile(checkpointer = memorySaver) graph = compiledStateGraph.get_graph() pngBytes = graph.draw_mermaid_png() with open("state_graph.png", "wb") as bufferedWriter: bufferedWriter.write(pngBytes) addableValuesDict = compiledStateGraph.invoke({"messages" : [HumanMessage(content = "what is the weather in sf")]}, config = {"configurable" : {"thread_id" : 42}}) print(addableValuesDict["messages"][-1].content) """ The current weather in San Francisco is 60 degrees and foggy. """ |
▶ requirements.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
aiohappyeyeballs==2.4.4 aiohttp==3.11.11 aiosignal==1.3.2 annotated-types==0.7.0 anyio==4.7.0 attrs==24.3.0 certifi==2024.12.14 charset-normalizer==3.4.0 colorama==0.4.6 distro==1.9.0 frozenlist==1.5.0 greenlet==3.1.1 h11==0.14.0 httpcore==1.0.7 httpx==0.28.1 idna==3.10 jiter==0.8.2 jsonpatch==1.33 jsonpointer==3.0.0 langchain==0.3.13 langchain-core==0.3.28 langchain-openai==0.2.14 langchain-text-splitters==0.3.4 langgraph==0.2.60 langgraph-checkpoint==2.0.9 langgraph-sdk==0.1.48 langsmith==0.2.4 msgpack==1.1.0 multidict==6.1.0 numpy==2.2.1 openai==1.58.1 orjson==3.10.12 packaging==24.2 propcache==0.2.1 pydantic==2.10.4 pydantic_core==2.27.2 python-dotenv==1.0.1 PyYAML==6.0.2 regex==2024.11.6 requests==2.32.3 requests-toolbelt==1.0.0 sniffio==1.3.1 SQLAlchemy==2.0.36 tenacity==9.0.0 tiktoken==0.8.0 tqdm==4.67.1 typing_extensions==4.12.2 urllib3==2.3.0 yarl==1.18.3 |
※ pip install python-dotenv langchain langchain-openai langgraph 명령을 실행했다.