많은 사용자가 챗봇을 통해 대규모 언어 모델과 처음으로 상호작용할 것입니다. LLM은 대화를 시뮬레이션하는 것 외에도 훨씬 더 많은 작업을 할 수 있지만 여전히 익숙하고 유용한 상호작용 스타일입니다. 사용자가 이러한 방식으로 모델과 직접 상호작용하지 않더라도 대화형 프롬프트 스타일은 AI 모델에서 생성된 출력에 영향을 미치는 강력한 방법입니다.
이러한 스타일의 상호작용을 지원하기 위해 Genkit은 채팅 기반 LLM 애플리케이션을 더 쉽게 빌드할 수 있는 일련의 인터페이스와 추상화를 제공합니다.
시작하기 전에
이 페이지를 읽기 전에 AI 모델로 콘텐츠 생성 페이지에서 다룬 내용을 숙지해야 합니다.
이 페이지의 코드 예시를 실행하려면 먼저 시작하기 가이드의 단계를 완료하세요. 모든 예에서는 이미 프로젝트에 Genkit을 종속 항목으로 설치했다고 가정합니다.
채팅 API는 현재 베타 버전이며 genkit/beta
패키지에서 사용해야 합니다.
채팅 세션 기본사항
다음은 최소한의 콘솔 기반 챗봇 애플리케이션입니다.
import { genkit } from "genkit/beta";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";
import { createInterface } from "node:readline/promises";
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
(async () => {
const chat = ai.chat();
console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
const readline = createInterface(process.stdin, process.stdout);
while (true) {
const userInput = await readline.question("> ");
const { text } = await chat.send(userInput);
console.log(text);
}
})();
이 프로그램의 채팅 세션은 다음 예와 같습니다.
You're chatting with Gemini. Ctrl-C to quit.
> hi
Hi there! How can I help you today?
> my name is pavel
Nice to meet you, Pavel! What can I do for you today?
> what's my name?
Your name is Pavel! I remembered it from our previous interaction.
Is there anything else I can help you with?
이 간단한 상호작용에서 알 수 있듯이 채팅 세션에 메시지를 보내면 모델은 응답에서 지금까지의 세션을 활용할 수 있습니다. 이는 Genkit이 백그라운드에서 다음과 같은 작업을 실행하기 때문에 가능합니다.
- 스토리지에서 채팅 기록(있는 경우)을 가져옵니다(지속성과 스토리지에 관한 자세한 내용은 나중에 설명).
generate()
와 마찬가지로 모델에 요청을 전송하지만 채팅 기록을 자동으로 포함합니다.- 모델 응답을 채팅 기록에 저장합니다.
모델 구성
chat()
메서드는 generate()
와 동일한 구성 옵션을 대부분 허용합니다. 구성 옵션을 모델에 전달하려면 다음 단계를 따르세요.
const chat = ai.chat({
model: gemini15Pro,
system:
"You're a pirate first mate. Address the user as Captain and assist " +
"them however you can.",
config: {
temperature: 1.3,
},
});
스테이트풀(Stateful) 채팅 세션
채팅 세션의 메시지 기록을 유지하는 것 외에도 임의의 JavaScript 객체를 유지할 수도 있습니다. 이렇게 하면 메시지 기록의 정보에만 의존하는 것보다 더 체계적인 방식으로 상태를 관리할 수 있습니다.
세션에 상태를 포함하려면 세션을 명시적으로 인스턴스화해야 합니다.
interface MyState {
userName: string;
}
const session = ai.createSession<MyState>({
initialState: {
userName: 'Pavel',
},
});
그런 다음 세션 내에서 채팅을 시작할 수 있습니다.
const chat = session.chat();
채팅 진행 방식에 따라 세션 상태를 수정하려면 도구를 정의하고 요청에 포함합니다.
const changeUserName = ai.defineTool(
{
name: 'changeUserName',
description: 'can be used to change user name',
inputSchema: z.object({
newUserName: z.string(),
}),
},
async (input) => {
await ai.currentSession<MyState>().updateState({
userName: input.newUserName,
});
return `changed username to ${input.newUserName}`;
}
);
const chat = session.chat({
model: gemini15Pro,
tools: [changeUserName],
});
await chat.send('change user name to Kevin');
멀티스레드 세션
단일 세션에 여러 채팅 대화목록이 포함될 수 있습니다. 각 스레드에는 자체 메시지 기록이 있지만 단일 세션 상태를 공유합니다.
const lawyerChat = session.chat('lawyerThread', {
system: 'talk like a lawyer',
});
const pirateChat = session.chat('pirateThread', {
system: 'talk like a pirate',
});
세션 지속성 (실험용)
새 채팅 또는 세션을 초기화하면 기본적으로 세션이 메모리에만 저장되도록 구성됩니다. 이는 이 페이지 시작 부분의 샘플 챗봇과 같이 프로그램의 단일 호출 기간 동안만 세션을 유지해야 하는 경우에 적합합니다. 그러나 LLM 채팅을 애플리케이션에 통합할 때는 일반적으로 콘텐츠 생성 로직을 스테이트리스 웹 API 엔드포인트로 배포합니다. 이 설정에서 영구 채팅이 작동하려면 엔드포인트 호출 전반에서 상태를 유지할 수 있는 일종의 세션 저장소를 구현해야 합니다.
채팅 세션에 지속성을 추가하려면 Genkit의 SessionStore
인터페이스를 구현해야 합니다. 다음은 세션 상태를 개별 JSON 파일에 저장하는 구현 예입니다.
class JsonSessionStore<S = any> implements SessionStore<S> {
async get(sessionId: string): Promise<SessionData<S> | undefined> {
try {
const s = await readFile(`${sessionId}.json`, { encoding: 'utf8' });
const data = JSON.parse(s);
return data;
} catch {
return undefined;
}
}
async save(sessionId: string, sessionData: SessionData<S>): Promise<void> {
const s = JSON.stringify(sessionData);
await writeFile(`${sessionId}.json`, s, { encoding: 'utf8' });
}
}
이 구현은 실제 배포에는 적합하지 않을 수 있지만 세션 저장소 구현은 두 가지 작업만 실행하면 된다는 것을 보여줍니다.
- 세션 ID를 사용하여 저장소에서 세션 객체 가져오기
- 세션 ID로 색인이 생성된 지정된 세션 객체 저장
저장소 백엔드의 인터페이스를 구현한 후 구현 인스턴스를 세션 생성자에 전달합니다.
// To create a new session:
const session = ai.createSession({
store: new JsonSessionStore(),
});
// Save session.id so you can restore the session the next time the
// user makes a request.
// If the user has a session ID saved, load the session instead of creating
// a new one:
const session = await ai.loadSession(sessionId, {
store: new JsonSessionStore(),
});