FriendliAI 프로바이더
FriendliAI 프로바이더
FriendliAI 프로바이더는 Friendli 서버리스 엔드포인트를 통한 오픈소스 LLM과 전용 엔드포인트(Dedicated Endpoints)를 통한 커스텀 모델을 모두 지원해요.
이 프로바이더는 generateText와 streamText 함수에서 사용할 수 있는 언어 모델 객체를 만들며, Output을 통한 구조화된 데이터 생성도 지원해요.
출처: 문서
본문
설정 (Setup)
Friendli 프로바이더는 @friendliai/ai-provider 모듈에서 사용할 수 있어요. 다음과 같이 설치할 수 있어요:
자격 증명 (Credentials)
모델 사용에 필요한 토큰은 Friendli suite에서 받을 수 있어요.
프로바이더를 사용하려면 FRIENDLI_TOKEN 환경 변수에 개인 액세스 토큰을 설정해야 해요.
export FRIENDLI_TOKEN="YOUR_FRIENDLI_TOKEN"
자세한 내용은 FriendliAI 문서를 확인하세요.
프로바이더 인스턴스 (Provider Instance)
@friendliai/ai-provider에서 기본 프로바이더 인스턴스 friendliai를 임포트할 수 있어요:
import { friendli } from '@friendliai/ai-provider';
언어 모델 (Language Models)
프로바이더 인스턴스를 사용해 FriendliAI 모델을 만들 수 있어요. 첫 번째 인자는 모델 ID이며, 예를 들어 meta-llama-3.1-8b-instruct처럼 사용해요.
const model = friendli('meta-llama-3.1-8b-instruct');
예시: 텍스트 생성 (Generating text)
FriendliAI 언어 모델을 generateText 함수로 텍스트를 생성하는 데 사용할 수 있어요:
import { friendli } from '@friendliai/ai-provider';
import { generateText } from 'ai';
const { text } = await generateText({
model: friendli('meta-llama-3.1-8b-instruct'),
prompt: 'What is the meaning of life?',
});
console.log(text);
예시: 추론 (Reasoning)
FriendliAI는 deepseek-r1의 사고 과정을 thinking 태그를 사용해 생성 텍스트에 노출해요. extractReasoningMiddleware를 사용해 이 추론을 추출하고 결과의 reasoning 속성으로 노출할 수 있어요:
import { friendli } from '@friendliai/ai-provider';
import { wrapLanguageModel, extractReasoningMiddleware } from 'ai';
const enhancedModel = wrapLanguageModel({
model: friendli('deepseek-r1'),
middleware: extractReasoningMiddleware({ tagName: 'think' }),
});
const { text, reasoning } = await generateText({
model: enhancedModel,
prompt: 'Explain quantum entanglement.',
});
예시: 구조화 출력 (regex)
regex 옵션을 사용하면 패턴을 지정해 LLM 출력 형식을 제어할 수 있어요. 특히 다음과 같은 경우에 유용해요:
- CSV 같은 특정 형식
- 한국어나 일본어 같은 특정 문자로 출력 제한
이 기능은 generateText와 streamText 함수 모두에서 사용할 수 있어요.
LLM과 regex 패턴을 효과적으로 사용하는 방법에 대한 자세한 가이드는 Structured Output LLM Agents 블로그 포스트를 확인해 주세요.
import { friendli } from '@friendliai/ai-provider';
import { generateText } from 'ai';
const { text } = await generateText({
model: friendli('meta-llama-3.1-8b-instruct', {
regex: new RegExp('[\\n ,.?!0-9\\uac00-\\ud7af]*'),
}),
prompt: 'Who is the first king of the Joseon Dynasty?',
});
console.log(text);
예시: 구조화 출력 (json)
구조화 출력은 안내된 생성(guided generation)의 한 형태예요. JSON 스키마가 문법으로 사용되며 출력은 항상 스키마를 준수해요.
import { friendli } from '@friendliai/ai-provider';
import { generateText, Output } from 'ai';
import { z } from 'zod';
const { output } = await generateText({
model: friendli('meta-llama-3.3-70b-instruct'),
output: Output.object({
schemaName: 'CalendarEvent',
schema: z.object({
name: z.string(),
date: z.string(),
participants: z.array(z.string()),
}),
}),
system: 'Extract the event information.',
prompt: 'Alice and Bob are going to a science fair on Friday.',
});
console.log(output);
예시: 내장 도구 사용 (Using built-in tools)
경고: 내장 도구는 현재 베타 상태예요.
@friendliai/ai-provider를 사용하면 tools 옵션을 통해 내장 도구를 사용할 수 있어요.
내장 도구를 사용하면 모델이 도구를 활용해 더 나은 답변을 생성할 수 있어요. 예를 들어 web:search 도구는 최신 질문에 대한 최신 답변을 제공할 수 있어요.
import { friendli } from '@friendliai/ai-provider';
import { streamText } from 'ai';
const result = streamText({
model: friendli('meta-llama-3.3-70b-instruct', {
tools: [{ type: 'web:search' }, { type: 'math:calculator' }],
}),
prompt:
'Find the current USD to CAD exchange rate and calculate how much $5,000 USD would be in Canadian dollars.',
});
for await (const textPart of result.textStream) {
console.log(textPart);
}
예시: 전용 엔드포인트로 텍스트 생성 (Generating text with Dedicated Endpoints)
전용 엔드포인트를 통해 커스텀 모델을 사용하려면 friendli 인스턴스에 엔드포인트 ID(예: zbimjgovmlcb)를 사용할 수 있어요.
import { friendli } from '@friendliai/ai-provider';
import { generateText } from 'ai';
const { text } = await generateText({
model: friendli('YOUR_ENDPOINT_ID'),
prompt: 'What is the meaning of life?',
});
console.log(text);
아래 코드를 사용해 전용 엔드포인트로 요청을 강제할 수 있어요. 기본적으로는 자동 감지돼요.
import { friendli } from '@friendliai/ai-provider';
import { generateText } from 'ai';
const { text } = await generateText({
model: friendli("YOUR_ENDPOINT_ID", {
endpoint: "dedicated",
});
prompt: 'What is the meaning of life?',
});
console.log(text);
FriendliAI 언어 모델은 streamText 함수에서도 사용할 수 있고 Output을 통한 구조화된 데이터 생성도 지원해요(AI SDK Core 참고).
모델 기능 (Model Capabilities)
| 모델 | 이미지 입력 | 객체 생성 | 도구 사용 | 도구 스트리밍 |
|---|---|---|---|---|
deepseek-r1 |
||||
meta-llama-3.3-70b-instruct |
||||
meta-llama-3.1-8b-instruct |
참고: 더 많은 모델에 접근하려면 Friendli 전용 엔드포인트 문서를 방문해 커스텀 모델을 배포하세요.
OpenAI 호환성 (OpenAI Compatibility)
API가 OpenAI 호환이므로 @ai-sdk/openai를 사용할 수도 있어요.
import { createOpenAI } from '@ai-sdk/openai';
const friendli = createOpenAI({
baseURL: 'https://api.friendli.ai/serverless/v1',
apiKey: proces...KEN,
});
전용 엔드포인트를 사용하는 경우
import { createOpenAI } from '@ai-sdk/openai';
const friendli = createOpenAI({
baseURL: 'https://api.friendli.ai/dedicated/v1',
apiKey: proces...KEN,
});