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,
});

더 알아보기 (Learn more)

전체 사이트맵