본문으로 건너뛰기

플러그인 사용 방법

이 가이드는 전체 런타임 API를 다룹니다: LLM 인스턴스 생성, 모델 로드, 메시지 전송, 런타임 모델 다운로드, 상태 관리 및 유틸리티 함수.

LLM 인스턴스 생성

먼저 Runtime Local LLM 객체를 생성합니다. 조기 가비지 컬렉션을 방지하기 위해 이에 대한 참조를 유지합니다(예: Blueprints의 변수 또는 C++의 UPROPERTY로).

Create Runtime Local LLM

모델 로드

메시지를 보내기 전에 모델을 로드해야 합니다. 이 플러그인은 워크플로에 따라 여러 가지 로딩 방법을 제공합니다.

이름으로 불러오기

편집기 설정 패널을 통해 모델을 관리하는 경우 Load Model (By Name)을 사용하세요.

UE 5.4 이상에서 Load Model (By Name)은 디스크에 있는 모든 모델의 드롭다운 목록을 표시합니다. 로드하려는 모델을 선택하기만 하면 됩니다.

Load Model By Name UE 5.4+

파일 경로에서 로드

.gguf 파일의 절대 파일 경로에서 직접 모델을 로드합니다:

Load Model From File

URL에서 로드 (다운로드 및 로드)

URL에서 모델을 다운로드하고(디스크에 없는 경우) 자동으로 로드합니다. 파일이 이미 로컬에 존재하면 다운로드를 건너뜁니다.

가장 간단한 변형은 URL만 필요로 하며, 메타데이터는 파일 이름에서 파생됩니다:

Load Model From URL Simple

Load Model From URL을 전체 모델 메타데이터와 함께 사용하여 더 풍부한 모델 정보를 얻을 수도 있습니다:

Load Model From URL

비동기 로드 (블루프린트)

출력 핀을 통해 로드 완료 및 오류를 처리하여 수동으로 델리게이트를 바인딩하는 대신, 두 개의 비동기 노드를 사용할 수 있습니다.

Load Model By Name (Async)Load Model (By Name)을 반영합니다. UE 5.4+에서는 디스크에 있는 모든 모델의 드롭다운을 표시합니다.

Load Model By Name Async UE 5.4+

Load Model From File (Async)는 절대 파일 경로를 대신 사용합니다:

Load Model From File Async

이벤트 바인딩

LLM 인스턴스의 델리게이트에 바인딩하여 콜백을 수신합니다. 모든 콜백은 게임 스레드에서 실행됩니다.

Bind Events

사용 가능한 델리게이트:

  • 토큰 생성 시: 각 출력 토큰에 대해 실행됩니다.
  • 생성 완료 시: 전체 응답이 준비되면 실행되며, 지속 시간, 토큰 수, 초당 토큰 수를 포함합니다.
  • 프롬프트 처리 시: 입력 프롬프트가 처리된 후, 생성이 시작되기 전에 실행됩니다.
  • 오류 발생 시: 모든 작업 중 오류가 발생하면 실행됩니다.
  • 모델 로드 시: 모델 로딩이 완료되면 실행됩니다.
  • 모델 언로드 시: 모델이 언로드되면 실행됩니다.
  • 다운로드 진행률: 모델 다운로드 중 주기적으로 실행됩니다 (진행률, 수신 바이트, 총 바이트).
  • 모델 다운로드 완료 시: 다운로드 전용 작업이 완료되면 실행됩니다.
  • 대화 저장 시: 대화가 JSON 파일에 기록되면 실행됩니다.
  • 대화 로드 시: 파일 또는 메모리 스냅샷에서 대화가 로드되면 실행됩니다.
  • 기록 요약 시: 자동 요약이 오래된 메시지를 압축할 때 실행됩니다 (메시지 수, 절약된 토큰, 요약 내용을 보고).

메시지 보내기

모델이 로드되면 사용자 메시지를 보내 응답을 생성합니다:

Send Message

특정 메시지의 시스템 프롬프트를 재정의하려면 Send Message With System Prompt를 사용하세요:

Send Message With System Prompt

토큰이 생성될 때 OnTokenGenerated를 통해 스트리밍됩니다. 생성이 완료되면 OnGenerationComplete가 전체 응답, 지속 시간, 토큰 수 및 초당 토큰 수와 함께 실행됩니다.

비동기 메시지 전송 (블루프린트)

Send LLM Message (Async) 노드는 토큰, 완료 및 오류에 대한 전용 출력 핀을 제공합니다.

Async Send Message

런타임에 모델 다운로드

위에서 설명한 다운로드 및 로드 흐름 외에도, 모델을 로드하지 않고 디스크에 다운로드할 수 있습니다. 이는 로딩 화면이나 설정 메뉴에서 모델을 미리 캐싱할 때 유용합니다.

Download Model

URL 전용 변형도 사용 가능합니다:

Download Model From URL

Download LLM Model (Async)Download LLM Model From URL (Async) 노드는 진행률, 완료 및 오류에 대한 출력 핀을 제공합니다.

Async Download Model

OnDownloadProgress 델리게이트는 다운로드 중 진행 상황을 보고합니다. OnModelDownloaded는 파일이 디스크에 저장될 때 실행됩니다.

진행 중인 다운로드를 취소하려면:

Cancel Download

이 플러그인은 중복 다운로드를 자동으로 방지합니다. 동일한 모델에 대한 다운로드가 이미 진행 중인 경우, 이후의 호출은 무시됩니다.

생성 중지

생성 중인 작업을 중단하려면:

Stop Generation

대화 컨텍스트 초기화

대화 기록을 지우고 새 대화를 시작합니다:

Reset Context

대화 저장 및 불러오기

이 플러그인은 대화 기록을 JSON 형식으로 디스크에 저장하거나 메모리에 스냅샷으로 유지할 수 있습니다. 기본적으로 시스템 프롬프트는 저장에서 제외되므로, 동일한 대화 기록을 다른 시스템 규칙을 가진 여러 LLM 인스턴스에 로드할 수 있습니다. 이는 각 캐릭터가 고유한 메모리를 가지면서도 시스템 지시사항을 공유하거나 다르게 설정할 수 있는 다중 NPC 시나리오에 유용합니다.

파일에 저장

현재 대화를 디스크의 JSON 파일로 저장하세요:

Save Conversation To File

Include System Prompt 매개변수는 시스템 메시지(있는 경우)를 파일에 기록할지 여부를 제어합니다. NPC 간 이식성을 위해 기본값은 false입니다.

대화 저장됨은 파일이 기록될 때 실행됩니다.

파일에서 로드

JSON 파일에서 대화를 다시 불러오기:

Load Conversation From File

Preserve Current System Prompt 파라미터(기본값 true)는 저장된 대화 기록을 교체하는 동안 현재 로드된 시스템 프롬프트를 그대로 유지합니다. 이는 NPC 메모리 교체에 권장되는 설정입니다.

대화 로드됨은 로드된 스냅샷과 함께 실행됩니다.

인메모리 스냅샷 (멀티 NPC 워크플로우)

게임플레이 중 빠른 NPC 교체를 위해 현재 대화를 디스크에 쓰지 않고 메모리에 스냅샷으로 저장하세요. 이 패턴은 단일 로드된 모델을 공유하는 여러 NPC를 관리하는 권장 방식입니다.

일반적인 다중 NPC 패턴은 NPC 관리자나 게임 상태에서 이름 → LLM 대화 스냅샷 맵을 사용합니다.

  1. NPC에서 전환할 때: Save Conversation To Memory를 호출한 후, On Conversation Loaded(스냅샷 전달 시에도 실행됨)에서 스냅샷을 NPC 이름을 키로 하여 맵에 저장합니다.
  2. 다른 NPC로 전환할 때: 맵에서 스냅샷을 읽어와 Preserve Current System Prompt를 활성화한 상태로 Load Conversation From Memory를 호출합니다.

Multi NPC Pattern

시스템 프롬프트가 스왑 간에도 계속 로드되어 있으므로, 각 NPC의 "성격"은 NPC별 시스템 프롬프트에 인코딩하거나(스왑 후 Send Message With System Prompt를 한 번 호출하여 업데이트) 모든 NPC 간에 공유할 수 있습니다.

스냅샷은 모델에 종속되지 않습니다. 메시지를 저장할 뿐, KV 캐시 상태는 저장하지 않습니다. 동일한 스냅샷을 다른 모델에 로드할 수 있습니다(단, 대화 스타일이 달라질 수 있습니다). 스냅샷의 OriginModelFamilyName 필드를 통해 어떤 모델이 생성했는지 확인할 수 있으며, 호환성을 강제하려면 이 정보를 활용할 수 있습니다.

자동 컨텍스트 요약

긴 대화는 결국 모델의 컨텍스트 창을 초과하게 되며, 이는 일반적으로 기록이 잘리거나 오류가 발생하게 됩니다. 플러그인의 자동 요약 기능은 컨텍스트 사용량을 모니터링하고, 설정된 임계값을 초과하면 다음 응답이 생성되기 전에 오래된 메시지를 단일 "메모리" 메시지로 요약합니다. 이를 통해 무기한 긴 대화에서도 토큰 비용과 지연 시간을 안정적으로 유지할 수 있습니다.

요약은 동일하게 로드된 모델에 의해 수행되므로, 별도의 모델이나 API 호출이 필요하지 않습니다.

자동 요약 활성화

Enable Auto Summarization

기본 요약 설정 가져오기를 사용하여 합리적인 기본값을 얻은 후 필요에 따라 조정하세요:

Get Default Summarization Config

활성화되면, 필요 시 각 SendMessage 호출 전에 요약이 자동으로 실행되며, 추가 작업이 필요하지 않습니다.

기본적으로 자동 요약은 새 메시지가 처리되기 전에 실행됩니다. 이는 응답 생성과 동시에 안전하게 수행될 수 없는 컨텍스트를 재구축해야 하기 때문입니다. 대신 플레이어가 읽고 입력하는 동안 응답 후에 실행되도록 하려면 자동 요약을 비활성화하고 수동으로 구동하세요: On Generation Complete에 바인딩하고, Get Used Context Length를 임계값과 확인한 후, 초과 시 Summarize Now를 호출하세요. Summarize Now는 동일한 백그라운드 작업 큐에 대기되므로, 응답이 완료된 직후이자 다음 메시지가 처리되기 전에 실행됩니다.

설정 참조

매개변수Type기본값설명
트리거 토큰 임계값int321500요약은 사용된 컨텍스트 토큰이 이 값을 초과할 때 실행됩니다. 컨텍스트 크기를 기준으로 설정하되, 약 60-75%가 적절한 기준입니다.
최근 메시지 수 유지int324가장 최근 N개의 메시지는 요약되지 않으며, 즉각적인 대화의 일관성을 유지합니다.
요약할 최소 메시지 수int326이전 메시지 중 요약 대상이 되는 메시지가 이 개수보다 적으면 요약을 건너뜁니다 (의미 없는 작은 요약을 방지).
최대 요약 토큰int32256생성된 요약의 최대 토큰 길이
시스템 프롬프트 유지booltrue항상 시스템 메시지(인덱스 0)를 그대로 유지하세요
요약 지침FString(see default)모델에 요약을 생성하도록 보낸 명령어
요약 메시지 접두사FString"[이전 대화의 장기 기억 요약]:"어시스턴트 역할의 메모리 메시지로 대화에 삽입될 때 생성된 요약 앞에 추가됩니다.

수동 트리거 및 요약 청취

임계값과 관계없이 언제든지 수동으로 요약을 트리거할 수 있습니다.

Summarize Now

On History Summarized에 바인딩하여 요약 패스가 완료될 때 알림을 받습니다. 이 이벤트는 제거된 메시지 수, 절약된 토큰 수, 생성된 요약 텍스트를 보고하므로 채팅 UI에 미묘한 표시기를 표시하는 데 유용합니다.

On History Summarized

사용된 컨텍스트 길이 조회 중

Get Used Context Length를 사용하여 모델의 컨텍스트 창에 현재 몇 개의 토큰이 점유되어 있는지 확인하세요. 이 값은 내장된 자동 요약 트리거가 Trigger Token Threshold와 비교하여 확인하는 값과 동일합니다.

Get Used Context Length

자동 요약 비활성화

Disable Auto Summarization

비활성화해도 이미 대화에 적용된 요약은 되돌려지지 않습니다.

노트

요약은 백그라운드 스레드에서 실행되는 데 시간이 걸립니다(모델이 요약을 생성 중입니다). 이 내부 생성 중에는 토큰 스트림 콜백이 억제되므로 채팅 UI에 표시되지 않습니다. On History Summarized는 스플라이스가 완료되면 한 번 실행됩니다.

모델 언로드하기

모델이 더 이상 필요하지 않을 때 리소스를 해제합니다:

Unload Model

쿼리 상태

LLM 인스턴스의 현재 상태를 확인하세요:

Query State

  • 모델 로드됨: 추론 준비가 완료된 모델이 있으면 True
  • 생성 중: 생성이 진행 중이면 True
  • 사용 중: 로딩, 생성, 다운로드 등 어떤 작업이 활성화되어 있으면 True
  • 다운로드 중: 모델 다운로드가 진행 중이면 True
  • 로드된 모델 메타데이터 가져오기: 현재 모델의 메타데이터를 반환합니다
  • 적용된 추론 파라미터 가져오기: 로드 시 적용된 파라미터를 반환합니다

모델 라이브러리 함수

모델 파일을 디스크에서 관리하기 위한 정적 유틸리티 함수 세트가 제공됩니다. 이는 모델 선택 UI를 구축하거나 런타임 시 모델 가용성을 확인하는 데 유용합니다.

다운로드된 모델 이름 / 메타데이터 가져오기

Get Downloaded Model Names

Get All Downloaded Model Metadata

모델이 디스크에 있는지 확인

Is Model On Disk

모델 파일 경로 가져오기

Get Model File Path

모델 파일 삭제

Delete Model Files

사전 정의된 사용 가능한 모델 가져오기

Get Predefined Models

Get All Available Models

URL에서 메타데이터 구축

원시 URL에서 모델 메타데이터를 구성합니다(필드는 파일 이름에서 파생됨).

Make Metadata From URL

유틸리티 함수

서식 지정 및 오류 표시를 위한 도우미 함수 세트가 제공됩니다.

바이트를 읽을 수 있는 문자열로 변환

바이트 수를 사람이 읽을 수 있는 문자열로 변환합니다(예: "4.07 GB"). UI에서 모델 크기를 표시할 때 유용합니다.

Bytes to Readable String

형식 다운로드 진행률

다운로드 진행률 문자열을 "1.23 GB / 4.07 GB (30.2%)" 형식으로 포맷합니다. 전체 크기를 알 수 없는 경우, 수신된 양만 반환합니다.

Format Download Progress

오류 설명 가져오기 / 오류 코드 문자열

Get LLM Error Description는 오류 코드에 대한 사람이 읽을 수 있는 텍스트 설명을 반환합니다. Get LLM Error Code String은 열거형 값 이름을 문자열로 반환합니다(로깅에 유용함).

Get Error Description

오류 코드 참조

Code설명
알 수 없음0지정되지 않은 오류
모델 로드 실패10GGUF 파일을 불러오지 못했습니다 (파일 손상, 호환되지 않는 형식 등).
ContextCreateFailed11추론 컨텍스트를 생성하지 못했습니다.
모델이 로드되지 않음20모델이 로드되지 않은 상태에서 추론이 시도되었습니다.
ChatTemplateFailed21모델의 채팅 템플릿을 적용하지 못했습니다.
토큰화 실패22입력 텍스트를 토큰화할 수 없습니다.
ContextOverflow23프롬프트 + 컨텍스트가 설정된 컨텍스트 크기를 초과했습니다.
PromptDecodeFailed24프롬프트 토큰을 디코딩하지 못했습니다.
ContextTooFullToGenerate25출력을 생성할 수 있는 컨텍스트 공간이 부족합니다.
GenerationDecodeFailed30생성 중 토큰 디코딩에 실패했습니다.
GenerationTruncated31생성이 중단되었습니다. 최대 토큰 제한에 도달했기 때문입니다.
LLMInstanceNull40LLM 인스턴스가 null이거나 유효하지 않습니다.
ModelNotFoundOnDisk41모델 파일이 예상된 경로에 존재하지 않습니다
ModelURLEmpty42다운로드 요청 시 URL이 비어 있었습니다.
모델 다운로드 취소됨43다운로드가 취소되었습니다.
ModelDownloadEmptyData44다운로드가 완료되었지만 응답 본문이 비어 있습니다.
모델 다운로드 저장 실패45다운로드가 완료되었지만 파일을 디스크에 저장할 수 없습니다.