채팅 세션을 지속하면 .NET 애플리케이션이 재시작 후에도 살아남을 수 있고, 대화의 백업을 제공하며, 세션을 다른 머신으로 이동할 수 있습니다. 이 가이드에서는 Aspose.LLM을 사용하여 C#에서 채팅 세션 지속 및 재개를 단계별로 살펴보며, 패턴을 사용해야 할 시점, 세션을 저장하고 로드하는 방법, 저장되는 데이터, 이식성 고려 사항 및 보안 모범 사례에 대해 다룹니다.

왜 채팅 세션을 지속하고 재개해야 할까요?

개발자는 종종 인터랙티브 어시스턴트, 지원 봇 또는 장기 실행 데이터 분석 워크플로를 구축합니다. 많은 시나리오에서 채팅 컨텍스트는 단일 프로세스의 수명을 넘어 살아남아야 합니다:

  • 사용자가 앱을 닫은 후에도 이전 문의가 계속 유지되기를 기대하는 데스크톱 지원 도구.
  • 여러 단계에 걸쳐 진행되며 유지 보수로 인해 재시작될 수 있는 서버 측 자동화.
  • 전체 대화의 스냅샷을 요구하는 감사 또는 규정 준수 요구사항.
  • 개발자 노트북에서 프로덕션 서버로 트러블슈팅 세션을 이동하는 경우.

세션을 JSON 파일에 지속함으로써 전체 메시지 기록과 정확한 연속성을 위해 필요한 내부 KV 캐시를 캡처하게 되며, 이를 통해 위에서 언급한 사용 사례들을 간단히 구현할 수 있습니다.

Aspose.LLM 시작하기

먼저, 프로젝트에 Aspose.LLM 패키지를 추가합니다:

Install-Package Aspose.LLM

더 많은 제품 세부 정보를 보려면 Aspose.LLM .NET 제품 페이지를 확인하십시오. SDK에는 유효한 라이선스가 필요하므로 임시 또는 영구 라이선스 파일을 준비해 두세요.

전제 조건

  • Aspose.LLM NuGet 패키지를 설치합니다.
  • Aspose.LLM.License를 사용하여 Aspose.LLM 라이선스를 적용합니다.
  • AsposeLLMApi 인스턴스를 생성합니다 (예: Qwen25Preset 사용).

이 패턴을 사용해야 할 때

이 패턴은 대화가 현재 프로세스가 끝난 후에도 지속되어야 하거나, 백업이나 마이그레이션을 위한 신뢰할 수 있는 스냅샷이 필요할 때 빛을 발합니다. 일반적인 시나리오는 다음과 같습니다:

  • 사용자가 시작 간에 채팅이 지속되기를 기대하는 데스크톱 또는 서버 앱.
  • 프로세스보다 오래 지속되어야 하는 대화가 필요한 장기 실행 워크플로.
  • 활성 대화를 스냅샷하여 백업 및 감사 목적.
  • 동일한 SDK 버전 및 프리셋을 가진 머신 간에 세션 상태를 마이그레이션.

사전 요구 사항

세션을 저장하거나 복원하기 전에, 다음 사항이 준비되어 있는지 확인하십시오:

  1. Aspose.LLM NuGet package – 이전에 표시된 명령을 통해 설치되었습니다.
  2. LicenseAspose.LLM.License 객체를 생성하고 .lic 파일을 사용하여 SetLicense를 호출합니다.
  3. API instance – 원하는 프리셋을 사용하여 AsposeLLMApi를 인스턴스화합니다 (예: new Qwen25Preset()).

이 단계들은 기사 뒷부분에 있는 전체 예제에서 시연됩니다.

세션 저장

SDK는 채팅 세션을 지속시키는 세 가지 편리한 방법을 제공합니다. 아래 단계를 따라 진행한 후 코드 샘플을 확인하십시오.

  1. 파일을 특정 위치에 저장해야 하는 경우 명시적인 파일 경로와 함께 SaveChatSession을 호출합니다.
  2. 경로를 생략하면 SDK가 실행 파일 옆에 <sessionId>.json을 작성합니다.
  3. Path.Combine을 사용해 임시 경로를 만들고, 디렉터리가 존재하는지 확인한 다음, 격리되거나 샌드박스 시나리오에 저장합니다.

코드 샘플 – 세션 저장

다음 예제는 세 가지 접근 방식을 모두 보여줍니다:

api.SaveChatSession(sessionId, "session-42.json");

api.SaveChatSession(sessionId); // writes <sessionId>.json next to the executable

string path = Path.Combine(Path.GetTempPath(), "chats", $"{sessionId}.json");
Directory.CreateDirectory(Path.GetDirectoryName(path)!);
api.SaveChatSession(sessionId, path);

api.SaveChatSession(sessionId, "session-42.json") 은(는) 제공된 위치에 JSON 파일을 씁니다. 경로를 지정하지 않고 SaveChatSession을 호출하면, SDK가 현재 작업 디렉터리에 세션 ID를 이름으로 하는 파일을 생성합니다. 결정적이거나 임시 위치가 필요할 때는 Path.GetTempPath와 자체 폴더 구조를 결합하고 저장하기 전에 디렉터리를 생성하십시오.

참고: 이 스니펫은 공식 Aspose 문서에서 재현된 것이며 샌드박스에서 실행되지 않았습니다. 프로덕션에 사용하기 전에 환경에서 확인하십시오.

Restore a Session

이전에 저장된 세션을 로드하는 것도 똑같이 간단합니다. API는 JSON 파일을 읽고 내부 상태를 재생성한 다음 세션 식별자를 반환하므로 ID를 수동으로 전달하지 않고도 메시징을 계속할 수 있습니다.

  1. LoadChatSession를 JSON 파일 경로와 함께 호출합니다.
  2. 반환된 sessionId를 저장합니다.
  3. 복원된 ID와 함께 SendMessageToSessionAsync를 사용하여 대화를 계속합니다.

코드 샘플 – 세션 복원

string sessionId = await api.LoadChatSession("session-42.json");
string reply = await api.SendMessageToSessionAsync(sessionId, "What did we discuss?");

LoadChatSession는 파일을 읽고 복원된 세션 ID를 반환합니다. 복원된 세션은 자동으로 활성 세션으로 설정되어 즉시 SendMessageToSessionAsync를 호출할 수 있습니다.

Note: 이 스니펫은 공식 Aspose 문서에서 재현된 것이며 샌드박스에서 실행되지 않았습니다. 프로덕션에서 사용하기 전에 환경에서 확인하십시오.

Full Example — Save, Restart, Resume

아래는 완전한 엔드‑투‑엔드 시연입니다. 첫 번째 블록은 채팅을 시작하고 몇 개의 메시지를 전송한 뒤 세션을 저장합니다. 두 번째 블록은 저장된 파일을 로드하고 대화를 계속하는 새로운 프로세스를 시뮬레이션합니다.

코드 샘플 – 엔드‑투‑엔드 워크플로우

using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;

// ---------- First run: save ----------
{
    var license = new Aspose.LLM.License();
    license.SetLicense("Aspose.LLM.lic");

using var api = AsposeLLMApi.Create(new Qwen25Preset());

string sessionId = await api.StartNewChatAsync(sessionId: "support-ticket-1234");

await api.SendMessageToSessionAsync(sessionId,
        "Customer reports that the migration from v25 to v26 broke their startup script.");
    await api.SendMessageToSessionAsync(sessionId,
        "Their environment: Windows Server 2022, .NET 8, CUDA 12.6.");
    await api.SendMessageToSessionAsync(sessionId,
        "What questions should I ask them next?");

api.SaveChatSession(sessionId, "support-ticket-1234.json");
    Console.WriteLine("Session saved.");
}

// ---------- Second run: resume ----------
{
    var license = new Aspose.LLM.License();
    license.SetLicense("Aspose.LLM.lic");

using var api = AsposeLLMApi.Create(new Qwen25Preset());

string sessionId = await api.LoadChatSession("support-ticket-1234.json");
    Console.WriteLine($"Resumed session: {sessionId}");

string reply = await api.SendMessageToSessionAsync(sessionId,
        "They replied that they use a custom build step that copies native DLLs. How should I proceed?");
    Console.WriteLine(reply);
}

첫 번째 블록은 라이선스를 생성하고 Qwen25Preset으로 API를 인스턴스화한 뒤, support-ticket-1234라는 새 채팅을 시작하고 컨텍스트를 구축하기 위해 세 개의 메시지를 전송하며, 마지막으로 세션을 support-ticket-1234.json에 기록합니다. 두 번째 블록은 라이선스와 API를 다시 생성하고 JSON 파일을 로드한 뒤 대화를 계속하여 모델이 이전 메시지를 유지함을 보여줍니다.

참고: 이 스니펫은 공식 Aspose 문서에서 재현된 것이며 샌드박스에서 실행되지 않았습니다. 프로덕션에 사용하기 전에 환경에서 확인하십시오.

무엇이 저장되나요?

SaveChatSession는 세 개의 필수 섹션을 포함하는 JSON 문서를 생성합니다:

  1. Session Identifier – 채팅을 시작할 때 제공한 고유 ID.
  2. Message History – 역할, 내용 및 모든 미디어 메타데이터를 포함한 사용자와 어시스턴트 메시지의 순서가 지정된 목록.
  3. KV Cache Metadata – 각 메시지에 대한 키‑값 캐시의 내부 위치와 크기로, 모델이 정확히 중단된 지점부터 다시 시작할 수 있게 합니다.

캐시 데이터가 포함되어 있기 때문에 복원된 세션은 이전 어텐션을 다시 계산하지 않고도 생성을 계속할 수 있어, 재개 작업이 빠르고 결정적입니다.

이식성 제약

JSON 파일에는 완벽한 연속에 필요한 모든 것이 포함되어 있지만, 특정 조건 하에서만 이식 가능합니다.

  • 동일한 SDK 메이저 버전 – 파일 형식은 메이저 릴리스 간에 변경될 수 있으므로 양쪽 모두 Aspose.LLM의 동일한 메이저 버전을 사용해야 합니다.
  • 동일한 모델 파일 – 기본 Hugging Face 모델(양자화 포함)이 정확히 일치해야 하며, 그렇지 않으면 KV 캐시가 호환되지 않습니다.
  • BinaryManagerParameters.ReleaseTag 일치 – 모델을 로드하는 데 사용되는 llama.cpp 런타임 버전이 동일해야 하며, 그렇지 않으면 저수준 텐서 레이아웃이 달라집니다.

알려진 로드‑시간 뉘앙스

LoadChatSession를 호출하면 SDK가 대화를 재구성하지만 기본 ContextParameters, ChatParameters, SamplerParameters를 적용합니다. 원래 세션 중에 사용한 사용자 지정 설정(예: temperature, max tokens, system prompts)은 자동으로 복원되지 않습니다. 정확한 생성 동작을 유지하려면 로드 후 사용자 지정 매개변수를 다시 적용하거나, 원하는 설정으로 새 세션에서 대화를 재생하십시오.

일반 오류

아래는 세션을 로드하는 동안 발생할 수 있는 일반적인 문제에 대한 빠른 체크리스트입니다.

  • FileNotFoundException – 파일 경로를 확인하십시오; 상대 경로는 현재 작업 디렉터리를 기준으로 해석됩니다.
  • InvalidOperationException on load – 호환되지 않는 SDK 버전이거나 손상된 JSON 파일임을 나타냅니다.
  • Garbled output after load – 일반적으로 모델 파일이나 ReleaseTag가 일치하지 않아 발생합니다. 로드하는 머신에 정확히 동일한 모델 바이너리가 존재하는지 확인하십시오.

이러한 예외를 우아하게 처리하고 자세한 진단 정보를 기록하면 애플리케이션이 보다 견고해집니다.

Security

지속되는 JSON 파일에는 모든 사용자 및 어시스턴트 메시지의 플레인‑텍스트 복사본이 포함됩니다. 보호되지 않은 위치에 저장하면 민감한 데이터가 노출될 수 있습니다. 다음과 같은 완화 방안을 고려하십시오:

  • 파일을 디스크에 쓰기 전에 암호화하십시오 (예: Windows DPAPI, Azure Key Vault, 또는 libsodium과 같은 크로스‑플랫폼 라이브러리).
  • 파일 시스템 권한을 제한하여 애플리케이션을 실행하는 서비스 계정만 파일을 읽고/쓸 수 있도록 하십시오.
  • 파일이 네트워크를 통해 전송되어야 하는 경우 TLS‑암호화 채널을 사용하고, 변조를 감지하기 위해 파일 서명을 고려하십시오.

다음 단계

채팅을 지속하고 재개할 수 있게 되었으니, 관련 기능을 탐색해 볼 수 있습니다:

  • 멀티턴 채팅 사용 사례 – 여러 상호작용에 걸쳐 더 긴 대화를 유지합니다.
  • 맞춤 프리셋 구성 – 지속하기 전에 모델 프리셋을 도메인에 맞게 조정합니다.
  • 전체 세션 지속성 참조SaveChatSession 및 관련 메타데이터에 대한 심층 의미를 확인하려면 API 참조를 검토하십시오.

올바른 접근 방식 선택

이 문서에서는 세션을 저장하는 세 가지 방법과 간단한 로드 방법을 제시했습니다. 배포 시나리오에 맞는 접근 방식을 선택하십시오:

  • Explicit path – 파일이 알려진 위치에 있어야 할 때 가장 적합합니다. 예를 들어 사용자 전용 폴더나 공유 네트워크 드라이브와 같습니다.
  • Default filename – 빠른 프로토타입을 만들거나 세션이 실행 파일과 함께 존재할 때 편리합니다.
  • Temporary path with directory creation – 샌드박스 환경, CI 파이프라인, 또는 OS가 정리를 관리하도록 하고 싶을 때 이상적입니다.

모든 접근 방식은 동일한 기본 API를 사용합니다; 파일 시스템을 관리하는 방식만 다릅니다.

무료 라이선스 받기

아직 영구 라이선스가 없으시다면, Aspose 임시 라이선스 페이지에서 임시 평가 라이선스를 얻을 수 있습니다.

무료 추가 리소스

결론

Aspose.LLM을 사용하여 채팅 세션을 지속하면 내구성, 감사 가능성 및 프로세스나 머신 간에 대화를 이동할 수 있는 유연성을 제공합니다. 이 패턴을 적용해야 할 시점, 세 가지 다른 방법으로 세션을 저장하는 방법, 복원하는 방법, JSON 파일에 포함된 내용, 그리고 염두에 두어야 할 호환성 및 보안 고려 사항을 배웠습니다. 전체 예제를 통해 이제 .NET 채팅 솔루션에 세션 지속성을 통합할 수 있습니다.

FAQs

  1. 채팅 세션을 지속하는 것이 언제 유용한가요?
    지속성은 실행 간에 대화 상태를 유지해야 하는 데스크톱 또는 서버 앱, 장기 실행 워크플로, 감사 또는 백업 요구 사항, 그리고 동일한 SDK 버전을 사용하는 머신 간에 세션을 마이그레이션해야 할 때 유용합니다.

  2. 세션을 저장할 때 사용자 지정 파일 경로를 어떻게 지정할 수 있나요?
    api.SaveChatSession(sessionId, "myfolder\myfile.json"); 를 호출하거나 Path.Combine 으로 경로를 구성하고 저장하기 전에 디렉터리가 존재하는지 확인하십시오.

  3. LoadChatSession이 반환하는 것은 무엇인가요?
    복원된 세션 식별자를 반환하므로 ID를 다시 제공하지 않고도 메시지 전송을 계속할 수 있습니다.

  4. 저장된 세션 파일을 다른 컴퓨터로 옮길 수 있나요?
    예, 대상 머신이 동일한 주요 SDK 버전, 동일한 모델 파일 및 일치하는 llama.cpp ReleaseTag를 사용하는 한 가능합니다.

  5. 저장된 JSON 파일은 안전한가요?
    파일은 일반 텍스트 대화 데이터를 저장하므로 신뢰할 수 없는 위치에 보관하기 전에 암호화해야 합니다.

  6. 로드 후에 사용자 지정 샘플러 또는 컨텍스트 설정이 복원되지 않는 이유는 무엇인가요?
    LoadChatSession은 기본 매개변수를 적용합니다; 로드 후에 사용자 지정 설정을 다시 적용하거나 새 세션에서 기록을 재생하십시오.

더 읽기