생성형 AI의 핵심은 AI 모델입니다. 현재 생성형 모델의 두 가지 대표적인 예는 대규모 언어 모델 (LLM)과 이미지 생성 모델입니다. 이러한 모델은 프롬프트 (일반적으로 텍스트, 이미지 또는 둘 다의 조합)라는 입력을 받아 텍스트, 이미지, 오디오 또는 동영상을 출력으로 생성합니다.
이러한 모델의 출력물은 놀라울 정도로 사실적일 수 있습니다. LLM은 사람이 작성한 것처럼 보이는 텍스트를 생성하고 이미지 생성 모델은 실제 사진이나 사람이 만든 아트워크와 매우 유사한 이미지를 생성할 수 있습니다.
또한 LLM은 단순한 텍스트 생성 외에도 다음과 같은 작업을 할 수 있는 것으로 입증되었습니다.
- 컴퓨터 프로그램 작성
- 대규모 작업을 완료하는 데 필요한 하위 작업 계획
- 정리되지 않은 데이터 정리
- 텍스트 자료에서 정보 데이터 이해 및 추출
- 활동의 텍스트 설명을 기반으로 자동 활동을 따르고 실행
여러 공급업체에서 제공하는 다양한 모델을 사용할 수 있습니다. 각 모델에는 고유한 장단점이 있으며 한 모델은 한 작업에 능숙하지만 다른 작업에서는 실적이 저조할 수 있습니다. 생성형 AI를 사용하는 앱은 당면한 작업에 따라 여러 모델을 사용하는 것이 좋습니다.
앱 개발자는 일반적으로 생성형 AI 모델과 직접 상호작용하지 않고 웹 API로 제공되는 서비스를 통해 상호작용합니다. 이러한 서비스는 기능이 비슷한 경우가 많지만 모두 호환되지 않는 서로 다른 API를 통해 기능을 제공합니다. 여러 모델 서비스를 사용하려면 서로 호환되지 않을 수 있는 각 독점 SDK를 사용해야 합니다. 또한 한 모델에서 최신 모델로 업그레이드하려면 통합을 다시 빌드해야 할 수도 있습니다.
Genkit은 이미 제공되는 여러 사전 빌드된 구현과 함께 잠재적으로 모든 생성형 AI 모델 서비스에 액세스하는 세부정보를 추상화하는 단일 인터페이스를 제공하여 이 문제를 해결합니다. Genkit을 중심으로 AI 기반 앱을 빌드하면 첫 번째 생성형 AI 호출을 간소화할 수 있으며, 새 모델이 등장할 때 여러 모델을 결합하거나 한 모델을 다른 모델로 교체하는 것도 마찬가지로 간편합니다.
시작하기 전에
이 페이지의 코드 예시를 실행하려면 먼저 시작하기 가이드의 단계를 완료하세요. 모든 예에서는 이미 프로젝트에 Genkit를 종속 항목으로 설치했다고 가정합니다.
Genkit에서 지원하는 모델
Genkit은 잠재적으로 모든 생성형 AI 모델 서비스를 사용할 수 있을 만큼 유연하게 설계되었습니다. 핵심 라이브러리는 모델을 사용하는 공통 인터페이스를 정의하고 모델 플러그인은 특정 모델과 API를 사용하는 구현 세부정보를 정의합니다.
Genkit팀은 Vertex AI, Google 생성형 AI, Ollama에서 제공하는 모델을 사용하는 플러그인을 유지 관리합니다.
- Google Cloud Vertex AI 플러그인을 통한 LLM의 Gemini 제품군
- Google AI 플러그인을 통한 Gemini LLM 제품군
- Google Cloud Vertex AI를 통한 Imagen2 및 Imagen3 이미지 생성 모델
- Google Cloud Vertex AI의 모델 가든을 통한 Anthropic의 Claude 3 LLM 제품군
- Ollama 플러그인을 통해 Gemma 2, Llama 3 등 다양한 개방형 모델 (Ollama 서버를 직접 호스팅해야 함)
또한 이러한 모델에 인터페이스를 제공하는 커뮤니티 지원 플러그인도 여러 개 있습니다.
- Anthropic 플러그인을 통한 LLM의 Claude 3 제품군
- OpenAI 플러그인을 통한 GPT 계열 LLM
- Azure OpenAI 플러그인을 통한 LLM의 GPT 계열
- Cohere 플러그인을 통해 LLM의 R 계열 명령
- Mistral 플러그인을 통한 Mistral LLM 제품군
- Groq 플러그인을 통해 Groq에 호스팅된 Gemma 2, Llama 3 등 다양한 개방형 모델
npmjs.org에서 genkit-model
태그가 지정된 패키지를 검색하여 자세히 알아볼 수 있습니다.
모델 플러그인 로드 및 구성
Genkit을 사용하여 콘텐츠 생성을 시작하려면 먼저 모델 플러그인을 로드하고 구성해야 합니다. 시작 가이드에서 이동한 경우 이미 이 작업을 완료하셨습니다. 그렇지 않은 경우 시작하기 가이드 또는 개별 플러그인의 문서를 참고하고 계속하기 전에 안내된 단계를 따르세요.
generate() 메서드
Genkit에서 생성형 AI 모델과 상호작용하는 기본 인터페이스는 generate()
메서드입니다.
가장 간단한 generate()
호출은 사용할 모델과 텍스트 프롬프트를 지정합니다.
import { gemini15Flash, googleAI } from '@genkit-ai/googleai';
import { genkit } from 'genkit';
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
(async () => {
const { text } = await ai.generate(
'Invent a menu item for a pirate themed restaurant.'
);
console.log(text);
})();
이 간단한 예시를 실행하면 디버깅 정보와 generate()
호출의 출력이 출력됩니다. 일반적으로 다음 예와 같이 Markdown 텍스트입니다.
## The Blackheart's Bounty
**A hearty stew of slow-cooked beef, spiced with rum and molasses, served in a
hollowed-out cannonball with a side of crusty bread and a dollop of tangy
pineapple salsa.**
**Description:** This dish is a tribute to the hearty meals enjoyed by pirates
on the high seas. The beef is tender and flavorful, infused with the warm spices
of rum and molasses. The pineapple salsa adds a touch of sweetness and acidity,
balancing the richness of the stew. The cannonball serving vessel adds a fun and
thematic touch, making this dish a perfect choice for any pirate-themed
adventure.
스크립트를 다시 실행하면 다른 출력이 표시됩니다.
위의 코드 샘플은 Genkit 인스턴스를 구성할 때 지정한 기본 모델에 생성 요청을 전송했습니다.
단일 generate()
호출에 모델을 지정할 수도 있습니다.
const { text } = await ai.generate({
model: gemini15Pro,
prompt: 'Invent a menu item for a pirate themed restaurant.',
});
이 예에서는 모델 플러그인에서 내보낸 모델 참조를 사용합니다. 또 다른 방법은 문자열 식별자를 사용하여 모델을 지정하는 것입니다.
const { text } = await ai.generate({
model: 'googleai/gemini-1.5-pro-latest',
prompt: 'Invent a menu item for a pirate themed restaurant.',
});
모델 문자열 식별자는 providerid/modelid
와 같이 표시되며 여기서 제공업체 ID(이 경우 googleai
)는 플러그인을 식별하고 모델 ID는 특정 버전의 모델에 대한 플러그인별 문자열 식별자입니다.
Ollama 플러그인과 같은 일부 모델 플러그인은 수십 개의 서로 다른 모델에 대한 액세스를 제공하므로 개별 모델 참조를 내보내지 않습니다. 이 경우 문자열 식별자를 사용하여 generate()
에 모델만 지정할 수 있습니다.
또한 이러한 예는 중요한 점을 보여줍니다. generate()
를 사용하여 생성형 AI 모델을 호출할 때 사용하려는 모델을 변경하는 것은 모델 매개변수에 다른 값을 전달하는 것뿐입니다. 네이티브 모델 SDK 대신 generate()
를 사용하면 앱에서 여러 모델을 더 쉽게 사용하고 나중에 모델을 변경할 수 있는 유연성을 얻을 수 있습니다.
지금까지는 가장 간단한 generate()
호출의 예만 보았습니다. 하지만 generate()
는 생성형 모델과의 고급 상호작용을 위한 인터페이스도 제공합니다. 이는 다음 섹션에서 확인할 수 있습니다.
시스템 메시지
일부 모델은 시스템 프롬프트를 제공하는 것을 지원합니다. 이 프롬프트는 모델에 사용자의 메시지에 어떻게 응답할지 안내합니다. 시스템 프롬프트를 사용하여 모델이 채택할 캐릭터, 응답의 어조, 응답 형식 등을 지정할 수 있습니다.
사용 중인 모델이 시스템 메시지를 지원하는 경우 system
매개변수를 사용하여 메시지를 제공할 수 있습니다.
const { text } = await ai.generate({
system: 'You are a food industry marketing consultant.',
prompt: 'Invent a menu item for a pirate themed restaurant.',
});
모델 매개변수
generate()
함수는 config
매개변수를 사용합니다. 이 매개변수를 통해 모델이 콘텐츠를 생성하는 방식을 제어하는 선택적 설정을 지정할 수 있습니다.
const { text } = await ai.generate({
prompt: 'Invent a menu item for a pirate themed restaurant.',
config: {
maxOutputTokens: 400,
stopSequences: ['<end>', '<fin>'],
temperature: 1.2,
topP: 0.4,
topK: 50,
},
});
지원되는 정확한 매개변수는 개별 모델 및 모델 API에 따라 다릅니다. 하지만 이전 예의 매개변수는 거의 모든 모델에 공통적으로 적용됩니다. 다음은 이러한 매개변수에 대한 설명입니다.
출력 길이를 제어하는 매개변수
maxOutputTokens
LLM은 토큰이라는 단위에서 작동합니다. 토큰은 일반적으로 특정 문자 시퀀스에 매핑되지만 반드시 매핑되는 것은 아닙니다. 프롬프트를 모델에 전달하면 가장 먼저 프롬프트 문자열을 토큰 시퀀스로 토큰화합니다. 그런 다음 LLM은 토큰화된 입력에서 토큰 시퀀스를 생성합니다. 마지막으로 토큰 시퀀스가 텍스트로 다시 변환되어 출력됩니다.
최대 출력 토큰 매개변수는 LLM을 사용하여 생성할 토큰 수를 제한하는 역할을 합니다. 모든 모델은 서로 다른 토큰 생성기를 사용할 수 있지만, 일반적으로 단일 영어 단어는 2~4개의 토큰으로 구성된다고 생각하면 됩니다.
앞에서 언급한 것처럼 일부 토큰은 문자 시퀀스에 매핑되지 않을 수 있습니다. 이러한 예 중 하나는 시퀀스의 끝을 나타내는 토큰이 종종 있다는 것입니다. LLM이 이 토큰을 생성하면 더 이상 생성하지 않습니다. 따라서 LLM이 '중지' 토큰을 생성했기 때문에 최대 토큰보다 적은 토큰을 생성할 수 있으며, 실제로 종종 그렇게 됩니다.
stopSequences
이 매개변수를 사용하여 생성 시 LLM 출력의 끝을 나타내는 토큰 또는 토큰 시퀀스를 설정할 수 있습니다. 여기서 사용할 올바른 값은 일반적으로 모델이 학습된 방식에 따라 다르며 일반적으로 모델 플러그인에서 설정합니다. 하지만 모델에 다른 정지 시퀀스를 생성하도록 요청한 경우 여기에서 지정할 수 있습니다.
토큰 자체가 아닌 문자 시퀀스를 지정합니다. 대부분의 경우 모델의 토큰라이저가 단일 토큰에 매핑하는 문자 시퀀스를 지정합니다.
'광고 소재'를 제어하는 매개변수
temperature, top-p, top-k 매개변수를 함께 사용하면 모델의 '창의성' 수준을 제어할 수 있습니다. 다음은 이러한 매개변수의 의미에 관한 간단한 설명이지만, 더 중요한 점은 이러한 매개변수가 LLM 출력의 문자를 조정하는 데 사용된다는 것입니다. 최적의 값은 목표와 선호도에 따라 다르며 실험을 통해서만 찾을 수 있습니다.
temperature
LLM은 기본적으로 토큰을 예측하는 머신입니다. LLM은 주어진 토큰 시퀀스(예: 프롬프트)에 대해, 어휘의 각 토큰이 시퀀스에서 다음에 올 가능성을 예측합니다. 온도는 이러한 예측을 나눈 후 0과 1 사이의 확률로 정규화하는 배율입니다.
낮은 온도 값(0.0~1.0)은 토큰 간의 가능성 차이를 증폭시켜 모델이 이미 가능성 낮다고 평가한 토큰을 생성할 가능성이 더욱 낮아집니다. 이는 종종 창의성이 떨어지는 결과물로 인식됩니다. 0.0은 기술적으로 유효한 값이 아니지만 많은 모델은 이를 모델이 결정론적으로 작동해야 하며 가장 가능성이 높은 단일 토큰만 고려해야 함을 나타내는 것으로 간주합니다.
온도 값이 높으면(1.0보다 큼) 토큰 간의 가능성 차이가 압축되어 모델이 이전에 가능성 낮다고 평가한 토큰을 생성할 가능성이 높아집니다. 이는 종종 더 창의적인 결과물로 인식됩니다. 일부 모델 API는 최대 온도(일반적으로 2.0)를 적용합니다.
topP
Top-p는 0.0과 1.0 사이의 값으로, 토큰의 누적 확률을 지정하여 모델에서 고려할 수 있는 토큰 수를 제어합니다. 예를 들어 값이 1.0이면 가능한 모든 토큰을 고려하되 각 토큰의 확률은 고려한다는 의미입니다. 값이 0.4이면 확률의 합계가 0.4인 가장 가능성이 높은 토큰만 고려하고 나머지 토큰은 고려에서 제외한다는 의미입니다.
topK
Top-k는 모델이 고려할 수 있는 토큰 수를 제어하는 정수 값이지만, 이번에는 최대 토큰 수를 명시적으로 지정합니다. 값 1을 지정하면 모델이 결정론적으로 동작해야 함을 의미합니다.
모델 매개변수 실험
개발자 UI를 사용하여 이러한 매개변수가 다양한 모델 및 프롬프트 조합에 의해 생성된 출력에 미치는 영향을 실험할 수 있습니다. genkit start
명령어로 개발자 UI를 시작하면 프로젝트에 구성된 플러그인에 의해 정의된 모든 모델이 자동으로 로드됩니다. 코드에서 이러한 변경사항을 반복적으로 적용하지 않고도 다양한 프롬프트와 구성 값을 빠르게 시도할 수 있습니다.
구조화된 출력
생성형 AI를 애플리케이션의 구성요소로 사용할 때는 일반 텍스트가 아닌 형식으로 출력하는 것이 좋습니다. 사용자에게 표시할 콘텐츠를 생성하는 것뿐이라도 구조화된 출력을 사용하면 사용자에게 더 매력적으로 콘텐츠를 표시할 수 있습니다. 하지만 모델 출력을 프로그래매틱 방식으로 사용하거나 한 모델의 출력을 다른 모델에 제공하는 등 생성형 AI의 고급 애플리케이션의 경우 구조화된 출력이 필수입니다.
Genkit에서는 generate()
를 호출할 때 스키마를 지정하여 모델에서 구조화된 출력을 요청할 수 있습니다.
import { z } from 'genkit'; // Import Zod, which is re-exported by Genkit.
const MenuItemSchema = z.object({
name: z.string(),
description: z.string(),
calories: z.number(),
allergens: z.array(z.string()),
});
const { output } = await ai.generate({
prompt: 'Invent a menu item for a pirate themed restaurant.',
output: { schema: MenuItemSchema },
});
모델 출력 스키마는 Zod 라이브러리를 사용하여 지정됩니다. Zod는 스키마 정의 언어 외에도 정적 TypeScript 유형과 생성형 AI 모델의 예측할 수 없는 출력 간에 간극을 메우는 런타임 유형 검사를 제공합니다. Zod를 사용하면 생성 호출이 성공하면 항상 TypeScript 유형을 준수하는 출력을 반환한다는 사실에 의존할 수 있는 코드를 작성할 수 있습니다.
generate()
에서 스키마를 지정하면 Genkit은 백그라운드에서 다음과 같은 작업을 실행합니다.
- 원하는 출력 형식에 관한 추가 안내를 프롬프트에 추가합니다. 이렇게 하면 모델에 정확히 어떤 콘텐츠를 생성할지 지정하는 부작용도 있습니다 (예: 메뉴 항목을 제안할 뿐만 아니라 설명, 알레르기 유발 물질 목록 등을 생성).
- 모델 출력을 JavaScript 객체로 파싱합니다.
- 출력이 스키마를 준수하는지 확인합니다.
생성 호출이 성공하면 구조화된 출력을 가져오려면 응답 객체의 output
속성을 사용하세요.
if (output) {
const { name, description, calories, allergens } = output;
}
오류 처리
이전 예에서 output
속성은 null
일 수 있습니다. 이는 모델이 스키마를 준수하는 출력을 생성하지 못할 때 발생할 수 있습니다.
이러한 오류를 처리하는 가장 좋은 전략은 정확한 사용 사례에 따라 다르지만 다음과 같은 일반적인 힌트가 있습니다.
다른 모델을 사용해 보세요. 구조화된 출력을 사용하려면 모델이 JSON으로 출력을 생성할 수 있어야 합니다. Gemini 및 Claude와 같은 가장 강력한 LLM은 이를 수행할 만큼 다재다능합니다. 하지만 Ollama와 함께 사용할 일부 로컬 모델과 같은 소형 모델은 이를 위해 특별히 학습되지 않는 한 구조화된 출력을 안정적으로 생성하지 못할 수 있습니다.
Zod의 변환 기능 사용: 스키마에서 Zod가 정책을 준수하지 않는 유형을 스키마에서 지정한 유형으로 변환하려고 시도해야 한다고 지정할 수 있습니다. 스키마에 문자열 이외의 원시 유형이 포함된 경우 Zod 변환을 사용하면 발생하는
generate()
실패 횟수를 줄일 수 있습니다. 다음 버전의MenuItemSchema
는 유형 변환을 사용하여 모델이 칼로리 정보를 숫자가 아닌 문자열로 생성하는 상황을 자동으로 수정합니다.const MenuItemSchema = z.object({ name: z.string(), description: z.string(), calories: z.coerce.number(), allergens: z.array(z.string()), });
generate() 호출을 다시 시도합니다. 선택한 모델이 규정을 준수하는 출력을 생성하지 못하는 경우가 드물다면 이 오류를 네트워크 오류와 마찬가지로 처리하고 일종의 점진적 백오프 전략을 사용하여 요청을 다시 시도하면 됩니다.
스트리밍
대량의 텍스트를 생성할 때는 출력이 생성될 때마다 표시하여 사용자 환경을 개선할 수 있습니다(출력 스트리밍). 스트리밍이 작동하는 익숙한 예는 대부분의 LLM 채팅 앱에서 확인할 수 있습니다. 사용자는 메시지가 생성되는 동안 메시지에 대한 모델의 응답을 읽을 수 있으므로 애플리케이션의 인식된 반응성이 개선되고 지능형 상대방과 채팅하는 것 같은 착각을 줄일 수 있습니다.
Genkit에서는 generateStream()
메서드를 사용하여 출력을 스트리밍할 수 있습니다. 구문은 generate()
메서드와 유사합니다.
const { response, stream } = await ai.generateStream(
'Suggest a complete menu for a pirate themed restaurant.'
);
응답 객체에는 stream
속성이 있습니다. 이 속성을 사용하여 요청의 스트리밍 출력이 생성될 때 이를 반복할 수 있습니다.
for await (const chunk of stream) {
console.log(chunk.text);
}
스트리밍이 아닌 요청과 마찬가지로 요청의 전체 출력을 가져올 수도 있습니다.
const completeText = (await response).text;
스트리밍은 구조화된 출력에서도 작동합니다.
const MenuSchema = z.object({
starters: z.array(MenuItemSchema),
mains: z.array(MenuItemSchema),
desserts: z.array(MenuItemSchema),
});
const { response, stream } = await ai.generateStream({
prompt: 'Suggest a complete menu for a pirate themed restaurant.',
output: { schema: MenuSchema },
});
for await (const chunk of stream) {
// `output` is an object representing the entire output so far.
console.log(chunk.output);
}
// Get the completed output.
const { output } = await response;
구조화된 출력 스트리밍은 텍스트 스트리밍과 약간 다르게 작동합니다. 응답 청크의 output
속성은 단일 청크를 나타내는 객체 (단독으로 유효하지 않을 수 있음)가 아니라 지금까지 생성된 청크의 누적에서 생성된 객체입니다. 구조화된 출력의 각 청크는 어떤 의미에서는 그 앞에 나온 청크를 대체합니다.
예를 들어 이전 예시의 처음 5개 출력은 다음과 같습니다.
null
{ starters: [ {} ] }
{
starters: [ { name: "Captain's Treasure Chest", description: 'A' } ]
}
{
starters: [
{
name: "Captain's Treasure Chest",
description: 'A mix of spiced nuts, olives, and marinated cheese served in a treasure chest.',
calories: 350
}
]
}
{
starters: [
{
name: "Captain's Treasure Chest",
description: 'A mix of spiced nuts, olives, and marinated cheese served in a treasure chest.',
calories: 350,
allergens: [Array]
},
{ name: 'Shipwreck Salad', description: 'Fresh' }
]
}
멀티모달 입력
지금까지 본 예에서는 텍스트 문자열을 모델 프롬프트로 사용했습니다. 이는 생성형 AI 모델에 프롬프트를 제공하는 가장 일반적인 방법이지만 많은 모델에서 다른 미디어를 프롬프트로 허용할 수도 있습니다. 미디어 프롬프트는 모델에 이미지에 캡션을 추가하거나 오디오 녹음 파일의 스크립트를 작성하는 등 미디어에 관한 작업을 실행하도록 지시하는 텍스트 프롬프트와 함께 가장 자주 사용됩니다.
미디어 입력을 수락하는 기능과 사용할 수 있는 미디어 유형은 모델과 API에 전적으로 종속됩니다. 예를 들어 Gemini 1.5 모델 시리즈는 이미지, 동영상, 오디오를 프롬프트로 허용할 수 있습니다.
미디어 프롬프트를 지원하는 모델에 미디어 프롬프트를 제공하려면 generate
에 간단한 텍스트 프롬프트를 전달하는 대신 미디어 부분과 텍스트 부분으로 구성된 배열을 전달합니다.
const { text } = await ai.generate([
{ media: { url: 'https://example.com/photo.jpg' } },
{ text: 'Compose a poem about this image.' },
]);
위 예에서는 공개적으로 액세스 가능한 HTTPS URL을 사용하여 이미지를 지정했습니다. 미디어 데이터를 데이터 URL로 인코딩하여 직접 전달할 수도 있습니다. 예를 들면 다음과 같습니다.
import { readFile } from 'node:fs/promises';
const b64Data = await readFile('photo.jpg', { encoding: 'base64url' });
const dataUrl = `data:image/jpeg;base64,${b64Data}`;
const { text } = await ai.generate([
{ media: { url: dataUrl } },
{ text: 'Compose a poem about this image.' },
]);
미디어 입력을 지원하는 모든 모델은 데이터 URL과 HTTPS URL을 모두 지원합니다. 일부 모델 플러그인은 다른 미디어 소스에 대한 지원을 추가합니다. 예를 들어 Vertex AI 플러그인을 사용하면 Cloud Storage (gs://
) URL도 사용할 수 있습니다.
미디어 생성
지금까지 이 페이지의 대부분의 예에서는 LLM을 사용하여 텍스트를 생성하는 방법을 다뤘습니다. 하지만 Genkit은 이미지 생성 모델에도 사용할 수 있습니다. 이미지 생성 모델에서 generate()
를 사용하는 것은 LLM을 사용하는 것과 유사합니다. 예를 들어 Vertex AI를 통해 Imagen2 모델을 사용하여 이미지를 생성하려면 다음 단계를 따르세요.
Genkit은 생성된 미디어의 표준 출력 형식으로
data:
URL을 사용합니다. 이는 처리할 수 있는 라이브러리가 많은 표준 형식입니다. 이 예에서는jsdom
의data-urls
패키지를 사용합니다.npm i --save data-urls
npm i --save-dev @types/data-urls
이미지를 생성하고 파일에 저장하려면
generate()
를 호출하여 이미지 생성 모델과 출력 형식의 미디어 유형을 지정합니다.import { imagen3Fast, vertexAI } from '@genkit-ai/vertexai'; import parseDataURL from 'data-urls'; import { genkit } from 'genkit'; import { writeFile } from 'node:fs/promises'; const ai = genkit({ plugins: [vertexAI({ location: 'us-central1' })], }); (async () => { const { media } = await ai.generate({ model: imagen3Fast, prompt: 'photo of a meal fit for a pirate', output: { format: 'media' }, }); if (media === null) throw new Error('No media generated.'); const data = parseDataURL(media.url); if (data === null) throw new Error('Invalid "data:" URL.'); await writeFile(`output.${data.mimeType.subtype}`, data.body); })();
다음 단계
Genkit 자세히 알아보기
- 앱 개발자가 생성형 AI 모델의 출력에 영향을 주는 기본적인 방법은 프롬프트를 사용하는 것입니다. 메시지 관리를 읽고 Genkit을 사용하여 효과적인 메시지를 개발하고 코드베이스에서 이를 관리하는 방법을 알아보세요.
generate()
는 모든 생성형 AI 기반 애플리케이션의 핵심이지만 실제 애플리케이션에서는 일반적으로 생성형 AI 모델을 호출하기 전후에 추가 작업이 필요합니다. 이를 반영하기 위해 Genkit에서는 함수처럼 정의되지만 관측 가능성 및 간소화된 배포와 같은 추가 기능을 추가하는 흐름 개념을 도입합니다. 자세한 내용은 워크플로 정의를 참고하세요.
고급 LLM 사용
- LLM의 기능을 향상하는 한 가지 방법은 LLM에 추가 정보를 요청하거나 사용자에게 특정 작업을 요청할 수 있는 방법 목록을 표시하는 것입니다. 이를 도구 호출 또는 함수 호출이라고 합니다. 이 기능을 지원하도록 학습된 모델은 특수 형식의 대답으로 프롬프트에 응답할 수 있습니다. 이 대답은 호출 애플리케이션에 특정 작업을 실행하고 결과를 원래 프롬프트와 함께 LLM으로 다시 전송해야 함을 나타냅니다. Genkit에는 도구 호출 구현의 프롬프트 생성과 호출-응답 루프 요소를 모두 자동화하는 라이브러리 함수가 있습니다. 자세한 내용은 도구 호출을 참고하세요.
- 검색 증강 생성 (RAG)은 모델의 출력에 도메인별 정보를 도입하는 데 사용되는 기법입니다. 이는 관련 정보를 프롬프트에 삽입한 후 언어 모델에 전달하는 방식으로 이루어집니다. 완전한 RAG 구현을 위해서는 텍스트 임베딩 생성 모델, 벡터 데이터베이스, 대규모 언어 모델 등 여러 기술을 통합해야 합니다. Genkit이 이러한 다양한 요소를 조정하는 프로세스를 간소화하는 방법을 알아보려면 검색 증강 생성 (RAG)을 참고하세요.
모델 출력 테스트
소프트웨어 엔지니어는 동일한 입력이 항상 동일한 출력을 생성하는 결정론적 시스템에 익숙합니다. 하지만 AI 모델은 확률적이며, 출력은 입력의 미묘한 뉘앙스, 모델의 학습 데이터, 온도와 같은 매개변수에 의해 의도적으로 도입된 무작위성 등에 따라 달라질 수 있습니다.
Genkit의 평가자는 다양한 전략을 사용하여 LLM의 응답 품질을 평가하는 구조화된 방법입니다. 평가 페이지에서 자세히 알아보세요.