`extractJsonMiddleware()`
extractJsonMiddleware()
extractJsonMiddleware는 markdown 코드 펜스(fence)와 기타 포맷팅을 제거하여 텍스트 내용에서 JSON을 추출하는 미들웨어 함수입니다. JSON 응답을 markdown 코드 블록(예: ```json ... ```)으로 감싸는 모델과 함께 Output.object()를 사용할 때 유용합니다.
출처: 문서
본문
import { extractJsonMiddleware } from 'ai';
const middleware = extractJsonMiddleware();
Import
import { extractJsonMiddleware } from "ai"
API Signature
Parameters (파라미터)
transform:(text: string) => string(선택) — 텍스트 내용에 적용할 커스텀 변환 함수입니다. 원시 텍스트를 받아 변환된 텍스트를 반환해야 합니다. 제공되지 않으면 기본 변환이 markdown 코드 펜스를 제거합니다.
Returns (반환값)
다음과 같은 동작을 하는 미들웨어 객체를 반환합니다.
- 스트리밍과 비스트리밍 응답 모두 처리
- 텍스트 내용에서 markdown 코드 펜스(
```json,```) 제거 transform함수가 제공될 때 커스텀 변환 적용- 효율적인 버퍼링으로 적절한 스트리밍 동작 유지
Usage Examples (사용 예제)
기본 사용법
구조화된 출력을 사용할 때 모델 응답에서 markdown 코드 펜스를 제거합니다.
import {
generateText,
wrapLanguageModel,
extractJsonMiddleware,
Output,
} from 'ai';
import { z } from 'zod';
const result = await generateText({
model: wrapLanguageModel({
model: yourModel,
middleware: extractJsonMiddleware(),
}),
output: Output.object({
schema: z.object({
recipe: z.object({
name: z.string(),
steps: z.array(z.string()),
}),
}),
}),
prompt: 'Generate a lasagna recipe.',
});
console.log(result.output);
스트리밍과 함께
미들웨어는 스트리밍 응답에서도 동작합니다.
import {
streamText,
wrapLanguageModel,
extractJsonMiddleware,
Output,
} from 'ai';
import { z } from 'zod';
const { partialOutputStream } = streamText({
model: wrapLanguageModel({
model: yourModel,
middleware: extractJsonMiddleware(),
}),
output: Output.object({
schema: z.object({
recipe: z.object({
ingredients: z.array(z.string()),
steps: z.array(z.string()),
}),
}),
}),
prompt: 'Generate a detailed recipe.',
});
for await (const partialObject of partialOutputStream) {
console.log(partialObject);
}
커스텀 변환 함수
다른 포맷팅을 사용하는 모델의 경우 커스텀 변환을 제공할 수 있습니다.
import { extractJsonMiddleware } from 'ai';
const middleware = extractJsonMiddleware({
transform: text =>
text
.replace(/^PREFIX/, '')
.replace(/SUFFIX$/, '')
.trim(),
});
How It Works (동작 방식)
미들웨어는 텍스트 내용을 두 가지 방식으로 처리합니다.
비스트리밍 (generateText)
- 모델에서 완전한 응답을 받습니다.
- 변환 함수를 적용하여 markdown 펜스(또는 커스텀 포맷팅)를 제거합니다.
- 정리된 텍스트 내용을 반환합니다.
스트리밍 (streamText)
- 초기 내용을 버퍼링하여 markdown 펜스 접두사(
```json\n)를 감지합니다. - 펜스가 감지되면 접두사를 제거하고 스트리밍 모드로 전환합니다.
- 닫는 펜스(
\n```)를 처리하기 위해 작은 접미사 버퍼를 유지합니다. - 스트림이 끝나면 버퍼에서 끝부분 펜스를 제거합니다.
- 커스텀 변환의 경우 모든 내용을 버퍼링하고 마지막에 변환을 적용합니다.
이 방식은 여러 청크에 걸쳐 분할될 수 있는 코드 펜스를 올바르게 처리하면서 효율적인 스트리밍을 보장합니다.