#
멀티 에이전트 시스템 오케스트레이션 🤖🤝🤖

[[Colab에서 열기]]

이 노트북에서는 멀티 에이전트 웹 브라우저를 만들어보겠습니다. 이는 웹을 사용하여 문제를 해결하기 위해 여러 에이전트가 협력하는 에이전트 시스템입니다!

멀티 에이전트는 간단한 계층 구조로 구성됩니다.

                  +----------------+
                  | Manager agent  |
                  +----------------+
                           |
            _______________|______________
           |                              |
    Code Interpreter            +------------------+
        tool                    | Web Search agent |
                                +------------------+
                                   |            |
                            Web Search tool     |
                                       Visit webpage tool

이 시스템을 설정해보겠습니다.

다음 명령어를 실행하여 필요한 종속성을 설치합니다.

    !pip install smolagents[toolkit] --upgrade -q

Inference Providers를 사용하기 위해 Hugging Face에 로그인합니다:

    from huggingface_hub import login

    login()

⚡️ 에이전트는 Hugging Face의 Inference API를 사용하는 `InferenceClientModel` 클래스를 통해 Qwen/Qwen2.5-Coder-32B-Instruct로 구동됩니다. Inference API를 사용하면 모든 오픈소스 모델을 빠르고 쉽게 실행할 수 있습니다.

> Inference Providers는 서버리스 추론 파트너가 지원하는 수백 개의 모델에 대한 액세스를 제공합니다. 지원되는 프로바이더 목록은 여기에서 확인할 수 있습니다.

    model_id = "Qwen/Qwen2.5-Coder-32B-Instruct"

##
🔍 웹 검색 도구 생성

웹 브라우징을 위해 Google 검색과 동등한 기능을 제공하는 기본 `WebSearchTool` 도구를 이미 사용할 수 있습니다.

하지만 `WebSearchTool`에서 찾은 페이지를 확인할 수 있는 기능도 필요합니다. 이를 위해 라이브러리에 내장된 `VisitWebpageTool`을 사용할 수도 있지만, 작동 원리를 이해하기 위해 직접 구현해보겠습니다.

`markdownify`를 사용하여 `VisitWebpageTool` 도구를 처음부터 만들어보겠습니다.

    import re
    import requests
    from markdownify import markdownify
    from requests.exceptions import RequestException
    from smolagents import tool

    @tool
    def visit_webpage(url: str) -> str:
        """주어진 URL의 웹페이지에 접속하여 그 내용을 마크다운 형식의 반환합니다.

        매개변수:
            url: 방문할 웹페이지의 URL.

        반환값:
            마크다운으로 변환된 웹페이지 내용, 또는 요청이 실패할 경우 오류 메시지.
        """
        try:
            # URL에 GET 요청 전송
            response = requests.get(url)
            response.raise_for_status()  # 잘못된 상태 코드에 대해 예외 발생

            # HTML 내용을 마크다운으로 변환
            markdown_content = markdownify(response.text).strip()

            # 여러 줄 바꿈 제거
            markdown_content = re.sub(r"\n{3,}", "\n\n", markdown_content)

            return markdown_content

        except RequestException as e:
            return f"Error fetching the webpage: {str(e)}"
        except Exception as e:
            return f"An unexpected error occurred: {str(e)}"

이제 도구를 초기화하고 테스트해보겠습니다!

    print(visit_webpage("https://en.wikipedia.org/wiki/Hugging_Face")[:500])

##
멀티 에이전트 시스템 구축 🤖🤝🤖

이제 `search`와 `visit_webpage` 도구가 모두 준비되었으므로, 이를 사용하여 웹 에이전트를 생성할 수 있습니다.

이 에이전트에 어떤 구성을 선택할까요?

- 웹 브라우징은 병렬 도구 호출이 필요없는 단일 타임라인 작업이므로, JSON 도구 호출 방식이 적합합니다. 따라서 `ToolCallingAgent`를 선택합니다.
- 또한 웹 검색은 올바른 답을 찾기 전에 많은 페이지를 탐색해야 하는 경우가 있으므로, `max_steps`를 10으로 늘리는 것이 좋습니다.

    from smolagents import (
        CodeAgent,
        ToolCallingAgent,
        InferenceClientModel,
        WebSearchTool,
        LiteLLMModel,
    )

    model = InferenceClientModel(model_id=model_id)

    web_agent = ToolCallingAgent(
        tools=[WebSearchTool(), visit_webpage],
        model=model,
        max_steps=10,
        name="web_search_agent",
        description="Runs web searches for you.",
    )

이 에이전트에 `name`과 `description` 속성을 부여했습니다. 이는 이 에이전트가 매니저 에이전트에 의해 호출될 수 있도록 하는 필수 속성입니다.

그 다음 매니저 에이전트를 생성하고, 초기화 시 `managed_agents` 인수에 관리되는 에이전트를 전달합니다.

이 에이전트는 계획과 사고를 담당하므로, 고급 추론이 유용할 것입니다. 따라서 `CodeAgent`가 잘 작동할 것입니다.

또한 현재 연도를 포함하고 추가 데이터 계산을 수행하는 질문을 하고 싶으므로, 에이전트가 이러한 패키지를 필요로 할 경우에 대비해 `additional_authorized_imports=["time", "numpy", "pandas"]`를 추가해보겠습니다.

    manager_agent = CodeAgent(
        tools=[],
        model=model,
        managed_agents=[web_agent],
        additional_authorized_imports=["time", "numpy", "pandas"],
    )

이게 전부입니다! 이제 시스템을 실행해보겠습니다! 계산과 연구가 모두 필요한 질문을 선택합니다.

    answer = manager_agent.run("LLM 훈련이 현재 속도로 2030년까지 계속 확장된다면, 2030년까지 가장 큰 훈련 실행에 전력을 공급하는 데 필요한 전력량은 GW 단위로 얼마가 될까요? 이는 일부 국가들과 비교했을 때 무엇에 해당할까요? 사용된 모든 수치에 대한 출처를 제공해주세요.")

답변으로 이런 보고서를 받습니다.

    현재 성장 전망과 에너지 소비량 추정에 따르면,
    2030년까지 LLM 교육이 현재 속도로 계속 확장된다면 다음과 같이 예상됩니다.

    1. 2030년까지 가장 큰 훈련 실행에 전력을 공급하는 데 필요한 전력량은 약 303.74 GW가 될 것이며,
    이는 연간 약 2,660,762 GWh로 환산됩니다.

    2. 국가별 전력 소비량 비교
       - 중국 총 전력 소비량의 약 34%에 해당합니다.
       - 인도(184%), 러시아(267%), 일본(291%)의 총 전력 소비량을 초과할 것입니다.
       - 이탈리아나 멕시코 같은 국가들의 전력 소비량의 거의 9배가 됩니다.

    3. 수치 출처
       - 미래 LLM 훈련을 위한 5 GW의 초기 추정치는 AWS CEO Matt Garman에서 나온 것입니다.
       - 성장 예측은 Springs의 시장 조사에서 79.80%의 CAGR을 사용했습니다.
       - 국가 전력 소비 데이터는 주로 2021년 기준으로 미국 에너지 정보 관리청에서 나온 것입니다.

스케일링 가설이 계속 참이라면 상당히 큰 발전소가 필요할 것 같습니다.

에이전트들이 작업을 해결하기 위해 효율적으로 협력했습니다! ✅

💡 이 오케스트레이션을 더 많은 에이전트로 쉽게 확장할 수 있습니다: 하나는 코드 실행을, 다른 하나는 웹 검색을, 또 다른 하나는 파일 처리를 담당하는 식으로…

< > Update on GitHub