2P by neo 19일전 | favorite | 댓글 1개

구조화된 출력

2024년 12월 6일

Ollama는 이제 JSON 스키마로 정의된 특정 형식에 모델의 출력을 제한할 수 있는 구조화된 출력을 지원함. Ollama Python 및 JavaScript 라이브러리가 구조화된 출력을 지원하도록 업데이트됨.

  • 구조화된 출력의 사용 사례:
    • 문서에서 데이터 파싱
    • 이미지에서 데이터 추출
    • 모든 언어 모델 응답 구조화
    • JSON 모드보다 더 높은 신뢰성과 일관성 제공

시작하기

  • Ollama 최신 버전 다운로드
  • Ollama Python 또는 JavaScript 라이브러리 최신 버전으로 업그레이드
cURL
  • format 매개변수를 사용하여 모델에 구조화된 출력을 전달할 수 있음
출력
  • 요청의 JSON 스키마로 정의된 형식으로 응답이 반환됨
Python
  • Ollama Python 라이브러리를 사용하여 JSON 객체로 스키마를 format 매개변수에 전달
  • Pydantic을 사용하여 스키마를 직렬화하는 것이 권장됨
출력
  • name='Canada' capital='Ottawa' languages=['English', 'French']
JavaScript
  • Ollama JavaScript 라이브러리를 사용하여 JSON 객체로 스키마를 format 매개변수에 전달
  • Zod를 사용하여 스키마를 직렬화하는 것이 권장됨
출력
  • { name: "Canada", capital: "Ottawa", languages: [ "English", "French" ] }

예시

데이터 추출

  • 텍스트에서 구조화된 데이터를 추출하기 위해 정보를 나타내는 스키마를 정의
  • 모델이 정보를 추출하고 정의된 스키마로 데이터를 JSON으로 반환
예시 출력
  • pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]

이미지 설명

  • 구조화된 출력은 비전 모델과 함께 사용할 수 있음
  • llama3.2-vision을 사용하여 이미지를 설명하고 구조화된 출력을 반환
예시 출력
  • summary='A palm tree on a sandy beach with blue water and sky.'
  • objects=[ Object(name='tree', confidence=0.9, attributes='palm tree'), Object(name='beach', confidence=1.0, attributes='sand') ]
  • scene='beach', colors=['blue', 'green', 'white'], time_of_day='Afternoon', setting='Outdoor', text_content=None
OpenAI 호환성
  • OpenAI 클라이언트를 사용하여 구조화된 출력과 호환 가능

  • 구조화된 출력을 신뢰성 있게 사용하려면:
    • Pydantic(Python) 또는 Zod(JavaScript)를 사용하여 응답 스키마 정의
    • 모델이 요청을 이해하도록 프롬프트에 "JSON으로 반환" 추가
    • 더 결정론적인 출력을 위해 온도를 0으로 설정

다음 단계

  • 제어된 생성을 위한 로짓 노출
  • 구조화된 출력의 성능 및 정확도 개선
  • 샘플링을 위한 GPU 가속
  • JSON 스키마를 넘어선 추가 형식 지원
Hacker News 의견
  • llama.cpp의 gbnf 기능을 통해 더 강력한 출력 제약을 설정할 수 있음

  • 정규 프롬프트를 구조화하여 csv 데이터로 변환할 때 불필요한 텍스트를 제거할 수 있어 유용함

  • gemma2:2b를 사용하여 텍스트를 입력하면 구조화된 JSON 형식의 출력물을 얻을 수 있음

    • 예시 입력: "You have spent 190 at Fresh Mart. Current balance: 5098"
    • 예시 출력: {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}
  • LLM의 출력 품질에 제약이 어떻게 영향을 미치는지 궁금해하는 의견이 있음

    • 경우에 따라 Markdown이나 일반 텍스트로 파싱하는 것이 더 나은 품질을 제공할 수 있음
  • 지원되는 모델과 함께 사용할 수 있는지에 대한 질문이 있음

    • 개인 하드웨어에서 1b-3b 모델만 안정적으로 실행할 수 있음
  • llama.cpp와 ollama가 llama의 구조화된 출력 기능을 활용하는지, 아니면 다른 방식으로 구현된 것인지에 대한 궁금증이 있음

    • Meta의 Llama 페이지에서 모델이 구조화된 출력을 본래 지원한다고 언급됨
  • outlines와 비교하여 어떤 부가가치가 있는지에 대한 질문이 있음

  • oobabooga를 계속 사용하는 이유는 exlv2 지원으로 듀얼 3090s에서 더 효율적인 추론을 제공하기 때문임

  • curl 예제가 먼저 나오는 것이 좋음

    • Pydantic을 좋아하지만, 스키마를 직접 코딩하는 것이 프로토타입을 Go로 옮기기 더 쉬움
  • LLM에 구조화된 입력을 제공하는 최적의 방법에 대한 질문이 있음

    • 예: 100개의 문장을 입력하여 각각을 다른 방식으로 분류하는 것
    • 구조화된 데이터를 얻는 것은 쉽지만, 줄 번호를 접두사로 사용하는 방식이 어색함