메모리가 포함된 채팅 에이전트 구축
원문: Koog Documentation — chat-agent-with-memory 이 글은 Koog 공식 문서의 chat-agent-with-memory 페이지를 한국어로 옮긴 번역본입니다. 문서 구조와 링크 의미를 유지하되, MkDocs 전용 UI 문법은 블로그에서 읽기 좋도록 정리했습니다.
메모리가 포함된 채팅 에이전트 구축
이 가이드에서는 대화형 명령줄 채팅 애플리케이션을 만드는 방법을 보여줍니다. ChatMemory 기능을 사용하여 여러 에이전트 상호 작용에서 이전 메시지를 기억합니다.
CLI 애플리케이션은 다음 루프를 실행합니다.
- 콘솔에서 입력을 읽습니다.
- 입력이
/bye이 아니거나 비어 있으면 사용자 입력 및 지정된 세션 ID로 에이전트를 실행합니다. - 에이전트는 먼저 세션 ID에 대한 이전 대화 기록을 로드합니다. 사용자 입력 외에 프롬프트에 메시지를 추가합니다.
- 에이전트가 LLM 상호 작용을 수행합니다.
- 실행이 끝나면 응답을 반환하기 전에 에이전트는 지정된 세션 ID에 전체 대화 기록을 저장합니다. 크기를 최신 메시지 20개로 제한
- 그런 다음 앱은 에이전트의 응답을 인쇄합니다.
다음은 예시입니다.
1graph TB2 subgraph agent [Agent with chat memory]3 load[Load chat history]4 save[Save chat history]5 llm([LLM interaction])6 7 load --> llm --> save8 end9 10 start((Start))11 read[Read input]12 print[Print response]13 exit((Exit))14 15 start --> read16 read --"/bye"--> exit17 read --"empty"--> read18 read --"User input"--> agent19 agent --"Agent response"--> print --> read암호
참고: Prerequisites
--8<-- "quickstart-snippets.md:전제조건"
메인 Koog agents package 추가 그리고 chat memory feature package 종속성으로:
그레이들(코틀린)
1dependencies {2 implementation("ai.koog:koog-agents:0.7.0")3 implementation("ai.koog:agents-features-memory:0.7.0")4}그레이들(그루비)
1dependencies {2 implementation 'ai.koog:koog-agents:0.7.0'3 implementation 'ai.koog:agents-features-memory:0.7.0'4}메이븐
1<dependency>2 <groupId>ai.koog</groupId>3 <artifactId>koog-agents-jvm</artifactId>4 <version>0.7.0</version>5</dependency>6<dependency>7 <groupId>ai.koog</groupId>8 <artifactId>agents-features-memory-jvm</artifactId>9 <version>0.7.0</version>10</dependency>--8<-- "quickstart-snippets.md:api-key"
이 페이지의 예에서는 OPENAI_API_KEY 환경 변수를 설정했다고 가정합니다.
코틀린
1suspend fun main() {2 val sessionId = "my-conversation"34 simpleOpenAIExecutor(System.getenv("OPENAI_API_KEY")).use { executor ->5 val agent = AIAgent(6 promptExecutor = executor,7 llmModel = OpenAIModels.Chat.GPT5_2,8 systemPrompt = "You are a helpful assistant."9 ) {10 install(ChatMemory) {11 windowSize(20) // keep only the last 20 messages12 }13 }1415 while (true) {16 print("You: ")17 val input = readln().trim()18 if (input == "/bye") break19 if (input.isEmpty()) continue2021 val reply = agent.run(input, sessionId)22 println("Assistant: $reply\n")23 }24 }25}자바
1public class ExampleChatAgentOpenAI {2 public static void main(String[] args) {3 String sessionId = "my-conversation";45 try (var executor = simpleOpenAIExecutor(System.getenv("OPENAI_API_KEY"))) {6 AIAgent<String, String> agent = AIAgent.builder()7 .promptExecutor(executor)8 .llmModel(OpenAIModels.Chat.GPT5_2)9 .systemPrompt("You are a helpful assistant.")10 .install(ChatMemory.Feature, config -> {11 config.windowSize(20); // keep only the last 20 messages12 })13 .build();1415 Scanner scanner = new Scanner(System.in);16 while (true) {17 System.out.print("You: ");18 String input = scanner.nextLine().trim();19 if (input.equals("/bye")) break;20 if (input.isEmpty()) continue;2122 String reply = agent.run(input, sessionId);23 System.out.println("Assistant: " + reply + "\n");24 }25 } catch (Exception e) {26 e.printStackTrace();27 }28 }29}구현 세부정보
agent.run()에 대한 두 번째 인수는 session ID입니다.
진행 중인 대화를 식별하고 구별하는 데 사용됩니다.
이 예에서는 한 번에 하나의 대화만 있기 때문에 일정합니다.
예를 들어 실제 애플리케이션에서는 동일한 사용자와 관련된 대화에 대해 별도의 고유 ID를 가질 수 있습니다.
에이전트는 기본값 history provider을 사용합니다. 대화 내용을 메모리에 저장하는 것입니다. 즉, 애플리케이션이 종료되면 기록이 손실됩니다. 실제 애플리케이션에서는 사용자 정의 기록 공급자를 구현해야 합니다. 기록을 데이터베이스나 파일에 지속적으로 저장합니다.
windowSize(20) preprocessor은 제한된 컨텍스트 크기를 보장합니다.
에이전트는 최신 메시지를 최대 20개까지만 저장합니다.
이것이 없으면 프롬프트 크기가 컨텍스트 제한을 넘어 커질 수 있습니다.
예시 세션
1You: My name is Alice.2Assistant: Nice to meet you, Alice! How can I help you today?34You: What's my favorite color? It's blue.5Assistant: Got it — your favorite color is blue!67You: What's my name?8Assistant: Your name is Alice!각 상호작용이 별도의 에이전트 실행임에도 불구하고 에이전트는 "당신의 이름은 Alice입니다!"라고 정확하게 대답합니다.
ChatMemory 기능이 세 번째 메시지를 처리하기 전에 이전 교환을 로드했기 때문입니다.