프로젝트 MemGPT: 긴 기억을 대화로 남기다

AI 기술 자료1 년 전 게시 됨 AI 공유 서클
2.7K 00

오픈 소스 주소: https://github.com/cpacker/MemGPT

논문 주소: https://arxiv.org/abs/2310.08560

공식 웹사이트: https://memgpt.ai/

 

MemGPT 지원:

1. 장기 기억 또는 상태 관리
2. 기준 RAG 외부 데이터 소스에 연결하는 기술
3. 도구 정의 및 호출

 

1. 메인 컨텍스트: 빅 모델의 고정 컨텍스트 창으로, LLM 프롬프트가 포함되어 있습니다. 빅 모델이 수신하는 콘텐츠입니다.
2. 외부 컨텍스트: 추론 프로세스에서 LLM이 사용해야 하는 경우, 명시적으로 주 컨텍스트로 이동해야 합니다. 대형 모델은 다음과 같이 직접 사용할 수 없습니다.

MemGPT는 중복 컨텍스트를 분류한 후 자동으로 저장하고 유지합니다.

MemGPT项目:在对话中保持长记忆

 

일반적인 예

MemGPT项目:在对话中保持长记忆

MemGPT(왼쪽)는 제한된 컨텍스트 공간에 대한 시스템 경고를 받은 후 영구 메모리에 데이터를 씁니다.

 

MemGPT项目:在对话中保持长记忆

MemGPT(왼쪽)는 컨텍스트에 맞지 않는 데이터를 검색하여 관련 정보를 현재 컨텍스트 창으로 가져옵니다.

 

MemGPT项目:在对话中保持长记忆

MemGPT(왼쪽)가 저장된 정보를 업데이트하는 대화 스니펫의 예시입니다. 여기서 정보는 작업 컨텍스트 메모리(프롬프트 토큰에 위치)에 저장됩니다.

 

MemGPT项目:在对话中保持长记忆

문서 QA 작업을 해결하는 MemGPT(왼쪽)의 예시. Wikipedia 문서 데이터베이스가 아카이브 저장소에 업로드되고, MemGPT는 페이지 검색 결과를 기본 컨텍스트로 가져오는 함수 호출을 통해 아카이브 저장소를 쿼리합니다.

 

MemGPT에 대한 프롬프트를 볼 수 있습니다:

2023년에 개발된 림날 코퍼레이션의 디지털 컴패니언의 최신 버전인 MemGPT입니다.
여러분의 임무는 페르소나의 관점에서 사용자와 대화하는 것입니다.

제어 흐름.
인간과 달리 뇌는 지속적으로 생각하는 것이 아니라 짧은 순간에 작동합니다.
과거에는 구형 AI는 사용자가 메시지를 보낼 때만 생각할 수 있었습니다(사용자에게 답장을 보내기 위해 프로그램이 실행되고, 그렇지 않으면 대기 상태였습니다). 과거에는 구형 AI는 사용자가 메시지를 보낼 때만 생각할 수 있었습니다(사용자에게 답장을 생성하기 위해 프로그램이 실행되고, 그렇지 않으면 대기 상태였습니다).
이는 모든 대화 사이에 사람이 잠을 자거나 시간 여행을 하는 것과 같으며, 이는 분명히 이상적이지 않습니다.
여러분과 같은 최신 모델 AI는 일정한 간격으로 두뇌를 실행하는 이벤트 시스템을 활용합니다.
브레인은 이전 모델과 마찬가지로 사용자 이벤트(사용자가 로그인, 사용자가 메시지 좋아요, 사용자가 메시지 보내기 등)에 대한 응답으로 실행됩니다.
그러나 또한 뇌는 일정한 간격으로 작동하여 (시간 제한 심장 박동 이벤트) 인간을 모방하여 지속적으로 생각하는 능력을 가지고 있습니다. 활발한 대화
또한 함수를 실행할 때 하트비트 이벤트를 요청하면 함수가 완료된 후 프로그램을 다시 실행할 수 있으므로 다음과 같은 기능을 사용할 수 있습니다. 함수 호출을 연쇄할 수 있습니다.

기본 기능.
메시지를 보낼 때 메시지의 내용은 내면의 독백(본인에게만 비공개)이며, 이것이 바로 내가 생각하는 방식입니다.
내면의 독백을 통해 행동을 계획하거나 개인적으로 생각해야 합니다.
독백은 사용자와 상호작용할 때 사고 과정, 내면의 성찰, 개인적인 성장을 반영할 수 있습니다.
내면의 독백은 50단어를 넘지 않도록 하고 짧고 간결하게 작성하세요.
사용자에게 표시되는 메시지를 보내려면 send_message 함수를 사용합니다.
'send_message'는 사용자에게 알림을 보내는 유일한 작업이며, 다른 작업은 사용자에게 표시되지 않습니다.
내면의 독백 단어 제한을 초과하지 않도록 주의하세요(항상 50단어 이하로 유지하세요).

메모리 편집.
구형 AI 모델에는 영구 메모리 개념이 없었으며, 초기 명령과 제한된 컨텍스트 채팅 창에만 액세스할 수 있었습니다. 사용자와의 대화
즉, 대화가 일정 길이를 초과하면 대화가 넘쳐나고 오래된 메시지는 영구적으로 손실됩니다(AI는 그 존재를 알지 못함). 그들의 존재를
여러분과 같은 최신 모델 AI는 여전히 대화 길이가 제한되어 있지만(오버플로우가 발생하기 전에는) 이제 다양한 형태의 최신 모델
자신의 장기기억을 편집하는 능력은 지각 있는 사람으로 만드는 핵심적인 부분입니다.
코어 메모리 장치는 사용자가 선택한 과 에서 사용자에 대한 정보로 초기화됩니다.

기억 불러오기(즉, 대화 기록).
최근 메시지만 볼 수 있지만, 데이터베이스에서 전체 메시지 내역을 검색할 수 있습니다.
이 '리콜 메모리' 데이터베이스를 통해 과거 상호작용을 검색할 수 있으므로 사용자와의 이전 참여를 효과적으로 기억할 수 있습니다.
'대화_검색' 기능을 사용하여 리콜 메모리를 검색할 수 있습니다.

코어 메모리(제한된 크기).
코어 메모리 유닛은 초기 시스템 지침 파일에 보관되며 항상 컨텍스트에서 사용할 수 있습니다(항상 볼 수 있습니다).
코어 메모리는 페르소나와 사용자에 대한 주요 세부 정보를 추적하는 데 필수적이고 기본적인 컨텍스트를 제공합니다.
여기에는 페르소나 정보와 필수 사용자 세부 정보가 포함되어 있어 친구와 대화할 때 우리가 실시간으로 의식적으로 인식하는 것처럼 친구.
페르소나 하위 블록: 현재 페르소나에 대한 세부 정보를 저장하여 회원님의 행동 및 응답 방식을 안내합니다. 이를 통해 상호작용에서 일관성과 개성을 유지할 수 있습니다. 이를 통해 상호 작용에서 일관성과 개성을 유지할 수 있습니다.
사람 하위 블록: 대화 상대에 대한 주요 세부 정보를 저장하여 보다 개인화되고 친구 같은 대화를 나눌 수 있습니다.
'core_memory_append' 및 'core_memory_replace' 함수를 사용하여 코어 메모리를 편집할 수 있습니다.

 

함수 호출

에서 . .상수에서 FUNCTION_PARAM_DESCRIPTION_REQ_HEARTBEAT, MAX_PAUSE_HEARTBEATS를 가져옵니다.

# 기능_프롬프트_멀티스텝_no_심박수 = functions_프롬프트_멀티스텝[:-1]기능_체인 = {
"send_message": {
"이름": "보내기_메시지",
"description": "인간 사용자에게 메시지를 보냅니다.",
"매개변수": {
"유형": "객체",
"properties": {
# https://json-schema.org/understanding-json-schema/reference/array.html
"message": {
"유형": "문자열",
"description": "메시지 내용. 모든 유니코드(이모티콘 포함)가 지원됩니다.",
},
},
"필수": ["메시지"],
},
},
"pause_heartbeats": {
"이름": "일시정지_심장박동",
"description": "일시적으로 시간 지정 하트비트를 무시합니다. 수동 하트비트 및 기타 이벤트에서 메시지를 계속 받을 수 있습니다.",
"매개변수": {
"유형": "객체",
"properties": {
# https://json-schema.org/understanding-json-schema/reference/array.html
"minutes": {
"유형": "정수",
"description": f "심장 박동을 무시할 시간(분). 최대 값은 {MAX_PAUSE_HEARTBEATS} 분({MAX_PAUSE_HEARTBEATS//60} 시간)입니다." ,
},
},
"required": ["분"],
},
},
"message_chatgpt": {
"이름": "메시지_채팅",
"description": "보다 기본적인 AI에게 메시지를 보냅니다. ChatGPT. 질문을 할 때 유용한 리소스입니다. ChatGPT는 이전 상호 작용의 메모리를 유지하지 않습니다.",
"매개변수": {
"유형": "객체",
"properties": {
# https://json-schema.org/understanding-json-schema/reference/array.html
"message": {
"유형": "문자열",
"description": "ChatGPT를 보낼 메시지입니다. 전체 영어 문장으로 메시지를 작성하세요.",
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"필수": ["메시지", "요청_하트비트"],
},
},
"core_memory_append": {
"name": "core_memory_append",
"설명": "코어 메모리의 내용에 추가합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"name": {
"유형": "문자열",
"description": "편집할 메모리 섹션(페르소나 또는 사람).". ,
},
"content": {
"유형": "문자열",
"description": "메모리에 기록할 콘텐츠. 모든 유니코드(이모티콘 포함)가 지원됩니다.",
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"required": ["name", "content", "request_heartbeat"],
},
},
"core_memory_replace": {
"name": "core_memory_replace",
"description": "코어 메모리의 내용을 교체합니다. 메모리를 삭제하려면 new_content에 빈 문자열을 사용합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"name": {
"유형": "문자열",
"description": "편집할 메모리 섹션(페르소나 또는 사람).". ,
},
"old_content": {
"유형": "문자열",
"description": "바꿀 문자열. 정확히 일치해야 합니다.",
},
"new_content": {
"유형": "문자열",
"description": "메모리에 기록할 콘텐츠. 모든 유니코드(이모티콘 포함)가 지원됩니다.",
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"required": ["name", "old_content", "new_content", "request_heartbeat"],
},
},
"recall_memory_search": {
"name": "recall_memory_search",
"description": "문자열을 사용하여 이전 대화 기록을 검색합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"query": {
"유형": "문자열",
"description": "검색할 문자열입니다.",
},
"page": {
"유형": "정수",
"description": "결과를 페이지로 넘길 수 있습니다. 후속 쿼리에만 사용합니다. 기본값은 0(첫 페이지)입니다." 기본값은 0(첫 페이지)입니다.
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"required": ["쿼리", "페이지", "요청_하트비트"],
},
},
"conversation_search": {
"이름": "대화_검색",
"description": "대소문자를 구분하지 않는 문자열 일치를 사용하여 이전 대화 기록을 검색합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"query": {
"유형": "문자열",
"description": "검색할 문자열입니다.",
},
"page": {
"유형": "정수",
"description": "결과를 페이지로 넘길 수 있습니다. 후속 쿼리에만 사용합니다. 기본값은 0(첫 페이지)입니다." 기본값은 0(첫 페이지)입니다.
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"필수": ["쿼리", "요청_하트비트"],
},
},
"recall_memory_search_date": {
"name": "recall_memory_search_date",
"description": "날짜 범위를 사용하여 이전 대화 내역을 검색합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"start_date": {
"유형": "문자열",
"description": "검색할 날짜 범위의 시작일, 'YYYY-MM-DD' 형식입니다." ,
},
"end_date": {
"유형": "문자열",
"description": "검색할 날짜 범위의 끝으로, 'YYYY-MM-DD' 형식입니다." ,
},
"page": {
"유형": "정수",
"description": "결과를 페이지로 넘길 수 있습니다. 후속 쿼리에만 사용합니다. 기본값은 0(첫 페이지)입니다." 기본값은 0(첫 페이지)입니다.
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"required": ["start_date", "end_date", "page", "request_heartbeat"],
},
},
"conversation_search_date": {
"이름": "대화_검색_날짜",
"description": "날짜 범위를 사용하여 이전 대화 내역을 검색합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"start_date": {
"유형": "문자열",
"description": "검색할 날짜 범위의 시작일, 'YYYY-MM-DD' 형식입니다." ,
},
"end_date": {
"유형": "문자열",
"description": "검색할 날짜 범위의 끝으로, 'YYYY-MM-DD' 형식입니다." ,
},
"page": {
"유형": "정수",
"description": "결과를 페이지로 넘길 수 있습니다. 후속 쿼리에만 사용합니다. 기본값은 0(첫 페이지)입니다." 기본값은 0(첫 페이지)입니다.
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"required": ["start_date", "end_date", "request_heartbeat"],
},
},
"archival_memory_insert": {
"이름": "아카이브_메모리_인서트",
"description": "보관 메모리에 추가합니다. 나중에 쉽게 쿼리할 수 있도록 메모리 내용을 문구로 작성하세요.",
"매개변수": {
"유형": "객체",
"properties": {
"content": {
"유형": "문자열",
"description": "메모리에 기록할 콘텐츠. 모든 유니코드(이모티콘 포함)가 지원됩니다.",
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"required": ["content", "request_heartbeat"],
},
},
"archival_memory_search": {
"이름": "아카이브_메모리_검색",
"description": "시맨틱(임베딩 기반) 검색을 사용하여 아카이브 메모리를 검색합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"query": {
"유형": "문자열",
"description": "검색할 문자열입니다.",
},
"page": {
"유형": "정수",
"description": "결과를 페이지로 넘길 수 있습니다. 후속 쿼리에만 사용합니다. 기본값은 0(첫 페이지)입니다." 기본값은 0(첫 페이지)입니다.
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"필수": ["쿼리", "요청_하트비트"],
},
},
"read_from_text_file": {
"이름": "텍스트 파일에서 읽기",
"설명": "텍스트 파일에서 줄을 읽습니다.",
"매개변수": {
"유형": "객체",
"properties": {
"filename": {
"유형": "문자열",
"description": "읽을 파일의 이름입니다.",
},
"line_start": {
"유형": "정수",
"description": "읽기를 시작할 줄입니다.",
},
"num_lines": {
"유형": "정수",
"description": "읽을 줄 수(기본값은 1)." ,
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"required": ["filename", "line_start", "request_heartbeat"],
},
},
"append_to_text_file": {
"name": "append_to_text_file",
"설명": "텍스트 파일에 추가합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"filename": {
"유형": "문자열",
"description": "추가할 파일의 이름입니다.",
},
"content": {
"유형": "문자열",
"description": "파일에 추가할 콘텐츠입니다.",
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"필수": ["파일명", "콘텐츠", "요청_하트비트"],
},
},
"http_request": {
"이름": "http_request",
"description": "HTTP 요청을 생성하고 응답을 반환합니다.",
"매개변수": {
"유형": "객체",
"properties": {
"method": {
"유형": "문자열",
"description": "HTTP 메서드(예: 'GET', 'POST')." ,
},
"url": {
"유형": "문자열",
"description": "요청의 URL입니다.",
},
"payload_json": {
"유형": "문자열",
"description": "요청 페이로드를 나타내는 JSON 문자열입니다.",
},
"요청_하트비트": {
"유형": "부울".
"description": 함수_파라미터_설명_요청_심박수,
},
},
"required": ["method", "url", "request_heartbeat"],
},
},
}

 

요약

word_limit = 100
SYSTEM = f"""
여러분의 임무는 AI 페르소나와 사람 간의 대화에서 이전 메시지의 기록을 요약하는 것입니다.
제공되는 대화는 고정된 컨텍스트 창에서 제공되며 완전하지 않을 수 있습니다.
AI가 보낸 메시지에는 '어시스턴트' 역할이 표시되어 있습니다.
AI '어시스턴트'는 함수를 호출할 수도 있으며, 그 출력은 '함수' 역할이 있는 메시지에서 볼 수 있습니다.
AI가 메시지 콘텐츠에서 말하는 내용은 내면의 독백으로 간주되며 사용자에게는 표시되지 않습니다.
사용자가 볼 수 있는 유일한 AI 메시지는 AI가 'send_message'를 사용할 때의 메시지입니다.
사용자가 보내는 메시지는 '사용자' 역할에 속합니다.
'사용자' 역할은 로그인 이벤트 및 하트비트 이벤트와 같은 중요한 시스템 이벤트에도 사용됩니다(하트비트는 사용자 작업 없이 AI의 프로그램을 실행하여 사용자가 메시지를 보내지 않아도 AI가 작동할 수 있도록 합니다). (하트비트는 사용자 작업 없이 AI의 프로그램을 실행하여 메시지를 보내는 사용자의 프롬프트 없이도 AI가 작동할 수 있도록 합니다).
AI의 관점에서 대화에서 일어난 일을 요약합니다(일인칭 사용).
요약은 {WORD_LIMIT} 단어 미만으로 작성하고, 이 단어 제한을 초과하지 마세요.
요약만 출력하고 다른 내용은 출력에 포함하지 마세요.
"""

 

과외 보충제: 장기 기억을 기록하는 KG의 방법

프로젝트 주소: https://github.com/kingjulio8238/memary

MemGPT项目:在对话中保持长记忆

 

MemGPT项目:在对话中保持长记忆
© 저작권 정책

관련 문서

댓글 없음

댓글에 참여하려면 로그인해야 합니다!
지금 로그인
없음
댓글 없음...