# Ollama를 활용한 구조화된 출력

> Clean Markdown view of GeekNews topic #18158. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=18158](https://news.hada.io/topic?id=18158)
- GeekNews Markdown: [https://news.hada.io/topic/18158.md](https://news.hada.io/topic/18158.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-12-09T10:59:19+09:00
- Updated: 2024-12-09T10:59:19+09:00
- Original source: [ollama.com](https://ollama.com/blog/structured-outputs)
- Points: 2
- Comments: 1

## Topic Body

### 구조화된 출력

#### 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 스키마를 넘어선 추가 형식 지원

## Comments



### Comment 32142

- Author: neo
- Created: 2024-12-09T10:59:19+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=42346344) 
- llama.cpp의 gbnf 기능을 통해 더 강력한 출력 제약을 설정할 수 있음
  - 링크: [GitHub - llama.cpp grammars](https://github.com/ggerganov/llama.cpp/blob/master/grammars/README.md)

- 정규 프롬프트를 구조화하여 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`와 비교하여 어떤 부가가치가 있는지에 대한 질문이 있음
  - 링크: [Taming LLMs - Structured Output](https://www.souzatharsis.com/tamingLLMs/notebooks/structured_output.html#outlines)

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

- curl 예제가 먼저 나오는 것이 좋음
  - Pydantic을 좋아하지만, 스키마를 직접 코딩하는 것이 프로토타입을 Go로 옮기기 더 쉬움

- LLM에 구조화된 입력을 제공하는 최적의 방법에 대한 질문이 있음
  - 예: 100개의 문장을 입력하여 각각을 다른 방식으로 분류하는 것
  - 구조화된 데이터를 얻는 것은 쉽지만, 줄 번호를 접두사로 사용하는 방식이 어색함
