Unity용 LLM을 사용하면 Unity 엔진 내에서 LLM(대형 언어 모델)을 원활하게 통합할 수 있습니다.
이를 통해 플레이어가 몰입형 경험을 위해 상호 작용할 수 있는 지능형 캐릭터를 만들 수 있습니다.
또한 이 패키지에는 데이터 전체에 걸쳐 의미론적 검색을 수행할 수 있는 RAG(검색 증강 생성) 시스템이 포함되어 있으며, 이를 통해 캐릭터의 지식을 향상시킬 수 있습니다. Unity용 LLM은 멋진 llama.cpp 라이브러리를 기반으로 구축되었습니다.
? Unity에서 테스트됨: 2021 LTS, 2022 LTS, 2023
? 다가오는 릴리스
프로젝트를 추가하려면 저희에게 연락하세요!
방법 1: 에셋 스토어를 사용하여 설치
Add to My Assets
클릭하세요.Window > Package Manager
Packages: My Assets
옵션을 선택하세요.LLM for Unity
패키지를 선택하고 Download
클릭한 다음 Import
클릭하세요.방법 2: GitHub 저장소를 사용하여 설치:
Window > Package Manager
+
버튼을 클릭하고 Add package from git URL
선택합니다.https://github.com/undreamai/LLMUnity.git
을 사용하고 Add
클릭하세요. 먼저 게임에 대한 LLM을 설정하겠습니다.
Add Component
클릭하고 LLM 스크립트를 선택합니다.Download Model
버튼(~GB)을 사용하여 기본 모델 중 하나를 다운로드합니다.Load model
버튼을 사용하여 자신의 .gguf 모델을 로드하세요(LLM 모델 관리 참조).그러면 각 캐릭터를 다음과 같이 설정할 수 있습니다.♀️:
Add Component
클릭하고 LLMCharacter 스크립트를 선택합니다.Prompt
에서 AI의 역할을 정의하세요. AI의 이름( AI Name
)과 플레이어( Player Name
)를 정의할 수 있습니다.LLM
필드에서 위에 구성된 LLM을 선택합니다.원하는 대로 LLM 및 문자 설정을 조정할 수도 있습니다(옵션 참조).
스크립트에서 다음과 같이 사용할 수 있습니다.
using LLMUnity ;
public class MyScript {
public LLMCharacter llmCharacter ;
void HandleReply ( string reply ) {
// do something with the reply from the model
Debug . Log ( reply ) ;
}
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply ) ;
.. .
}
}
모델 응답이 완료되면 호출할 함수를 지정할 수도 있습니다.
이는 모델의 연속 출력에 대해 Stream
옵션이 활성화된 경우 유용합니다(기본 동작).
void ReplyCompleted ( ) {
// do something when the reply from the model is complete
Debug . Log ( " The AI replied " ) ;
}
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply , ReplyCompleted ) ;
.. .
}
완료될 때까지 기다리지 않고 채팅을 중지하려면 다음을 사용할 수 있습니다.
llmCharacter . CancelRequests ( ) ;
그게 다야 ✨!
다음을 수행할 수도 있습니다.
Android 앱을 빌드하려면 플레이어 설정에서 IL2CPP
스크립팅 백엔드와 ARM64
대상 아키텍처로 지정해야 합니다.
이러한 설정은 Player > Other Settings
섹션의 Edit > Project Settings
메뉴에서 액세스할 수 있습니다.
앱 크기를 작게 유지하려면 LLM GameObject에서 Download on Build
옵션을 활성화하여 실행 시 모델을 다운로드하는 것도 좋은 생각입니다.
채팅 기록을 자동으로 저장/로드하려면 LLMCharacter의 Save
매개변수를 선택한 파일 이름(또는 상대 경로)에 지정하면 됩니다. 파일은 Unity의 persistDataPath 폴더에 저장됩니다. 이는 또한 LLM의 상태를 저장하므로 이전에 캐시된 프롬프트를 다시 계산할 필요가 없습니다.
채팅 기록을 수동으로 저장하려면 다음을 사용하세요.
llmCharacter . Save ( " filename " ) ;
기록을 로드하려면 다음을 수행하세요.
llmCharacter . Load ( " filename " ) ;
여기서 filename은 선택한 파일 이름 또는 상대 경로입니다.
void WarmupCompleted ( ) {
// do something when the warmup is complete
Debug . Log ( " The AI is nice and ready " ) ;
}
void Game ( ) {
// your game function
.. .
_ = llmCharacter . Warmup ( WarmupCompleted ) ;
.. .
}
Chat
함수의 마지막 인수는 기록에 메시지를 추가할지 여부를 지정하는 부울입니다(기본값: true).
void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
_ = llmCharacter . Chat ( message , HandleReply , ReplyCompleted , false ) ;
.. .
}
void Game ( ) {
// your game function
.. .
string message = " The cat is away " ;
_ = llmCharacter . Complete ( message , HandleReply , ReplyCompleted ) ;
.. .
}
이를 위해 async
/ await
기능을 사용할 수 있습니다:
async void Game ( ) {
// your game function
.. .
string message = " Hello bot! " ;
string reply = await llmCharacter . Chat ( message , HandleReply , ReplyCompleted ) ;
Debug . Log ( reply ) ;
.. .
}
using UnityEngine ;
using LLMUnity ;
public class MyScript : MonoBehaviour
{
LLM llm ;
LLMCharacter llmCharacter ;
async void Start ( )
{
// disable gameObject so that theAwake is not called immediately
gameObject . SetActive ( false ) ;
// Add an LLM object
llm = gameObject . AddComponent < LLM > ( ) ;
// set the model using the filename of the model.
// The model needs to be added to the LLM model manager (see LLM model management) by loading or downloading it.
// Otherwise the model file can be copied directly inside the StreamingAssets folder.
llm . SetModel ( " Phi-3-mini-4k-instruct-q4.gguf " ) ;
// optional: you can also set loras in a similar fashion and set their weights (if needed)
llm . AddLora ( " my-lora.gguf " ) ;
llm . SetLoraWeight ( 0.5f ) ;
// optional: you can set the chat template of the model if it is not correctly identified
// You can find a list of chat templates in the ChatTemplate.templates.Keys
llm . SetTemplate ( " phi-3 " ) ;
// optional: set number of threads
llm . numThreads = - 1 ;
// optional: enable GPU by setting the number of model layers to offload to it
llm . numGPULayers = 10 ;
// Add an LLMCharacter object
llmCharacter = gameObject . AddComponent < LLMCharacter > ( ) ;
// set the LLM object that handles the model
llmCharacter . llm = llm ;
// set the character prompt
llmCharacter . SetPrompt ( " A chat between a curious human and an artificial intelligence assistant. " ) ;
// set the AI and player name
llmCharacter . AIName = " AI " ;
llmCharacter . playerName = " Human " ;
// optional: set streaming to false to get the complete result in one go
// llmCharacter.stream = true;
// optional: set a save path
// llmCharacter.save = "AICharacter1";
// optional: enable the save cache to avoid recomputation when loading a save file (requires ~100 MB)
// llmCharacter.saveCache = true;
// optional: set a grammar
// await llmCharacter.SetGrammar("json.gbnf");
// re-enable gameObject
gameObject . SetActive ( true ) ;
}
}
원격 서버를 사용하여 처리를 수행하고 서버와 상호 작용하는 캐릭터를 구현할 수 있습니다.
서버 만들기
서버를 생성하려면:
LLM
스크립트를 사용하여 GameObject로 프로젝트를 만듭니다.LLM
의 Remote
옵션을 활성화하고 선택적으로 서버 매개변수(포트, API 키, SSL 인증서, SSL 키)를 구성합니다.또는 보다 쉬운 배포를 위해 서버 바이너리를 사용할 수 있습니다.
windows-cuda-cu12.2.0
을 사용하세요. 캐릭터 만들기
위에서 설명한 대로 LLMCharacter
스크립트를 사용하여 게임 캐릭터로 두 번째 프로젝트를 만듭니다. Remote
옵션을 활성화하고 서버의 IP 주소("http://"로 시작)와 포트로 호스트를 구성합니다.
Embeddings
함수를 사용하여 구문의 삽입을 얻을 수 있습니다.
List < float > embeddings = await llmCharacter . Embeddings ( " hi, how are you? " ) ;
기능 수준에 대한 자세한 문서는 여기에서 찾을 수 있습니다.
Unity용 LLM은 RAG(Retrieval-Augmented Generation) 시스템을 통해 초고속 유사성 검색 기능을 구현합니다.
이는 LLM 기능과 usearch 라이브러리의 ANN(Approximate Nearest Neighbors) 검색을 기반으로 합니다.
의미 검색은 다음과 같이 작동합니다.
데이터 구축 데이터에 추가할 텍스트 입력(구, 단락, 문서)을 제공합니다.
각 입력은 청크로 분할되고(선택 사항) LLM을 사용하여 임베딩으로 인코딩됩니다.
검색 그런 다음 쿼리 텍스트 입력을 검색할 수 있습니다.
입력이 다시 인코딩되고 데이터에서 가장 유사한 텍스트 입력 또는 청크가 검색됩니다.
의미 검색을 사용하려면:
Add Component
클릭하고 RAG
스크립트를 선택합니다.SimpleSearch
간단한 무차별 검색인 반면, DBSearch
는 대부분의 경우 선호되는 빠른 ANN 방법입니다.또는 코드에서 RAG를 생성할 수 있습니다(여기서 llm은 LLM임).
RAG rag = gameObject . AddComponent < RAG > ( ) ;
rag . Init ( SearchMethods . DBSearch , ChunkingMethods . SentenceSplitter , llm ) ;
스크립트에서 다음과 같이 사용할 수 있습니다.
using LLMUnity ;
public class MyScript : MonoBehaviour
{
RAG rag ;
async void Game ( ) {
.. .
string [ ] inputs = new string [ ] {
" Hi! I'm a search system. " ,
" the weather is nice. I like it. " ,
" I'm a RAG system "
} ;
// add the inputs to the RAG
foreach ( string input in inputs ) await rag . Add ( input ) ;
// get the 2 most similar inputs and their distance (dissimilarity) to the search query
( string [ ] results , float [ ] distances ) = await rag . Search ( " hello! " , 2 ) ;
// to get the most similar text parts (chnuks) you can enable the returnChunks option
rag . ReturnChunks ( true ) ;
( results , distances ) = await rag . Search ( " hello! " , 2 ) ;
.. .
}
}
RAG 상태를 저장할 수 있습니다( Assets/StreamingAssets
폴더에 저장됨).
rag . Save ( " rag.zip " ) ;
디스크에서 로드합니다.
await rag . Load ( " rag.zip " ) ;
RAG를 사용하여 사용자 메시지를 기반으로 LLM에 관련 데이터를 공급할 수 있습니다.
string message = " How is the weather? " ;
( string [ ] similarPhrases , float [ ] distances ) = await rag . Search ( message , 3 ) ;
string prompt = " Answer the user query based on the provided data. n n " ;
prompt += $" User query: { message } n n " ;
prompt += $" Data: n " ;
foreach ( string similarPhrase in similarPhrases ) prompt += $" n - { similarPhrase } " ;
_ = llmCharacter . Chat ( prompt , HandleReply , ReplyCompleted ) ;
RAG
샘플에는 RAG 구현 예시와 RAG-LLM 통합 예시가 포함되어 있습니다.
그게 다야 ✨!
Unity용 LLM은 LLM을 로드하거나 다운로드하여 게임에 직접 제공할 수 있는 모델 관리자를 사용합니다.
모델 관리자는 LLM GameObject의 일부로 찾을 수 있습니다.
Download model
버튼을 통해 모델을 다운로드할 수 있습니다.
Unity용 LLM에는 Q4_K_M 방법으로 양자화된 다양한 모델 크기에 내장된 다양한 최첨단 모델이 포함되어 있습니다.
대체 모델은 HuggingFace에서 .gguf 형식으로 다운로드할 수 있습니다.
모델을 로컬로 다운로드하고 Load model
버튼을 사용하여 로드하거나, Download model > Custom URL
필드에서 URL을 복사하여 직접 다운로드할 수 있습니다.
HuggingFace 모델이 gguf 파일을 제공하지 않는 경우 이 온라인 변환기를 사용하여 gguf로 변환할 수 있습니다.
프롬프트를 구성하는 데 사용되는 채팅 템플릿은 모델(관련 항목이 있는 경우) 또는 모델 이름에서 자동으로 결정됩니다.
잘못 식별된 경우 채팅 템플릿 드롭다운에서 다른 템플릿을 선택할 수 있습니다.
모델 관리자에 추가된 모델은 구축 과정에서 게임에 복사됩니다.
"빌드" 확인란을 선택 취소하여 모델 내장을 생략할 수 있습니다.
모델을 제거하려면(디스크에서는 삭제하지 않고) bin 버튼을 클릭하면 됩니다.
추가된 각 모델의 경로와 URL(다운로드한 경우)은 >>
버튼을 사용하여 모델 관리자 액세스의 확장된 보기에 표시됩니다.
Download on Build
옵션을 선택하여 더 가벼운 빌드를 만들 수 있습니다.
이 옵션을 사용하면 모델이 빌드에 복사되는 대신 게임이 처음 시작될 때 다운로드됩니다.
모델을 로컬로 로드한 경우 확장된 보기를 통해 URL을 설정해야 합니다. 그렇지 않으면 빌드에 복사됩니다.
❕ 모델을 사용하기 전에 라이선스를 확인 하세요 ❕
Samples~ 폴더에는 상호 작용의 몇 가지 예가 포함되어 있습니다.
샘플을 설치하려면 다음 안내를 따르세요.
Window > Package Manager
LLM for Unity
을 선택하세요. Samples
탭에서 설치하려는 샘플 옆에 있는 Import
클릭합니다. 샘플은 폴더 내에 포함된 Scene.unity
장면으로 실행할 수 있습니다.
장면에서 LLM
GameObject를 선택하고 Download Model
버튼을 클릭하여 기본 모델을 다운로드하거나 Load model
자체 모델을 로드합니다(LLM 모델 관리 참조).
장면을 저장하고 달리며 즐겨보세요!
Show/Hide Advanced Options
아래에서 고급 옵션을 표시/숨기려면 전환하세요.Log Level
로그 메시지의 상세 정도를 선택합니다.Use extras
선택(플래시 주의 및 IQ 퀀트) LLM에 대한 원격 액세스를 제공하려면 Remote
선택
LLM 서버를 실행하기 위한 Port
( Remote
설정된 경우)
Num Threads
사용할 스레드 수(기본값: -1 = 모두)
Num GPU Layers
GPU로 오프로드할 모델 레이어 수입니다. 0으로 설정하면 GPU가 사용되지 않습니다. GPU를 최대한 활용하려면 30보다 큰 숫자를 사용하십시오. 컨텍스트 크기 값이 높을수록 더 많은 VRAM이 사용됩니다. 사용자의 GPU가 지원되지 않으면 LLM이 CPU로 대체됩니다.
Unity 편집기에서 모델의 출력을 기록하기 위한 Debug
선택
Parallel Prompts
병렬로 발생할 수 있는 프롬프트/슬롯 수를 나타냅니다(기본값: -1 = LLMCharacter 개체 수). 컨텍스트 크기는 슬롯별로 나누어져 있습니다. 예를 들어 모든 LLMCharacter 개체에 대해 Parallel Prompts
1과 슬롯 0으로 설정하면 전체 컨텍스트를 사용하지만 LLMCharacter 개체가 채팅에 사용될 때마다 전체 프롬프트를 계산해야 합니다(캐싱 없음).
Dont Destroy On Load
선택하면 새 장면을 로드할 때 LLM GameObject를 파괴하지 않습니다. API key
LLMCharacter 개체의 요청에 대한 액세스를 허용하는 데 사용하는 API 키( Remote
설정된 경우)
Load SSL certificate
요청의 종단 간 암호화를 위한 SSL 인증서를 로드할 수 있습니다( Remote
이 설정된 경우). SSL 키도 필요합니다.Load SSL key
하면 요청의 종단 간 암호화를 위한 SSL 키를 로드할 수 있습니다( Remote
이 설정된 경우). SSL 인증서도 필요합니다.SSL certificate path
요청의 종단 간 암호화에 사용되는 SSL 인증서입니다( Remote
이 설정된 경우).SSL key path
요청의 종단 간 암호화에 사용되는 SSL 키입니다( Remote
이 설정된 경우). Download model
클릭하면 기본 모델 중 하나를 다운로드할 수 있습니다.
Load model
클릭하면 .gguf 형식으로 자신의 모델을 로드할 수 있습니다.
Download on Start
다운로드)를 활성화하면 게임을 처음 시작할 때 LLM 모델을 다운로드할 수 있습니다. 또는 LLM 모델이 빌드에 직접 복사됩니다.
Context Size
프롬프트 컨텍스트의 크기(0 = 모델의 컨텍스트 크기)Download lora
.gguf 형식의 LoRA 모델을 다운로드하려면 클릭하세요.Load lora
로드 클릭하여 LoRA 모델을 .gguf 형식으로 로드합니다.Batch Size
프롬프트 처리를 위한 배치 크기(기본값: 512)Model
(Assets/StreamingAssets 폴더 기준).Chat Template
LLM에 사용되는 채팅 템플릿입니다.Lora
사용 중인 LoRA의 경로(Assets/StreamingAssets 폴더 기준)Lora Weights
.Flash Attention
모델에서 플래시 주의를 사용하려면 클릭합니다( Use extras
이 활성화된 경우). Base Prompt
LLM을 사용하는 모든 LLMCharacter 객체에 걸쳐 사용할 공통 기본 프롬프트입니다.
Show/Hide Advanced Options
아래에서 고급 옵션을 표시/숨기려면 전환하세요.Log Level
로그 메시지의 상세 정도를 선택합니다.Use extras
선택(플래시 주의 및 IQ 퀀트) Remote
사용된 LLM이 원격인지 로컬인지 여부LLM
게임 개체 LLM( Remote
설정되지 않은 경우)Hort
IP( Remote
이 설정된 경우)Port
( Remote
이 설정된 경우)Num Retries
LLM 서버에서 HTTP 요청 재시도 횟수( Remote
이 설정된 경우)API key
LLM 서버의 API 키( Remote
이 설정된 경우)Save
Save Cache
을 선택하면 채팅 기록과 함께 LLM 상태를 저장합니다. LLM 상태는 일반적으로 약 100MB 이상입니다.Debug Prompt
Unity 편집기에서 생성된 프롬프트를 기록하려면 선택합니다. Player Name
플레이어의 이름AI Name
.Prompt
설명 모델이 제작되는 대로 응답을 받으려면 Stream
선택하세요(권장!).
선택하지 않은 경우 모델의 전체 답변을 한 번에 받습니다.
Num Predict
(기본값: 256, -1 = 무한대, -2 = 컨텍스트가 채워질 때까지)Load grammar
.Grammar
사용되는 문법 경로(Assets/StreamingAssets 폴더 기준)Cache Prompt
채팅에서 진행 중인 프롬프트를 저장합니다. (기본값: true)Slot
슬롯입니다. 값은 0에서 Parallel Prompts
-1까지 설정할 수 있습니다(기본값: -1 = 각 캐릭터에 대한 새 슬롯)Seed
시드입니다. 매번 무작위 결과를 얻으려면 -1을 사용하세요.Temperature
LLM 온도, 값이 낮을수록 더 결정적인 답변을 제공합니다(기본값: 0.2).Top K
상위 k 샘플링(기본값: 40, 0 = 비활성화됨)Top P
top-p 샘플링(기본값: 0.9, 1.0 = 비활성화됨)Min P
최소 확률 (기본값: 0.05)Repeat Penalty
생성된 텍스트에서 토큰 시퀀스의 반복을 제어합니다(기본값: 1.1)Presence Penalty
반복된 토큰 존재 페널티(기본값: 0.0, 0.0 = 비활성화됨)Frequency Penalty
반복된 토큰 빈도 페널티(기본값: 0.0, 0.0 = 비활성화됨)Tfs_z
: 매개변수 z를 사용하여 테일 프리 샘플링을 활성화합니다(기본값: 1.0, 1.0 = 비활성화됨).Typical P
: 매개변수 p를 사용하여 로컬 일반 샘플링을 활성화합니다(기본값: 1.0, 1.0 = 비활성화됨).Repeat Last N
: 반복에 대한 처벌을 고려할 마지막 N 토큰(기본값: 64, 0 = 비활성화됨, -1 = ctx-size).Penalize Nl
: 반복 페널티를 적용할 때 개행 토큰에 페널티를 적용합니다(기본값: true).Penalty Prompt
: 페널티 평가 목적에 대한 프롬프트입니다. null
, 문자열 또는 토큰을 나타내는 숫자 배열일 수 있습니다(기본값: null
= 원래 prompt
사용).Mirostat
: Mirostat 샘플링을 활성화하여 텍스트 생성 중 혼란을 제어합니다(기본값: 0, 0 = 비활성화, 1 = Mirostat, 2 = Mirostat 2.0).Mirostat Tau
: Mirostat 목표 엔트로피, 매개변수 tau(기본값: 5.0)를 설정합니다.Mirostat Eta
: Mirostat 학습률, 매개변수 eta(기본값: 0.1)를 설정합니다.N Probs
: 0보다 큰 경우 응답에는 생성된 각 토큰에 대한 상위 N 토큰의 확률도 포함됩니다(기본값: 0).Ignore Eos
: 스트림 토큰의 끝을 무시하고 생성을 계속하도록 활성화합니다(기본값: false). Unity용 LLM 라이선스는 MIT(LICENSE.md)이며 MIT 및 Apache 라이선스와 함께 타사 소프트웨어를 사용합니다. 자산에 포함된 일부 모델은 자체 라이센스 조건을 정의하므로 각 모델을 사용하기 전에 이를 검토하십시오. 타사 라이센스는 (Third Party Notices.md)에서 확인할 수 있습니다.