How LMQL, a Superset of Python, Helps Developers Use LLMs
이 블로그는 대규모 언어 모델(Large Language Models, LLMs)과의 상호작용에 있어 자연어의 한계에 대해 논의하고 있습니다. ETH Zürich의 박사과정 학생인 루카 부어러-켈너(Luca Beurer-Kellner)에 따르면, 자연어는 본질적으로 비공식적이고 덜 정확하다는 단점이 있습니다.
이 문제를 해결하기 위해 부어러-켈너와 그의 동료들은 Language Model Query Language (LMQL)이라는 새로운 프로그래밍 언어를 제안했습니다. 이 언어는 특히 LLMs와 작동하도록 설계되었으며, 이러한 모델과 더 공식적이고 정확한 방식으로 상호작용할 수 있는 방법을 제공하려고 합니다. LMQL은 가벼운 스크립팅과 출력을 제한하는 기능을 허용하여, LLM에서 원하는 결과를 더 통제된 방식으로 얻을 수 있습니다.
“LMQL은 Python의 상위 집합을 기반으로 한 대규모 언어 모델(LLM)을 위한 프로그래밍 언어입니다. LMQL은 코드에서 LLM을 호출할 수 있는 능력과 전통적인 프로그래밍을 서로 교묘하게 결합하는 새로운 방법을 제공합니다. 이는 프로그램 코드의 수준에서 LLM 상호 작용을 기본적으로 통합함으로써 전통적인 템플릿 언어를 넘어섭니다.”
연구자들은 사람들이 LLMs와 상호작용하는 방식—다양한 작업을 완료하도록 그들에게 지시하는 것—이 프로그래밍과 유사한 면이 있다고 관찰했습니다. 이로 인해 그들은 프로그래밍 언어 연구와 기계 학습 연구의 교차점에 위치한 LMQL을 만들게 되었습니다.
요약하자면, LMQL은 LLMs와 상호작용하기 위한 더 공식적이고 정확한 대안으로 제안되며, 스크립팅과 출력 제한과 같은 이점을 제공합니다.
“LMQL은 LLM에서 더 많은 가치를 끌어내는 데 도움을 줍니다.
LMQL은 Python의 상위 집합이며, 이를 통해 개발자들은 자연어 위에 프로그래밍 언어의 공식적인 측면을 활용할 수 있습니다,”라고 Beurer-Kellner는 The New Stack에게 말했습니다. 이로 인해 그것은 더 정확하고 더 편리하게 사용할 수 있으며, 그럼에도 불구하고 사람들이 이해하기 쉽고 직관적이라고 그는 말했습니다.”
“이것은 또한 대규모 언어 모델에서 더 많은 잠재력을 해방하는 데도 사용될 수 있습니다. LMQL은 챗봇의 제약을 벗어나 LLM과 기계 학습의 이점을 누릴 수 있는 인터페이스를 구축할 수 있습니다,”라고 그는 덧붙였습니다.
“기계 학습 관점에서도 매우 흥미로운 것은 이러한 모델이 할 수 있는 것이 다양하다는 것입니다,”라고 Beurer-Kellner가 말했습니다. “그들이 실제로 당신과 대화를 할 수 있다는 것이 놀라운 것이지만, 정말로 좋은 분류 모델이 있거나, 엔터티 태깅이나 이미지 캡셔닝 등을 할 수 있습니다 — 기본적으로 그들은 텍스트 입력/텍스트 출력이지만.”
LLM은 하류 응용 프로그램으로도 모델링될 수 있다고 그는 말했습니다. 이로 인해 그들은 어떠한 훈련도 할 필요 없이 모든 종류의 도메인에 대한 준비된 기계 학습 모델이 됩니다, 라고 그는 덧붙였습니다.
“모델을 특정 구조와 템플릿에 제약하고 강제함으로써, 당신은 모델이 미리 정의한 인터페이스를 항상 준수하도록 할 수 있습니다,”라고 그는 말했습니다. “이것은 최선을 다하고 모델에게 이것을 정말로 하도록 요청하는 것만으로 이루어지는 것이 아니라, 모델을 엄격한 방식으로 강제하는 것입니다, 즉 100%의 시간 동안 당신은 예/아니오 답변을 얻을 것입니다. 만약 당신이 그렇게 하도록 지정했다면, 모델이 다른 토큰을 생성하는 방법은 정말로 없습니다.”
토큰은 LLM이 예측을 할 때 실제로 계산하는 것입니다. 기본적으로, 각 단어는 토큰이거나 여러 토큰으로 나뉩니다.”
“API 비용 절감을 위한 LMQL
LMQL은 또한 선언형 언어입니다, 즉 프로그래밍 언어는 어떻게 할 것인지가 아니라 무엇을 할 것인지를 설명합니다. SQL과 HTML은 선언형 언어입니다. 그러나 이것은 명령형 언어, 예를 들어 C, C++, Java, Python과 같은 측면도 있습니다. 이러한 언어들은 어떻게 무언가를 할 것인지를 설명합니다.
선언형 언어 (Declarative Language)
선언형 언어는 “무엇을 할 것인지”에 중점을 둡니다. 이러한 언어에서는 결과를 얻기 위해 어떤 단계를 거쳐야 하는지에 대한 구체적인 지침을 제공하지 않습니다. 대신에, 원하는 결과에 대한 규칙이나 조건을 명시합니다. SQL (Structured Query Language)이나 HTML (HyperText Markup Language) 같은 언어가 이에 해당합니다.
예를 들어, SQL에서는 데이터를 어떻게 가져올 것인지를 명시하지 않고, 어떤 데이터를 가져오고 싶은지만을 명시합니다.
SELECT name FROM students WHERE age > 20;명령형 언어 (Imperative Language)
명령형 언어는 “어떻게 할 것인지”에 중점을 둡니다. 이러한 언어에서는 특정 작업을 수행하기 위해 필요한 구체적인 단계나 명령을 제공합니다. C, C++, Java, Python 등이 명령형 언어의 예입니다.
예를 들어, Python에서는 리스트의 모든 요소를 더하는 작업을 다음과 같이 수행할 수 있습니다.
total = 0 for num in [1, 2, 3, 4]: total += num선언형 vs 명령형
- 선언형 언어: 결과를 얻기 위한 “무엇을” 해야 하는지에 대한 규칙이나 조건을 명시
- 명령형 언어: 결과를 얻기 위한 “어떻게” 해야 하는지에 대한 구체적인 단계나 명령을 명시
두 방식은 서로 배타적이지 않으며, 많은 현대 언어는 선언형과 명령형의 특징을 모두 갖고 있습니다. 예를 들어, Python은 주로 명령형 언어이지만, 리스트 컴프리헨션(list comprehension) 같은 선언형 구조도 지원합니다.
“예를 들어, 특정 출력이 항상 정수일 것을 원한다면, 이러한 것들은 선언적으로 표현되며, 이로 인해 LMQL은 거의 SQL처럼 보입니다. 그러나 프롬프트 자체, 즉 입력을 구성하고 외부 소스에서 일부 데이터를 가져오거나 다른 것들을 연결하려고 할 때 — 이것은 Python과 마찬가지로 완전히 명령형 스타일로 수행될 수 있습니다,”라고 Beurer-Kellner가 설명했습니다. “우리는 이러한 다양한 측면에 대해 다양한 패러다임을 구현하려고 노력했으며, 그것들이 모두 더 덜 편리한 방식으로 수용되도록 하기 위해 노력했습니다.”
“LMQL을 사용하는 하나의 유용한 부작용은 모델에 대한 API 호출을 줄이거나 단축함으로써 LLMs의 사용 비용을 실제로 줄일 수 있다는 것입니다,”라고 LMQL의 창시자들이 발견했습니다.
이것은 중요합니다: 언어 모델은 일반적으로 매우 큰 신경망이며, 실용적인 추론은 높은 계산 비용과 상당한 지연 시간을 요구한다고 논문에서 설명했습니다. 이것은 사용료가 부과되는 API에서 쿼리 당 높은 사용 비용으로 번역될 수 있습니다.
예를 들어, 모델이 필요한 응답을 넘어 생성하고 있다면, LMQL은 그것이 방황하지 않도록 일찍 중단할 수 있도록 도와줄 수 있습니다, 라고 그는 말했습니다.
“우리는 실제로 텍스트 생성 중에 모델의 공간이나 연속성을 제한할 수 있습니다,”라고 그는 말했습니다. “또한 그것이 어떤 방향으로 벗어나면 일찍 중단할 수 있습니다, 즉 일찍 종료하고 어차피 필요하지 않을 많은 텍스트를 생성하지 않도록 할 수 있습니다; 그리고 이런 텍스트를 생성하지 않게 되면 이것에 대한 계산 또는 API 비용을 절약할 수 있습니다.”