agent 12

Langchain이 있는데, Langgraph가 왜 필요할까?

LLM 애플리케이션을 만드는데, 이미 Langchain과 같은 프레임웍이 있는데, 왜 추가로 Langgraph와 같은 프레임웍이 필요할까?예를 들어서, 질문에 대해서 구글 검색을 하고, 그 내용을 기반으로 답변하는 Agent를 만든다고 하자.아래 구조와 같이 질문을 분석해서 좀 더 명확한 프롬프트로 만들어내고, 구글 검색을 한 후, 검색 내용이 답변을 하는데 충분한 정보를 가지고 있는지 판단을 하고, 만약에 검색된 정보가 충분하지 않으면 질문을 변경해서 다시 구글 검색을 하고, 충분한 정보를 수집할때 까지 이 과정을 반복한 다음에, 이 정보를 이용해서 답변을 생성해서 리턴한다. 이 구조를 Langchain으로 만들 수 없을까?물론 가능은 하다. 대략 다음과 같은 구조를 가지면 된다. chain = ( ..

고급 Agent를 위한 Langgraph 개념 이해 #4 - Tool 호출

4. Tool 호출Graph에서 외부 Tool을 호출하는 방법에 대해서 알아보도록 하자. 먼저 Tool 함수를 정의해야 하는데,Tool을 일반적인 파이썬 함수로 정의한다. 이때 중요한 부분은 함수 첫줄에 툴에 대한 설명을 주석으로 달아줘야 한다. LLM AI 모델이 어떤 툴을 사용해야할지 판단할때 이 정보를 이용해서, 툴의 기능을 파악한 후에, 툴 호출 여부를 결정한다. 아래는 get_weather라는 툴을 정의한 코드로, 특정 지역의 날씨를 리턴하는 테스트 코드이다. (지역명이 sf나 san francisco인 경우에는 온도를 60도로, 아니면 90도 온도로 리턴한다.) 이렇게 툴을 호출하는 노드를 ToonNode라고 하는데, 인자로, 호출할 툴 함수를 정의한다. 아래 코드에서 보면 ToolNode([..

고급 Agent를 위한 Langgraph 개념 이해 #3 - Edge

3. EdgeEdge는 노드가 정의된 후에, 노드에서 호출한 다음 노드를 정의한다. 사용 방법은 매우 간단하다.아래와 같이 노드를 먼저 정의한 후에, add_edge를 이용하여 연결하고자 하는 노드 이름을 지정하면 된다. 아래 코드의 경우 node_1→node_2를 호출하는 구조를 정의하였다. builder.add_node("node_1", node_1)builder.add_node("node_2", node_2)graph.add_edge("node_1", "node_2")Conditional routing일반적인 Edge flow이외에, 조건에 따라서 특정 노드로 Routing 하도록 플로우를 정의할 수 있다. 예를 들어서 아래 그림과 같이, node_1실행후에, 조건에 따라서 node_2또는 node..

고급 Agent를 위한 Langgraph - Multi State 사용시 주의해야할점

Langgraph에서는 하나의 Graph에서 여러개의 State를 동시에 사용할 수 있다. 또한 정의된 State는 전역변수 처럼 인식되서, 다른 Node로 그 값을 넘기지 않아도 그 값이 그대로 유지되고 사용이 가능하다.예를 들어node1(State1)->State2node2(State2)->State3node3(State1)->State3로 호출하는 구조가 있다고 하자.이 경우, node1의 output인 State2는 node2의 Input에 들어가지만, node2의 output이 State3인데, node3에서 State3를 받지 않고, State1을 받을 수 있을까? 답변은 된다.State1,2,3의 정보가 같이 유지되고 있기 때문에, 이전 노드의 State가 아니더라도 사용이 가능하다. 아래 ..

고급 Agent를 위한 Langgraph 개념 이해 #2 - Node

2. NodeNode는 State 정보를 활용해서, State 정보를 변경하거나 action을 취하는 그래프내의 함수이다. 함수내에서는 LLM 모델을 실행해서 질문에 대한 정답을 찾거나 , Tool 등을 이용해서 Action을 취하거나, 또는 RAG를 통해서 질문에 필요한 추가 컨택스트 정보를 검색해와서 State에 저장해서 다음 Node에서 LLM이 답변에 활용할 수 있도록 한다. 예를 들어 web_search,chat 이라는 Node가 있을때, web_search Node에서는 Google 검색을 이용하여, 질문에 필요한 추가 정보를 검색해서 State에 저장한후, 다음 chat 노드에서 해당 State에 저장된 Context 정보를 리턴하는 식으로 구현이 된다. Node는 Python funct..

고급 Agent를 위한 Langgraph 개념 이해 #1-State

먼저 Langgraph의 개념을 이해하려면 3가지 State, Node, Edge에 대해서 알아야 한다. 각 컴포넌트의 개념과 세부 문법에 대한 이해가 없으면 어떻게 Langgraph가 작동하는지에 대해서 이해가 매우 어렵기 때문에, 이 글에서는 개념과 문법에 대해서 설명하도록 한다. 그래프는 Node로 구성이 되어 있는데, State를 받아서, 작업을 하고, State를 출력하는 역할을 한다. Node를 실행한 후에, 다른 Node를 실행하기 위해서는 Edge를 따라서, Node를 이동하게 된다. 이 개념을 그림으로 표현하면 아래와 같다. 사각형이 Node이고, Node들을 연결하는 선이 Edge, 그리고, Node들이 입력으로 받고, 업데이트 하는 것이 State (상태 정보)이다. 1. State..

Python TypedDict

TypedDict는 파이썬의 타입 힌트를 위한 기능으로, 딕셔너리의 키와 값에 대한 타입을 명시적으로 지정할 때 사용한다. 일반 dict와 달리, 정해진 키와 그에 해당하는 값의 타입을 강제하여 코드의 안정성과 가독성을 높여준다.TypedDict란 무엇인가?TypedDict는 typing 모듈에서 제공하는 클래스로, 딕셔너리의 구조를 미리 정의할 수 있게 해준다. 딕셔너리에 어떤 키가 존재해야 하는지, 그리고 각 키에 해당하는 값의 타입이 무엇인지 명시할 수 있다.이는 정적 타입 검사 도구(static type checker)가 코드 실행 전에 잠재적인 오류를 발견하도록 돕는다. 예를 들어, 존재하지 않는 키에 접근하거나 잘못된 타입의 값을 할당하려고 할 때 미리 경고를 받을 수 있다.예제TypedDic..

Google ADK와 LangGraph 비교 (Node,Edge 기반 워크플로우 정의기능)

LangGraph가 노드와 엣지 구성을 통해서 워크플로우를 정교하게 관리할 수 있는데, 그러면 Google ADK도 가능할까 해서, 예제 코드를 Gemini를 이용해서 구성해봤다. 일단 결론 부터 이야기하자면, Google ADK는 노드와 엣지의 개념은 없지만, 노드대신 에이전트로 정의한후, 이를 워크플로우로 연결이 가능하고, Loop와 Branch역시 가능하다. 아직 Node와 ADK의 Agent차이에 대해서는 좀 더 고민해봐야겠지만, 개념상으로 비슷한것은 만들수있다는 이야기.from google.adk.agents import LlmAgent, SequentialAgent, BaseAgentfrom google.adk.events import Event, EventActionsfrom google...

#19 ChatGPT에서 질문과 관련된 웹페이지 크롤링하기

조대협 (http://bcho.tistory.com) Langchain 에서 Agent가 사용하는 Tool을 사용자가 쉽게 개발해서 추가할 수 있다. 이번 예제에서는 DuckDuckSearch Tool을 이용하여, 질문에 관련된 웹사이트를 검색한후, 그 중 한 웹사이트의 내용을 크롤링해서 웹페이지 내용을 읽어온후에, 이를 요약하는 예제를 만들어 본다. 이를 위해서 웹페이지를 크롤링하는 툴을 BeautifulSoup 을 이용해서 만들어 본다. 커스텀 툴을 정의하는 방법은 몇가지가 있는데, 이 예제에서는 데코레이터를 사용하는 방법과 StructuredTool을 사용하는 방법 두가지를 살펴보자. 먼저 decorator를 사용하는 방법이다. HEADERS = { 'User-Agent': 'Mozilla/5.0 ..

#18.LangSmith를 이용한 Langchain agent 내부 동작 구조 이해

앞의 예제는 agent를 생성할때 initialize_agent를 사용하는 방식으로 Langchain 0.1.0 까지는 지원하지만 deplicate 될 예정이고 새 버전의 create_react_agent 함수를 사용하기를 권장하고 있다. create_react_agent를 사용하려면 직접 agentExecutor도 선언해야 하고, 프롬프트도 정의해야하기 때문에 기존 방식에 비해서 다소 번거롭지만 좀 더 많은 컨트롤을 할 수 있다. 이번에는 create_react_agent를 이용하는 방식을 설명하면서 내부적으로 agent가 어떻게 동작하는지를 자세하게 살펴보고, 더불어서 langsmith 모니터링 툴을 이용하여, agent에서 내부의 동작을 어떻게 모니터링하고 추적하는지에 대해서 알아보록 한다. Lan..