GN⁺: Ollama를 활용한 구조화된 출력
(ollama.com)구조화된 출력
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개의 문장을 입력하여 각각을 다른 방식으로 분류하는 것
- 구조화된 데이터를 얻는 것은 쉽지만, 줄 번호를 접두사로 사용하는 방식이 어색함