개요: 정규식, JSON 또는 Pydantic 모델을 통해 구조화된 텍스트 출력 생성

최신 AI 리소스6개월 전 업데이트 AI 공유 서클
1.6K 00

일반 소개

아웃라인은 구조화된 텍스트 생성을 통해 대규모 언어 모델(LLM)의 적용을 향상시키기 위해 dottxt-ai에서 개발한 오픈 소스 라이브러리입니다. 이 라이브러리는 OpenAI, 트랜스포머, llama.cpp 등 여러 모델 통합을 지원하며, 간단하면서도 강력한 프롬프트 프리미티브를 제공하고 Jinja 템플릿 엔진을 기반으로 하며, 아웃라인을 사용하면 정규식, JSON 패턴 또는 Pydantic 모델을 통해 빠르게 생성할 수 있고 욕심 알고리즘과 같은 다양한 샘플링 알고리즘을 지원할 수 있습니다, 다항식 샘플링 및 번들 검색 등 다양한 샘플링 알고리즘을 지원합니다. 또한 캐시 생성, 일괄 추론 등의 기능을 제공하여 모델 추론의 속도와 성능을 향상시키는 것을 목표로 하며, 주요 추론 프레임워크(예: VLLM, TGI)의 함수 호출에 아웃라인이 사용되었습니다.

Outlines:通过正则表达式、JSON或Pydantic模型生成结构化文本输出

 

기능 목록

  • 다중 모델 통합: OpenAI, 트랜스포머, llama.cpp 및 기타 모델을 지원합니다.
  • 간단하고 강력한 힌트: 진자 템플릿 엔진을 기반으로 합니다.
  • 정규식 구조 생성: 정규식을 준수하는 텍스트를 빠르게 생성하기
  • JSON 생성: JSON 스키마 또는 Pydantic 모델을 기반으로 텍스트 생성
  • 구문 구조 생성: 루프, 조건부 및 사용자 지정 Python 함수 생성 지원
  • 캐시 생성: 효율성 향상을 위한 캐시 생성 결과
  • 일괄 추론: 추론 속도 향상을 위한 일괄 처리 지원
  • 다중 샘플링 알고리즘: 욕심, 다항식 및 빔 검색 샘플링 알고리즘을 지원합니다.
  • 도커 지원: 손쉬운 배포를 위해 공식 도커 이미지를 제공합니다.

 

도움말 사용

설치 프로세스

  1. Python 환경이 설치되어 있는지 확인합니다.
  2. pip를 사용하여 아웃라인을 설치합니다:
   pip install outlines
  1. Rust 버전의 핵심 기능을 사용해야 하는 경우 아웃라인 코어를 설치하면 됩니다:
   pip install outlines-core

사용 가이드라인

기본 사용

  1. 윤곽선 라이브러리를 가져옵니다:
   import outlines
  1. 모델을 선택하고 로드합니다:
   model = outlines.models.transformers("openai/gpt-3.5-turbo")
  1. 프롬프트를 만들고 텍스트를 생성합니다:
   prompt = "生成一个关于AI技术的简短介绍。"
generated_text = model.generate(prompt)
print(generated_text)

고급 기능

  1. 정규식을 사용하여 구조화된 텍스트를 생성합니다:
   import outlines
generator = outlines.generate.regex("^[A-Z][a-z]+$")
result = generator("生成一个符合正则表达式的单词")
print(result)
  1. JSON 스키마를 사용하여 텍스트를 생성합니다:
   import outlines
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
generator = outlines.generate.json(Person)
result = generator({"name": "Alice", "age": 30})
print(result)
  1. 여러 샘플링 알고리즘이 사용됩니다:
   import outlines
generator = outlines.generate.choice(model, ["选项1", "选项2", "选项3"])
result = generator("请选择一个选项:")
print(result)
  1. Docker 이미지를 배포합니다:
   docker pull outlinesdev/outlines
docker run -p 8000:8000 outlinesdev/outlines

일반적인 문제

  • 생성 속도를 높이려면 어떻게 해야 하나요? 일괄 추론과 캐시 함수 생성을 사용하면 생성 속도를 크게 향상시킬 수 있습니다.
  • 사용자 지정 기능을 통합하는 방법은 무엇인가요? 생성 중에 복잡한 로직을 처리하는 데 커스텀 파이썬 함수를 사용할 수 있습니다.

 

대규모 모델의 비정형 출력으로 인해 발생하는 문제

이슈

대규모 언어 모델(LLM)은 강력한 텍스트 생성 기능을 갖추고 있지만 구조화된 데이터를 생성할 때 충분히 안정적으로 수행하지 못합니다. 이는 에이전트 중심 AI 애플리케이션에 심각한 문제를 야기합니다.

핵심 이슈

  • 출력 불일치이메일에서 항공편 정보를 추출할 때 가장 이상적인 것은 일관된 JSON 객체를 출력하는 것이지만, LLM은 종종 실패하여 'JSON 디코딩 오류'와 같은 문제를 일으킵니다.
  • 신뢰성 부족이러한 예측 불가능성으로 인해 LLM을 기반으로 복잡한 모듈형 시스템을 구축하기가 어렵습니다.

영향(일반적으로 부정적)

신뢰할 수 있는 구조화된 출력이 없으면 개발자는 지루한 후처리(예: 정규식)를 통해 정보를 추출해야 하므로 비효율적이고 오류가 발생하기 쉬운 개발로 이어집니다.

구조화된 출력의 이점

데이터의 일반적인 구조

겉보기에 구조화되지 않은 데이터(예: GSM 데이터 세트)라 할지라도 활용할 수 있는 고유한 구조가 있는 경우가 많습니다.

보장된 출력 형식

특정 구조(예: JSON 또는 정규식)를 정의하면 출력의 유효성을 보장하고 지루한 사후 처리를 피할 수 있습니다.

성능 및 효율성 향상

  • JSON 효율성 향상구조화된 생성을 사용하여 JSON 효율성이 17.7%에서 99.9%로 증가했습니다.
  • 예제 필요성 감소GSM8K 벤치마킹에서 1회 구조화 세대의 성능은 8회 비구조화 세대와 거의 비슷합니다.
  • 오픈 모델 성능 개선함수 호출 벤치마크에서 성능이 86%에서 96.5%로 향상되어 심지어 GPT-4보다 성능이 더 뛰어납니다.

구조화된 출력과 구조화되지 않은 출력

구조화된 출력의 장점을 더 잘 이해하기 위해 다음 예를 사용하여 구조화된 출력과 구조화되지 않은 출력의 차이점을 비교할 수 있습니다.

이메일에서 항공편 정보를 추출해야 한다고 가정해 보겠습니다:

구조화되지 않은 출력

대형 모델에서 생성된 출력의 형식이 엄격하지 않은 경우 다음과 같은 텍스트가 표시될 수 있습니다:

飞往巴黎的航班在下周二,可能是早上10点,飞机是法国航空。

이 출력에는 목적지, 날짜, 시간, 항공사 등 필요한 정보가 포함되어 있지만 명확한 구조가 없습니다. 이 정보를 추출하려면 개발자가 정규식이나 기타 텍스트 처리 방법을 사용하여 각 필드를 파싱해야 하는데, 이 작업은 지루하고 오류가 발생하기 쉽습니다. 예를 들어, 모델이 입력에 따라 다른 형식의 출력을 제공하여 시스템 처리 오류 또는 "JSON 디코딩 오류"를 일으킬 수 있습니다.

구조화된 출력

구조화된 생성을 사용하는 경우 모델은 예를 들어 미리 정의된 형식을 따르는 데이터를 반환합니다:

{
  "destination": "巴黎",
  "departure_date": "2024-11-25",
  "time": "10:00",
  "airline": "法国航空"
}

이 경우 출력은 균일하고 표준화됩니다. 모든 키 필드가 이미 예상된 형식으로 반환되므로 개발자는 더 이상 정보를 추가로 처리하거나 구문 분석할 필요가 없습니다. 따라서 개발 시간이 절약될 뿐만 아니라 오류 발생 가능성도 크게 줄어듭니다.

이 비교를 통해 구조화된 출력은 데이터의 일관성과 신뢰성을 보장할 뿐만 아니라 특히 대규모 모델에서 많은 양의 정보를 추출하고 처리해야 할 때 처리 효율성을 크게 향상시킨다는 것을 분명히 알 수 있습니다.

 

아웃라인을 사용하면 대형 모델에서 성능 문제가 발생하나요?

아웃라인은 어떻게 작동하나요?

근거

  • 로그 처리모델이 로그를 생성한 후 아웃라인은 가능한 각 다음 토큰을 검사하고 정의된 구조를 위반하는 토큰을 차단합니다.
  • 효율성 최적화효율적인 마스킹을 통해 추가 오버헤드가 매우 낮습니다.

일반적인 예

"생성된 토큰 가 구조를 파괴할 수 있으므로 생성 프로세스가 미리 정의된 구조를 엄격하게 따르도록 즉시 차단됩니다."

구조화된 출력은 출력 속도가 느려지나요?

그렇지 않습니다. 오히려 구조화된 생성은 일반적으로 생성 프로세스를 가속화합니다:

  • 쓸모없는 토큰 줄이기: 구조를 미리 정의하여 중복 필드 이름이나 대괄호를 생성하지 않도록 합니다.
  • 세대 길이 단축구조화된 출력은 일반적으로 토큰 수가 더 적고, 더 빠르고, 더 명확합니다.

아웃라인과 다른 구조화된 생성 라이브러리 비교

  • 가이드와 비교아웃라인은 추론 단계에서 오버헤드가 거의 없는 반면, 가이던스는 많은 수의 토큰을 생성할 때 속도가 크게 느려질 수 있습니다.
  • LMQL과 비교아웃라인의 핵심 강점은 가벼운 디자인과 효율성입니다.

코드 예제

다음은 아웃라인을 사용하여 구조화된 이벤트 데이터를 생성하는 예제입니다:

from datetime import datetime
from pydantic import BaseModel, Field
from outlines import generate, models

# 加载模型
model = models.mlxlm("mlx-community/Hermes-3-Llama-3.1-8B-8bit")

# 使用 Pydantic 定义事件结构
class Event(BaseModel):
    title: str = Field(description="title of the event")
    location: str
    start: datetime = Field(
        default=None, description="date of the event if available in iso format"
    )

# 获取当前时间
now = datetime.now().strftime("%A %d %B %Y and it's %H:%M")

# 定义提示
prompt = f"""
Today's date and time are {now}
Given a user message, extract information of the event like date and time in iso format, location and title.
If the given date is relative, think step by step to find the right date.
Here is the message:
"""

# 示例消息
message = """Hello Kitty, my grandmother will be here , I think it's better to postpone our
appointment to review math lessons to next Friday at 2pm at the same place, 3 avenue des tanneurs, I think that one hour will be enough
see you 😘 """

# 创建生成器
generator = generate.json(model, Event)

# 提取事件信息
event = generator(prompt + message)

# 输出结果
print(f"Today: {now}")
print(event.json())

생성된 이벤트 정보는 다음과 같습니다:

{
  "title": "Math Review",
  "location": "3 avenue des tanneurs",
  "start": "2024-11-22T14:00:00Z"
}

결론 및 전망

구조화된 생성은 더 이상 틈새 기능이 아니라 대형 모델 애플리케이션의 미래입니다:

  • 더 높은 신뢰성과 효율성구조화된 생성을 통해 LLM의 성능이 크게 향상되었습니다.
  • 오픈소스의 잠재력아웃라인의 성공은 독점 모델과 경쟁할 수 있는 오픈 소스 모델의 잠재력을 보여줍니다.

앞으로 아웃라인은 구조화된 생성이 더욱 대중화됨에 따라 개발자의 툴박스에서 핵심 구성 요소가 될 것으로 예상됩니다.

© 저작권 정책
AiPPT

관련 문서

댓글 없음

댓글에 참여하려면 로그인해야 합니다!
지금 로그인
없음
댓글 없음...