아키텍트 가이드: Python 자동화 프레임워크에 LLMs 통합하기

발행: (2025년 12월 13일 오전 12:56 GMT+9)
9 min read
원문: Dev.to

Source: Dev.to

Cover image for The Architect’s Guide: Integrating LLMs into Python Automation Frameworks

아키텍처 필수 요소

  • 확률적 자동화 – 경직된 규칙을 넘어선 접근.
  • 3‑계층 통합 – 유틸리티 → 셀프‑힐링 → 에이전시.
  • 안전 우선 – 프라이버시를 위해 LLM을 로컬에서 실행(e.g., Ollama).
  • Python – AI 시대의 접착제 코드.

자동화 아키텍트는 전통적으로 결정론적이고 규칙 기반의 프레임워크에 의존합니다: 이 요소가 존재하면 클릭하고, 어설션이 실패하면 중단한다.
대형 언어 모델(LLM)은 확률적 자동화로 전환시켜, 추론과 의도가 행동을 이끌게 합니다.

사고 방식 전환

이는 ChatGPT에게 단일 정규식을 작성하도록 요청하는 것이 아닙니다. 프레임워크를 근본적으로 재구성하여 “지능형”으로 만드는 것이 목표이며, 이는 의도를 이해하고, 셀프‑힐링하며, 복잡한 실패를 분석할 수 있게 합니다.

LLM이란? (우리 세계에서)

테스트 자동화에서 LLM은 시맨틱 엔진이라고 생각하면 됩니다. 전통적인 도구(Selenium, Playwright)는 애플리케이션의 구문(DOM, ID, XPath)과 상호작용하지만 의미를 이해하지 못합니다. LLM은 UI의 시맨틱을 파악하는 번역 레이어 역할을 합니다:

  • 원시 HTML 덤프를 검사하고 “이것은 신용카드 폼이다” 혹은 “저 불분명한 div는 아마도 제출 버튼일 것이다” 라고 인식할 수 있습니다.
  • 아키텍트에게 LLM은 데이터베이스나 메시지 큐와 같은 새로운 컴포넌트이며, 비정형 데이터(로그, DOM, 사용자 스토리)를 처리하고 구조화된 행동을 반환합니다.

아키텍처 전략: LLM 통합 방법

AI를 무작위로 뿌려넣지 마세요. Python 프레임워크에 3계층 통합 접근법을 채택하세요.

Tier 1 – “스마트” 유틸리티 레이어 (낮은 위험)

utils 패키지에 LLM 서비스 클래스를 추가합니다. 이 레이어는 테스트를 실행하지 않으며, 테스트를 지원합니다.

  • 테스트 데이터 생성 – LLM을 사용해 상황에 맞는 엣지 케이스를 생성합니다(e.g., “특수 문자를 포함해 정규식에 실패할 수 있는 독일 주소 5개 생성”).
  • 로그 분석 – 테스트 실패 시, 트레이스백과 최근 로그 라인을 로컬 모델(Ollama/Llama 3)에게 전송하고, HTML 보고서에 “근본 원인 가설”을 추가합니다.

Tier 2 – 셀프‑힐링 드라이버 (중간 위험)

핵심 드라이버(Selenium/Playwright)를 인텔리전스로 감쌉니다.

문제: UI 변경으로 로케이터가 깨짐(#submit#submit‑v2).
LLM 솔루션:

  1. NoSuchElementException을 포착합니다.

  2. 현재 DOM을 캡처하고(모델 컨텍스트 창에 맞게 잘라냄)

  3. 원본 로케이터와 함께 LLM에 다음과 같은 프롬프트를 보냅니다:

    “요소 #submit이 없습니다. 현재 HTML을 기반으로 ‘Submit’ 버튼에 가장 적합한 선택자를 알려주세요. 선택자만 반환하세요.”

  4. 제안된 선택자를 사용해 동작을 재시도합니다.

Tier 3 – 에이전시 프레임워크 (높은 야망)

LangChain이나 AutoGen 같은 라이브러리를 활용해 선형 스크립트에서 목표‑지향 에이전트로 전환합니다.

  • 목표: “게스트 사용자의 결제 흐름을 검증한다.”
  • 에이전트: 브라우저를 띄우고 UI를 관찰하며, 어떤 Python 함수(click_element, enter_text 등)를 호출할지 스스로 결정하고, 목표 달성하거나 막히면 멈춥니다.

Python 구현: “셀프‑힐링” 예시

아래는 데코레이터를 활용한 구체적인 Tier‑2 구현 예시입니다. Python 3.10+, openai 클라이언트(또는 로컬 Ollama 서버용 requests), Selenium을 가정합니다.

import functools
from openai import OpenAI
from selenium.common.exceptions import NoSuchElementException

# 프라이버시를 위해 로컬 Ollama 서버 지정
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

def self_healing(func):
    """
    데코레이터는 로컬 LLM에 새로운 선택자를 요청해 실패한 요소 상호작용을 복구하려 시도합니다.
    """
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except NoSuchElementException:
            print(f"Element missing in {func.__name__}. Attempting to heal...")

            # 첫 번째 인자가 `self`이며 `driver` 속성을 가진다고 가정
            driver = args[0].driver
            page_source = driver.page_source[:2000]  # 토큰 제한을 위해 잘라냄

            prompt = f"""
            I tried to find an element but failed.
            The intended action was inside function: '{func.__name__}'.
            Here is a snippet of the page HTML (truncated):
            {page_source}

            Identify the CSS selector that most likely represents the element intended by '{func.__name__}'.
            Return ONLY the CSS selector string.
            """

            response = client.chat.completions.create(
                model="llama3",               # 로컬 모델 이름
                messages=[{"role": "user", "content": prompt}]
            )

            new_selector = response.choices[0].message.content.strip()
            print(f"LLM suggested new selector: {new_selector}")

            # 필요시 함수가 새 선택자를 받아 재시도하도록 조정
            return driver.find_element("css selector", new_selector)

    return wrapper

# 데코레이터를 활용한 예시 페이지 객체
class LoginPage:
    def __init__(self, driver):
        self.driver = driver

    @self_healing
    def click_login(self):
        # 원래 로케이터가 오래돼서 스턴될 수 있음; LLM이 대체 로케이터를 찾음.
        return self.driver.find_element("id", "old-login-id").click()

아키텍트를 위한 모범 사례

  • 로컬 우선 – 민감한 환경에서는 DOM 데이터를 공개 API에 보내지 마세요. Llama 3, Mistral 등 모델을 Ollama 또는 LM Studio를 통해 로컬에 호스팅합니다.
  • 컨텍스트가 핵심 – LLM에 제공하는 정보는 단순 오류 메시지가 아니라 DOM 스니펫, 테스트 의도, 최근 로그 등 풍부한 컨텍스트여야 합니다.
  • 인간이 개입 – LLM이 자동으로 코드를 커밋하도록 두지 마세요. “패치 제안” 파일을 생성하고, 인간이 검토·승인하도록 합니다.

결론

자동화 아키텍트의 역할은 “프레임워크 유지보수”에서 “어시스턴트 교육”으로 진화하고 있습니다. Python을 통해 LLM을 통합하면, 애플리케이션을 제작자만큼 이해하는 시스템을 만들 수 있어 플라키성을 줄이고 셀프‑힐링을 가능하게 합니다.

작게 시작하세요—오늘 로그 분석기를 구현하고—그 다음 셀프‑힐링 드라이버를, 최종적으로 에이전시 프레임워크를 구축해 나가세요.

Back to Blog

관련 글

더 보기 »