중장기 기억이 통합된 캐릭터 채팅
여기서 확인해보세요!
저는 최근 다양한 캐릭터 롤플레잉 AI 서비스를 실험하고 즐겼습니다. 제가 가장 좋아하는 것은 Cloud Whale Interactive Technology의 Character.ai, Doppel.ai 및 Poly.ai입니다(고객 서비스 챗봇 개발자인 poly.ai와 혼동하지 마세요).
그러나 이러한 각 시스템에는 문제를 악화시킬 수 있는 제한 사항이 있습니다. 나는 이 프로젝트에서 그 중 몇 가지를 다루려고 노력했습니다.
캐릭터 기반 채팅은 훌륭하고 몰입도가 높지만 기억력이 짧습니다. 그들은 종종 배경, 상황, 중요한 이전 사건을 추적하지 못합니다. 더 긴 컨텍스트 창을 사용하면 도움이 될 수 있지만 토큰은 비쌉니다! 캐릭터에게 긴 기억력을 부여하면서 완료할 때마다 전송되는 토큰 수를 제한하려면 어떻게 해야 할까요? 그러나 Doppel.ai는 나머지 것보다 이것에 대해 훨씬 낫습니다. 그들의 캐릭터는 더 긴 기억을 가지고 있습니다.
캐릭터는 시간이 지남에 따라 개성을 잃거나 반복적인 반응 루프에 갇히는 경향이 있습니다. 일부 서비스는 다른 서비스보다 낫지만 모든 서비스에서 어느 정도 그런 일이 발생하는 것을 보았습니다.
캐릭터는 일단 생성되면 정적입니다. 일부 서비스에서는 캐릭터에 추가 '추억'을 추가할 수 있지만, 대화를 다시 시작하지 않고도 캐릭터의 기본 성격을 변경할 수 있는 서비스를 아직 찾지 못했습니다.
에이전트에는 다단계 "메모리" 또는 동적으로 변경되는 시스템 프롬프트가 제공됩니다. 여기에는 가장 최근의 매우 구체적인 것부터 대부분의 거리에 있는 주제 및 정보에 대한 보다 요약된 것까지 이전 대화 차례의 정보 수준이 포함됩니다.
단기 기억 롤링 채팅 창 모델에 대한 각 호출에는 매우 짧은 이전 메시지 목록이 축어적으로 포함됩니다. 이는 모델이 현재 대화와 최근 메시지의 컨텍스트를 추적하는 데 도움이 됩니다.
중기 메모리 스크래치패드 또한 AI 에이전트가 대화의 최근 하이라이트를 추적하기 위해 메모하는 데 사용할 스크래치패드를 만들었습니다. 이 스크래치패드는 새로운 정보가 추가되거나 업데이트되고 오래된 정보로 롤링 기반으로 업데이트되며 더 이상 관련 정보가 삭제되지 않습니다. 그러나 스크래치 패드의 스냅샷이 벡터 데이터베이스에 항목으로 저장되기 때문에 실제로 정보가 손실되지는 않습니다.
이 정보는 요약되므로 최근 정보를 압축하여 모델이 더 긴 채팅 창과 더 큰 컨텍스트의 이점을 누릴 수 있도록 하는 동시에 프롬프트에 포함되는 실제 토큰을 최소화합니다.
요약을 돕기 위해 각 메시지에는 캐릭터 이름('사용자' 및 '보조자'뿐만 아니라)이 포함됩니다. 이는 또한 모델이 누가 무엇을 말하고 있는지 추적하는 데 도움이 됩니다. 이렇게 하면 AI 에이전트가 누가 무엇을 말했는지 혼동할 가능성이 훨씬 줄어듭니다(그렇지 않으면 문제가 됩니다). 또한 대화에서 차례대로 진행하는 에티켓을 유지하는 데 도움이 되며 에이전트가 사용자를 대신하여 말하는 것을 방지합니다(이 역시 문제가 될 수 있음).
장기 벡터 저장 메모리 대화 요약을 사용하여 대화에서 중요한 정보를 추출한 다음 이를 벡터 데이터베이스에 저장합니다. 각 사용자 쿼리는 벡터 데이터베이스에서 의미 검색을 실행하여 이전 대화 요약에서 관련 정보를 불러옵니다. 이 정보는 모델에 대한 프롬프트와 몇 가지 최신 메시지에 포함됩니다.
이렇게 하면 AI 에이전트의 메모리가 해당 컨텍스트를 훨씬 초과할 수 있습니다. 실제로 벡터 저장소는 상대적으로 적은 디스크 공간을 차지하므로 에이전트 메모리의 잠재적인 유효 크기는 기능적으로 무제한입니다.
추억은 저장될 때 타임스탬프와 함께 저장되고, 불러올 때는 시간순으로 정렬됩니다. 에이전트는 기억이 상충되는 경우 최신 정보를 선호하도록 지시받습니다.
결과 모델은 대부분의 경우 대화 초기 정보를 정확하게 기억할 수 있습니다. 벡터 매장 검색은 일반적으로 관련 정보를 검색하는 데 성공하지만 모델이 항상 응답에 실제로 정보를 활용하는 것은 아닙니다. 하지만 대체로 결과에 만족했습니다.
다음 단계
모델이 이전 이벤트를 보다 적극적으로 참조하도록 하고 싶습니다. 이전 대화에 대해 직접 질문하면 대부분 회상에 성공하지만 자발적으로 이전 사건을 언급하는 경우는 거의 없습니다. 그것은 그 순간에 아주 많이 살고 있습니다. 이 동작을 생성하기 위해 신속한 엔지니어링 작업을 진행 중이지만 아직 작업 중입니다.
또한 에이전트가 캐릭터나 장소의 프로필을 구축하고 특정 엔터티와 관련된 정보를 저장할 수 있도록 명명된 엔터티 인식을 사용하는 것을 고려하고 있습니다. 이는 모델이 단순한 대화 스냅샷이 아닌 엔터티별로 정보를 구성하는 데 도움이 됩니다.
저는 캐릭터들이 독특한 말하기 스타일로 시작하는 경우가 많았지만, 시간이 지나면서 그들의 스타일이 퇴색되어 매우 단조롭고 기본 AI처럼 들리는 것을 발견했습니다. 나는 문자로 공지사항을 작성하는 것을 포함하여 몇 가지 솔루션을 실험했습니다. 그러나 이는 토큰 밀도가 낮은 노트를 생성하여 메모리에 많은 토큰을 낭비했습니다.
대신 모델이 예제 스타일로 제공하는 첫 번째 응답 샘플을 저장합니다. 이 첫 번째 응답은 모든 프롬프트에 대한 예시 말하기 스타일로 모든 프롬프트에서 상담원에게 전달됩니다. 나는 이것이 긴 대화(100회 이상 완료) 동안에도 모델이 일관되게 말하기 스타일을 유지하는 데 매우 효과적이라는 것을 발견했습니다.
다음 단계 메시지의 톤은 일관되지만 모델에 더욱 강력하고 미묘하며 일관된 개성을 부여하고 싶습니다. 아마도 미세 조정이 필요할 것으로 생각됩니다.
많은 LLM 롤플레잉 시스템에서 캐릭터는 일단 생성되면 정적입니다. 그러나 제가 구현한 경우에는 캐릭터 설명과 이름까지 즉시 변경할 수 있습니다. 특히 유용한 점은 위치와 사용자 이름을 변경하는 기능입니다.
캐릭터 설명 때때로 최근 사건으로 인해 변화를 원하거나 시간이 지남에 따라 목표나 동기가 발전하기를 원합니다. 캐릭터 설명을 즉석에서 직접 조정하면 쉽게 수행할 수 있습니다.
위치 대화와 역할극은 종종 상상의 세계를 돌아다닐 수 있습니다. 마을에서 던전으로, 기숙사에서 커피숍으로, 집에서 직장으로 갈 수 있습니다. 내 사이트를 사용하면 대화 위치를 즉시 변경할 수 있습니다.
사용자 이름 대부분의 캐릭터 롤플레잉 시스템의 또 다른 과제는 여러 캐릭터를 포함하는 것입니다. 내 시스템에서는 말하고 있는 캐릭터의 이름을 즉시 변경할 수 있습니다. 이를 통해 대화나 상황에서 여러 캐릭터를 시뮬레이션할 수 있습니다.
캐릭터 이름을 변경하는 것은 실제로 그다지 유용하지 않습니다. 캐릭터가 다른 캐릭터를 플레이하도록 하는 것은 작동하지 않으며 모델이 현재 대화를 이전 대화 요약과 연관시키려고 할 때 혼란을 일으킬 것입니다.
다음 단계